Compare commits
3 Commits
main
...
huiyonggon
Author | SHA1 | Date |
---|---|---|
|
af0e5c8ea2 | |
|
f03b870d62 | |
|
3c9b6c76e3 |
|
@ -0,0 +1,455 @@
|
|||
"use client";
|
||||
import React, { useState, useEffect } from "react";
|
||||
import { getCookie } from "cookies-next";
|
||||
import { useRouter } from "next/navigation";
|
||||
import baseRequest from "@/utils/baseRequest";
|
||||
import { Toast, Modal } from "antd-mobile";
|
||||
import { generateSignature } from "@/utils/crypto";
|
||||
import { JSEncrypt } from "jsencrypt";
|
||||
|
||||
export default function Checkout() {
|
||||
const router = useRouter();
|
||||
|
||||
//查看主播实名认证情况、可提现钻石数量
|
||||
const [data, setData] = useState({});
|
||||
const getData = async () => {
|
||||
const mid = getCookie("mid");
|
||||
if (!mid) return;
|
||||
try {
|
||||
const base = baseRequest();
|
||||
//查实名认证情况
|
||||
const body = {
|
||||
...base,
|
||||
};
|
||||
const signature = generateSignature(body);
|
||||
const verificationResponse = await fetch(
|
||||
`/api/hvyogo/query_agree_state?signature=${signature}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
}
|
||||
);
|
||||
const verificationData = await verificationResponse.json();
|
||||
if (verificationData.ret === -1) {
|
||||
Toast.show({
|
||||
content: verificationData.msg,
|
||||
});
|
||||
}
|
||||
//查认证信息详情
|
||||
const body2 = {
|
||||
...base,
|
||||
};
|
||||
const signature2 = generateSignature(body2);
|
||||
const detailResponse = await fetch(
|
||||
`/api/hvyogo/worker_find_detail?signature=${signature2}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
}
|
||||
);
|
||||
const detailData = await detailResponse.json();
|
||||
if (detailData.ret === -1) {
|
||||
Toast.show({
|
||||
content: detailData.msg,
|
||||
});
|
||||
}
|
||||
//查可提现钻石数量
|
||||
const body3 = {
|
||||
...base,
|
||||
};
|
||||
const signature3 = generateSignature(body3);
|
||||
const withdrawalResponse = await fetch(
|
||||
`/api/vas/withdraw_page?signature=${signature3}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(body3),
|
||||
}
|
||||
);
|
||||
const withdrawalData = await withdrawalResponse.json();
|
||||
if (withdrawalData.ret === -1) {
|
||||
Toast.show({
|
||||
content: withdrawalData.msg,
|
||||
});
|
||||
return;
|
||||
}
|
||||
setData({
|
||||
verificationStatus: verificationData.data?.agree_state,
|
||||
detail: detailData.data,
|
||||
withdrawal_diamond: withdrawalData.data.withdraw_diamonds,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
};
|
||||
useEffect(() => {
|
||||
getData();
|
||||
}, []);
|
||||
|
||||
const [withdrawalNum, setWithdrawalNum] = useState("");
|
||||
const [receiptChannel, setReceiptChannel] = useState(10);
|
||||
const [alipayAccount, setAlipayAccount] = useState("");
|
||||
const [newBankCardNo, setNewBankCardNo] = useState("");
|
||||
|
||||
//这是提现钻石的数量
|
||||
const handleChangeWithdrawalNum = (e) => {
|
||||
let newValue = parseInt(e.target.value, 10);
|
||||
// 确保输入的值在最小值和最大值范围内
|
||||
if (
|
||||
newValue >= 0 &&
|
||||
newValue <= Math.min(data?.withdrawal_diamond, 200000)
|
||||
) {
|
||||
setWithdrawalNum(newValue);
|
||||
} else if (isNaN(newValue)) {
|
||||
setWithdrawalNum(0);
|
||||
} else if (newValue > Math.min(data?.withdrawal_diamond, 200000)) {
|
||||
setWithdrawalNum(Math.min(data?.withdrawal_diamond, 200000));
|
||||
}
|
||||
};
|
||||
|
||||
//点击提交申请按钮
|
||||
const handleSubmit = async () => {
|
||||
// if (!withdrawalNum || withdrawalNum < 1000) {
|
||||
// Toast.show({
|
||||
// content: "提现最低金额为100元(即1000钻石)",
|
||||
// });
|
||||
// return;
|
||||
// }
|
||||
if (receiptChannel === 20 && !alipayAccount) {
|
||||
Toast.show({
|
||||
content: "请填写支付宝账号",
|
||||
});
|
||||
return;
|
||||
}
|
||||
document.getElementById("comfirm_modal").showModal();
|
||||
};
|
||||
|
||||
//点击二次确认按钮
|
||||
const [errorMessage, setErrorMessage] = useState("");
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
const handleConfirm = async () => {
|
||||
try {
|
||||
setIsSubmitting(true);
|
||||
//对支付宝账号进行RSA加密
|
||||
const encrypt = new JSEncrypt();
|
||||
encrypt.setPublicKey(process.env.NEXT_PUBLIC_RSA_KEY);
|
||||
const encryptedAlipayAccount = encrypt.encrypt(alipayAccount);
|
||||
const base = baseRequest();
|
||||
const body =
|
||||
receiptChannel === 20
|
||||
? {
|
||||
receipt_channel: receiptChannel,
|
||||
worker_account: encryptedAlipayAccount,
|
||||
distribute_amount: (withdrawalNum * 10).toString(),
|
||||
...base,
|
||||
}
|
||||
: {
|
||||
distribute_amount: (withdrawalNum * 10).toString(),
|
||||
...base,
|
||||
};
|
||||
const signature = generateSignature(body);
|
||||
const applyResponse = await fetch(
|
||||
`/api/hvyogo/single_distribute?signature=${signature}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
}
|
||||
);
|
||||
const applyData = await applyResponse.json();
|
||||
if (applyData.ret === -1) {
|
||||
setErrorMessage(applyData.msg);
|
||||
setIsSubmitting(false);
|
||||
return;
|
||||
}
|
||||
router.push("/withdrawal/success");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
//修改银行卡账号
|
||||
const handleEditBankCardNo = async () => {
|
||||
try {
|
||||
setIsSubmitting(true);
|
||||
//对手机号和银行卡号进行rsa加密
|
||||
const encrypt = new JSEncrypt();
|
||||
encrypt.setPublicKey(process.env.NEXT_PUBLIC_RSA_KEY);
|
||||
const encryptedWorkerMobile = encrypt.encrypt(
|
||||
data?.detail?.worker_mobile
|
||||
);
|
||||
const encryptedBankCard = encrypt.encrypt(newBankCardNo);
|
||||
const base = baseRequest();
|
||||
const body = {
|
||||
worker_mobile: encryptedWorkerMobile,
|
||||
bank_card: encryptedBankCard,
|
||||
receipt_channel: 10,
|
||||
...base,
|
||||
};
|
||||
const signature = generateSignature(body);
|
||||
const _response = await fetch(
|
||||
`/api/hvyogo/worker_update?signature=${signature}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
}
|
||||
);
|
||||
const _data = await _response.json();
|
||||
if (_data.ret === -1) {
|
||||
setIsSubmitting(false);
|
||||
return;
|
||||
}
|
||||
await getData();
|
||||
document.getElementById("edit_bank_card_no_modal").close();
|
||||
Toast.show({
|
||||
content: _data.data.status_text,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<section className="container flex flex-col flex-1 p-4">
|
||||
<div className="flex flex-col items-center justify-around w-full h-32 rounded-2xl bg-gradient-to-r from-[#FF668B] to-[#FF66F0]">
|
||||
<p className="text-base text-white font-medium">可提现钻石:</p>
|
||||
<div className="flex flex-col items-center">
|
||||
<p className="text-2xl text-white font-medium">
|
||||
{data?.withdrawal_diamond}
|
||||
</p>
|
||||
<p className="text-xs text-white font-medium">
|
||||
(新入帐钻石需等待7日才能提现哦)
|
||||
</p>
|
||||
</div>
|
||||
<p className="text-base text-white font-medium">
|
||||
兑换比例:10钻石=1RMB
|
||||
</p>
|
||||
</div>
|
||||
<p className="text-white text-base mt-2">
|
||||
<span className="text-error">*</span>提现数量
|
||||
</p>
|
||||
{data?.verificationStatus !== 2 ? (
|
||||
<div className="btn btn-info text-white w-full">您还未通过实名认证</div>
|
||||
) : (
|
||||
<input
|
||||
type="number"
|
||||
placeholder={`可提现${data?.withdrawal_diamond}钻石`}
|
||||
value={withdrawalNum.toString()}
|
||||
onChange={handleChangeWithdrawalNum}
|
||||
className="input input-bordered input-md input-primary w-full mt-2"
|
||||
/>
|
||||
)}
|
||||
<p className="text-secondary text-base">
|
||||
预估实到金额:
|
||||
{withdrawalNum
|
||||
? ((withdrawalNum / 10) * 0.97).toFixed(2) + "元"
|
||||
: "自动计算"}
|
||||
</p>
|
||||
<p className="text-white text-base mt-2">
|
||||
<span className="text-error">*</span>提现方式
|
||||
</p>
|
||||
<div className="flex flex-col gap-2 mt-2">
|
||||
<div
|
||||
onClick={() => setReceiptChannel(10)}
|
||||
className={`${
|
||||
receiptChannel === 10 ? "border-primary" : "border-[#FFFFFF1A]"
|
||||
} border flex flex-row items-center justify-between cursor-pointer bg-[#FFFFFF1A] rounded-lg px-4 py-2`}
|
||||
>
|
||||
<div className="flex flex-row items-center">
|
||||
<svg viewBox="0 0 1024 1024" width="24" height="24">
|
||||
<path
|
||||
d="M426.688 650.688a32 32 0 0 0 0 64h64a32 32 0 1 0 0-64h-64zM586.624 682.688a32 32 0 0 1 32-32H768a32 32 0 1 1 0 64H618.624a32 32 0 0 1-32-32z"
|
||||
fill="#ffffff"
|
||||
></path>
|
||||
<path
|
||||
d="M578.048 138.688H445.952c-78.464 0-140.096 0-188.672 5.44-49.536 5.632-89.792 17.28-123.2 43.712-9.984 7.872-19.264 16.64-27.712 26.048-28.416 31.936-41.152 70.528-47.168 117.952-5.888 46.08-5.888 104.32-5.888 177.92v4.48c0 73.6 0 131.84 5.888 177.92 6.016 47.36 18.752 86.016 47.168 117.888 8.448 9.472 17.728 18.24 27.712 26.112 33.408 26.368 73.6 38.08 123.2 43.712 48.64 5.44 110.208 5.44 188.672 5.44h132.096c78.464 0 140.032 0 188.608-5.44 49.6-5.632 89.856-17.28 123.264-43.712 9.984-7.872 19.264-16.64 27.712-26.112 28.416-31.872 41.088-70.464 47.168-117.888 5.888-46.08 5.888-104.32 5.888-177.92v-4.48c0-73.6 0-131.84-5.888-177.92-6.08-47.36-18.752-86.016-47.168-117.952a218.56 218.56 0 0 0-27.712-26.048c-33.408-26.432-73.6-38.08-123.2-43.712-48.64-5.44-110.208-5.44-188.672-5.44zM173.76 238.08c20.096-15.936 46.72-25.344 90.752-30.336 44.544-5.056 102.528-5.12 183.488-5.12h128c80.896 0 138.88 0.064 183.488 5.12 44.032 4.992 70.656 14.4 90.752 30.336 7.104 5.568 13.696 11.776 19.584 18.432 16.512 18.56 26.24 42.752 31.488 83.456 0.512 3.84 0.96 7.872 1.344 12.032H121.344c0.384-4.16 0.832-8.128 1.344-12.032 5.184-40.704 14.976-64.96 31.424-83.456 5.952-6.656 12.544-12.8 19.648-18.432zM117.952 416h788.096c0.64 27.52 0.64 59.2 0.64 96 0 76.288-0.064 130.56-5.376 172.032-5.184 40.64-14.976 64.96-31.488 83.456-5.888 6.656-12.48 12.8-19.584 18.432-20.096 15.872-46.72 25.344-90.752 30.336-44.544 5.056-102.592 5.12-183.488 5.12H448c-80.96 0-138.944-0.128-183.488-5.12-44.032-4.992-70.656-14.464-90.752-30.336a154.56 154.56 0 0 1-19.648-18.432c-16.448-18.56-26.24-42.816-31.424-83.456-5.312-41.536-5.376-95.744-5.376-172.032 0-36.8 0-68.48 0.64-96z"
|
||||
fill="#ffffff"
|
||||
></path>
|
||||
</svg>
|
||||
<p className="text-white text-base font-medium ml-2">银行卡</p>
|
||||
<p className="text-secondary text-base font-medium">
|
||||
(
|
||||
{data?.detail?.bank_card_no?.replace(
|
||||
/(\d{4})\d+(\d{4})/,
|
||||
"$1****$2"
|
||||
)}
|
||||
)
|
||||
</p>
|
||||
</div>
|
||||
<p
|
||||
onClick={() =>
|
||||
document.getElementById("edit_bank_card_no_modal").showModal()
|
||||
}
|
||||
className="text-primary text-base font-medium cursor-pointer"
|
||||
>
|
||||
修改
|
||||
</p>
|
||||
</div>
|
||||
<div
|
||||
onClick={() => setReceiptChannel(20)}
|
||||
className={`${
|
||||
receiptChannel === 20 ? "border-primary" : "border-[#FFFFFF1A]"
|
||||
} border flex flex-row items-center cursor-pointer bg-[#FFFFFF1A] rounded-lg px-4 py-2`}
|
||||
>
|
||||
<svg viewBox="0 0 1024 1024" width="24" height="24">
|
||||
<path
|
||||
d="M906.666667 347.733333c-4.266667-10.666667-17.066667-17.066667-27.733334-10.666666-10.666667 4.266667-17.066667 17.066667-10.666666 27.733333 19.2 46.933333 29.866667 96 29.866666 147.2 0 51.2-10.666667 98.133333-27.733333 142.933333-40.533333-12.8-189.866667-57.6-226.133333-70.4 25.6-42.666667 46.933333-91.733333 59.733333-147.2h-145.066667v-49.066666h179.2v-29.866667h-179.2V277.333333H490.666667c-12.8 0-12.8 10.666667-12.8 10.666667v70.4h-168.533334v29.866667h168.533334v49.066666h-138.666667v27.733334h277.333333c-10.666667 34.133333-23.466667 66.133333-40.533333 96-61.866667-21.333333-98.133333-34.133333-174.933333-42.666667-145.066667-12.8-179.2 66.133333-185.6 113.066667-8.533333 74.666667 57.6 134.4 157.866666 134.4 98.133333 0 164.266667-44.8 228.266667-119.466667 64 29.866667 170.666667 81.066667 215.466667 102.4C742.4 838.4 633.6 896 512 896c-211.2 0-384-172.8-384-384S300.8 128 512 128c51.2 0 100.266667 10.666667 147.2 29.866667 10.666667 4.266667 23.466667 0 27.733333-10.666667 4.266667-10.666667 0-23.466667-10.666666-27.733333-51.2-21.333333-106.666667-32-164.266667-32C277.333333 85.333333 85.333333 277.333333 85.333333 512s192 426.666667 426.666667 426.666667 426.666667-192 426.666667-426.666667c0-57.6-10.666667-110.933333-32-164.266667zM360.533333 721.066667c-104.533333 0-121.6-66.133333-115.2-91.733334 6.4-27.733333 36.266667-61.866667 93.866667-61.866666 66.133333 0 125.866667 17.066667 198.4 51.2-51.2 64-113.066667 102.4-177.066667 102.4z"
|
||||
fill="#ffffff"
|
||||
></path>
|
||||
</svg>
|
||||
<p className="text-white text-base font-medium ml-2">支付宝</p>
|
||||
</div>
|
||||
{receiptChannel === 20 &&
|
||||
(data?.verificationStatus !== 2 ? (
|
||||
<div className="btn btn-info text-white w-full">
|
||||
您还未通过实名认证
|
||||
</div>
|
||||
) : (
|
||||
<input
|
||||
type="text"
|
||||
placeholder="请输入本人支付宝账号"
|
||||
value={alipayAccount}
|
||||
onChange={(e) => setAlipayAccount(e.target.value)}
|
||||
className="input input-bordered input-md input-primary w-full"
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-secondary text-base mt-16">注意事项:</p>
|
||||
<p className="text-secondary text-sm">
|
||||
1.需实名认证并绑定收款方式后方可提现;
|
||||
</p>
|
||||
<p className="text-secondary text-sm">
|
||||
2.平台将收取提现金额的3%作为提现手续费用,该笔费用将用于为收款人缴纳相关税费;
|
||||
</p>
|
||||
<p className="text-secondary text-sm">
|
||||
3.收款账户需与实名认证本人保持一致;
|
||||
</p>
|
||||
<p className="text-secondary text-sm">
|
||||
4.单笔最低提现金额为100元(即1,000钻石),单月最高提现金额为95,000元(即950,000钻石);
|
||||
</p>
|
||||
<p className="text-secondary text-sm">
|
||||
5.自助提现渠道每日只能提现一次,若有更多提现需求,请联系客服。
|
||||
</p>
|
||||
<button
|
||||
onClick={handleSubmit}
|
||||
className="btn btn-md btn-primary text-white rounded-full w-full mb-4 mt-4"
|
||||
>
|
||||
提交申请
|
||||
</button>
|
||||
{/* 修改银行卡 */}
|
||||
<dialog id="edit_bank_card_no_modal" className="modal">
|
||||
<div className="modal-box bg-[#17161A]">
|
||||
<p className="text-white text-base font-medium ml-2">
|
||||
原银行卡:
|
||||
{data?.detail?.bank_card_no?.replace(
|
||||
/(\d{4})\d+(\d{4})/,
|
||||
"$1****$2"
|
||||
)}
|
||||
</p>
|
||||
<div className="flex flex-row items-center mt-2">
|
||||
<p className="text-white text-base font-medium ml-2">新银行卡:</p>
|
||||
<input
|
||||
type="text"
|
||||
placeholder="请输入本人银行卡账号"
|
||||
value={newBankCardNo}
|
||||
onChange={(e) => setNewBankCardNo(e.target.value)}
|
||||
className="input input-bordered input-sm input-primary"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col mt-4">
|
||||
<button
|
||||
disabled={isSubmitting}
|
||||
onClick={handleEditBankCardNo}
|
||||
className="flex items-center justify-center bg-[#FF669E] rounded-lg py-2"
|
||||
>
|
||||
{isSubmitting && (
|
||||
<span className="loading loading-spinner"></span>
|
||||
)}
|
||||
{isSubmitting ? "提交中..." : "确认提交"}
|
||||
</button>
|
||||
<form method="dialog" className="flex mt-2">
|
||||
<button className="flex flex-row flex-1 items-center justify-center border border-secondary rounded-lg py-2">
|
||||
<p className="text-secondary text-base ml-1">返回</p>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
{/* 确认提现 */}
|
||||
<dialog id="comfirm_modal" className="modal">
|
||||
<div className="modal-box bg-[#17161A]">
|
||||
<p className="text-white text-base font-medium">
|
||||
提现钻石:
|
||||
<span className="text-secondary">{withdrawalNum}</span>
|
||||
</p>
|
||||
<p className="text-white text-base font-medium">
|
||||
预估实到金额:
|
||||
<span className="text-secondary">
|
||||
¥{((withdrawalNum / 10) * 0.97).toFixed(2)}
|
||||
</span>
|
||||
</p>
|
||||
<p className="text-white text-base font-medium">
|
||||
收款人姓名:
|
||||
<span className="text-secondary">{data?.detail?.worker_name}</span>
|
||||
</p>
|
||||
<p className="text-white text-base font-medium">
|
||||
收款渠道:
|
||||
<span className="text-secondary">
|
||||
{receiptChannel === 10 ? "银行卡" : "支付宝"}
|
||||
</span>
|
||||
</p>
|
||||
<p className="text-white text-base font-medium">
|
||||
收款账号:
|
||||
<span className="text-secondary">
|
||||
{receiptChannel === 10
|
||||
? data?.detail?.bank_card_no?.replace(
|
||||
/(\d{4})\d+(\d{4})/,
|
||||
"$1****$2"
|
||||
)
|
||||
: alipayAccount}
|
||||
</span>
|
||||
</p>
|
||||
{errorMessage && (
|
||||
<p className="text-error text-base font-medium mt-2">
|
||||
提现失败:{errorMessage}
|
||||
</p>
|
||||
)}
|
||||
<div className="flex flex-col mt-4">
|
||||
<button
|
||||
disabled={isSubmitting}
|
||||
onClick={handleConfirm}
|
||||
className="flex items-center justify-center bg-[#FF669E] rounded-lg py-2"
|
||||
>
|
||||
{isSubmitting && (
|
||||
<span className="loading loading-spinner"></span>
|
||||
)}
|
||||
{isSubmitting ? "提交中..." : "确认提交"}
|
||||
</button>
|
||||
<form method="dialog" className="flex mt-2">
|
||||
<button className="flex flex-row flex-1 items-center justify-center border border-secondary rounded-lg py-2">
|
||||
<p className="text-secondary text-base ml-1">返回修改</p>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
</section>
|
||||
);
|
||||
}
|
|
@ -3,13 +3,9 @@ import React, { useState, useEffect } from "react";
|
|||
import { useSearchParams } from "next/navigation";
|
||||
import { setCookie, getCookie } from "cookies-next";
|
||||
import { useRouter } from "next/navigation";
|
||||
import { Checkbox } from "antd-mobile";
|
||||
import Link from "next/link";
|
||||
import baseRequest from "@/utils/baseRequest";
|
||||
import Divider from "@/components/Divider";
|
||||
import { Toast } from "antd-mobile";
|
||||
import { generateSignature } from "@/utils/crypto";
|
||||
import { JSEncrypt } from "jsencrypt";
|
||||
|
||||
export default function WithDrawal() {
|
||||
const router = useRouter();
|
||||
|
@ -28,7 +24,7 @@ export default function WithDrawal() {
|
|||
}
|
||||
}, [mid, token, mobile_phone]);
|
||||
|
||||
//查看主播实名认证情况
|
||||
//查看主播实名认证情况和可提现数额
|
||||
const [data, setData] = useState({});
|
||||
useEffect(() => {
|
||||
const getData = async () => {
|
||||
|
@ -36,21 +32,18 @@ export default function WithDrawal() {
|
|||
if (!mid) return;
|
||||
try {
|
||||
const base = baseRequest();
|
||||
const signature = generateSignature({
|
||||
mid: parseInt(mid, 10),
|
||||
const body = {
|
||||
...base,
|
||||
});
|
||||
};
|
||||
const signature = generateSignature(body);
|
||||
const verificationResponse = await fetch(
|
||||
`/api/realname_authentication/list_by_mid?signature=${signature}`,
|
||||
`/api/hvyogo/query_agree_state?signature=${signature}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
mid: parseInt(mid, 10),
|
||||
...base,
|
||||
}),
|
||||
body: JSON.stringify(body),
|
||||
}
|
||||
);
|
||||
const verificationData = await verificationResponse.json();
|
||||
|
@ -82,12 +75,9 @@ export default function WithDrawal() {
|
|||
return;
|
||||
}
|
||||
setData({
|
||||
verificationStatus:
|
||||
verificationData.data?.realname_authentication_api_vo?.status,
|
||||
verificationStatus: verificationData.data?.agree_state,
|
||||
withdrawal_diamond: withdrawalData.data.withdraw_diamonds,
|
||||
day7_total_diamonds: withdrawalData.data.day7_total_diamonds,
|
||||
day7_total_withdraw_diamonds:
|
||||
withdrawalData.data.day7_total_withdraw_diamonds,
|
||||
diamonds: withdrawalData.data.diamonds,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
|
@ -96,356 +86,62 @@ export default function WithDrawal() {
|
|||
getData();
|
||||
}, []);
|
||||
|
||||
const [withdrawalNum, setWithdrawalNum] = useState("");
|
||||
const [alipayAccount, setAlipayAccount] = useState("");
|
||||
const [payee, setPayee] = useState("");
|
||||
const [maskedMobilePhone, setMaskedMobilePhone] = useState("");
|
||||
const [veriCode, setVeriCode] = useState("");
|
||||
|
||||
//设置checkbox
|
||||
const [checked, setChecked] = useState(false);
|
||||
|
||||
//从cookie中读取mobile_phone并做脱敏处理
|
||||
useEffect(() => {
|
||||
const mobilePhoneCache = getCookie("mobile_phone");
|
||||
const maskedNumber = mobilePhoneCache?.replace(
|
||||
/(\d{3})\d{4}(\d{4})/,
|
||||
"$1****$2"
|
||||
);
|
||||
setMaskedMobilePhone(maskedNumber);
|
||||
}, []);
|
||||
|
||||
//这是提现钻石的数量
|
||||
const handleChangeWithdrawalNum = (e) => {
|
||||
let newValue = parseInt(e.target.value, 10);
|
||||
// 确保输入的值在最小值和最大值范围内
|
||||
if (
|
||||
newValue >= 0 &&
|
||||
newValue <= Math.min(data?.withdrawal_diamond, 200000)
|
||||
) {
|
||||
setWithdrawalNum(newValue);
|
||||
} else if (isNaN(newValue)) {
|
||||
setWithdrawalNum(0);
|
||||
} else if (newValue > Math.min(data?.withdrawal_diamond, 200000)) {
|
||||
setWithdrawalNum(Math.min(data?.withdrawal_diamond, 200000));
|
||||
}
|
||||
};
|
||||
|
||||
//重新获取验证码的计时器
|
||||
const [isCounting, setIsCounting] = useState(false);
|
||||
const [seconds, setSeconds] = useState(60);
|
||||
useEffect(() => {
|
||||
let interval;
|
||||
if (isCounting && seconds > 0) {
|
||||
interval = setInterval(() => {
|
||||
setSeconds(seconds - 1);
|
||||
}, 1000);
|
||||
} else {
|
||||
setIsCounting(false);
|
||||
setSeconds(60);
|
||||
clearInterval(interval);
|
||||
}
|
||||
return () => {
|
||||
clearInterval(interval);
|
||||
};
|
||||
}, [isCounting, seconds]);
|
||||
|
||||
//点击获取验证码
|
||||
const handleVerification = async () => {
|
||||
//开始倒计时
|
||||
setIsCounting(true);
|
||||
//发送短信验证码
|
||||
const base = baseRequest();
|
||||
const signature = generateSignature({
|
||||
...base,
|
||||
});
|
||||
try {
|
||||
await fetch(`/api/vas/withdraw_send_verifycode?signature=${signature}`, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...base,
|
||||
}),
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
};
|
||||
|
||||
//点击提交申请按钮
|
||||
const handleSubmit = async () => {
|
||||
if (!withdrawalNum || withdrawalNum < 1000) {
|
||||
Toast.show({
|
||||
content: "提现最低金额为100元(即1000钻石)",
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (!alipayAccount || !payee) {
|
||||
Toast.show({
|
||||
content: "请完善收款信息",
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (!veriCode) {
|
||||
Toast.show({
|
||||
content: "请输入验证码",
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (!checked) {
|
||||
Toast.show({
|
||||
content: "请先同意《用户提现协议》",
|
||||
});
|
||||
return;
|
||||
}
|
||||
document.getElementById("comfirm_modal").showModal();
|
||||
};
|
||||
|
||||
//点击二次确认按钮
|
||||
const [errorMessage, setErrorMessage] = useState("");
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
const handleConfirm = async () => {
|
||||
try {
|
||||
setIsSubmitting(true);
|
||||
//对支付宝账号和真实姓名进行RSA加密
|
||||
const encrypt = new JSEncrypt();
|
||||
encrypt.setPublicKey(process.env.NEXT_PUBLIC_WITHDRAW_RSA_KEY);
|
||||
const auth_alipay_id = encrypt.encrypt(alipayAccount);
|
||||
const auth_alipay_name = encrypt.encrypt(payee);
|
||||
const base = baseRequest();
|
||||
const signature = generateSignature({
|
||||
diamonds: parseInt(withdrawalNum, 10),
|
||||
auth_alipay_id: auth_alipay_id,
|
||||
auth_alipay_name: auth_alipay_name,
|
||||
verify_code: veriCode,
|
||||
...base,
|
||||
});
|
||||
const applyResponse = await fetch(
|
||||
`/api/vas/withdraw_apply?signature=${signature}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
diamonds: parseInt(withdrawalNum, 10),
|
||||
auth_alipay_id: auth_alipay_id,
|
||||
auth_alipay_name: auth_alipay_name,
|
||||
verify_code: veriCode,
|
||||
...base,
|
||||
}),
|
||||
}
|
||||
);
|
||||
const applyData = await applyResponse.json();
|
||||
if (applyData.ret === -1) {
|
||||
setErrorMessage(applyData.msg);
|
||||
setIsSubmitting(false);
|
||||
return;
|
||||
}
|
||||
router.push("/withdrawal/success");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
//跳转实名认证
|
||||
const handleVerify = () => {
|
||||
const token = getCookie("token");
|
||||
const huiYongGongUrl = `https://h5-channel.hvyogo.com/?channel=CDLX&token=${token}`;
|
||||
router.push(huiYongGongUrl);
|
||||
};
|
||||
|
||||
return (
|
||||
<section className="container flex flex-col flex-1 p-4">
|
||||
<div className="flex flex-col items-center justify-around w-full h-32 rounded-2xl bg-gradient-to-r from-[#FF668B] to-[#FF66F0]">
|
||||
<p className="text-base text-white font-medium">可提现钻石:</p>
|
||||
<div className="flex flex-col items-center">
|
||||
<p className="text-2xl text-white font-medium">
|
||||
<div className="flex flex-row justify-between items-center bg-[#FFFFFF1A] rounded-2xl p-4">
|
||||
<p className="text-secondary text-base font-medium">
|
||||
可提现钻石:
|
||||
<span className="text-white text-xl font-medium">
|
||||
{data?.withdrawal_diamond}
|
||||
</p>
|
||||
<p className="text-xs text-white font-medium">
|
||||
(新入帐钻石需等待7日才能提现哦)
|
||||
</p>
|
||||
</div>
|
||||
<p className="text-base text-white font-medium">
|
||||
兑换比例:10钻石=1RMB
|
||||
</span>
|
||||
</p>
|
||||
{data?.verificationStatus === 2 ? (
|
||||
<button
|
||||
onClick={() => router.push("/withdrawal/checkout")}
|
||||
className="btn btn-sm btn-primary text-white rounded-full"
|
||||
>
|
||||
提现
|
||||
</button>
|
||||
) : (
|
||||
<button
|
||||
onClick={handleVerify}
|
||||
className="btn btn-sm btn-primary text-white rounded-full"
|
||||
>
|
||||
实名认证
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex flex-row justify-between items-center bg-[#FFFFFF1A] rounded-2xl p-4 my-4">
|
||||
<p className="text-secondary text-base font-medium">
|
||||
钻石总额:
|
||||
<span className="text-white text-xl font-medium">
|
||||
{data?.diamonds}
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-col mt-2 items-center justify-around w-full h-12 rounded-2xl bg-gradient-to-r from-[#FF668B] to-[#FF66F0]">
|
||||
<p className="text-sm text-white font-medium">7日前(0~24点)数据</p>
|
||||
<div className="flex flex-row justify-around w-full">
|
||||
<p className="text-xs text-white font-medium">
|
||||
当日钻石收益:{data?.day7_total_diamonds}
|
||||
</p>
|
||||
<p className="text-xs text-white font-medium">
|
||||
今日此时已结算:{data?.day7_total_withdraw_diamonds}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-white text-base mt-2">
|
||||
<span className="text-error">*</span>提现数量
|
||||
<p className="text-secondary text-base mt-2">注意事项:</p>
|
||||
<p className="text-secondary text-sm">
|
||||
1.需实名认证并绑定收款方式后方可提现;
|
||||
</p>
|
||||
<input
|
||||
type="number"
|
||||
placeholder={`可提现${data?.withdrawal_diamond}钻石`}
|
||||
value={withdrawalNum.toString()}
|
||||
onChange={handleChangeWithdrawalNum}
|
||||
className="input input-bordered input-md input-primary w-full"
|
||||
/>
|
||||
<p className="text-secondary text-base">
|
||||
预计提现金额:{withdrawalNum ? withdrawalNum / 10 + "元" : "自动计算"}
|
||||
<p className="text-secondary text-sm">
|
||||
2.平台将收取提现金额的3%作为提现手续费用,该笔费用将用于为收款人缴纳相关税费;
|
||||
</p>
|
||||
<p className="text-white text-base mt-2">
|
||||
<span className="text-error">*</span>支付宝账号
|
||||
<p className="text-secondary text-sm">
|
||||
3.收款账户需与实名认证本人保持一致;
|
||||
</p>
|
||||
{data?.verificationStatus === 0 ? (
|
||||
<input
|
||||
type="text"
|
||||
placeholder="请输入本人支付宝账号"
|
||||
value={alipayAccount}
|
||||
onChange={(e) => setAlipayAccount(e.target.value)}
|
||||
className="input input-bordered input-md input-primary w-full"
|
||||
/>
|
||||
) : (
|
||||
<button
|
||||
onClick={() => router.push("/verification")}
|
||||
className="btn btn-info text-white w-full"
|
||||
>
|
||||
{data?.verificationStatus === 1
|
||||
? "您已提交实名认证,请等待审核"
|
||||
: "您还未通过实名认证,请点击此处进行认证"}
|
||||
</button>
|
||||
)}
|
||||
<p className="text-white text-base mt-2">
|
||||
<span className="text-error">*</span>收款人姓名
|
||||
<p className="text-secondary text-sm">
|
||||
4.单笔最低提现金额为100元(即1,000钻石),单月最高提现金额为95,000元(即950,000钻石);
|
||||
</p>
|
||||
{data?.verificationStatus === 0 ? (
|
||||
<input
|
||||
type="text"
|
||||
placeholder="请输入收款人姓名"
|
||||
value={payee}
|
||||
onChange={(e) => setPayee(e.target.value)}
|
||||
className="input input-bordered input-md input-primary w-full"
|
||||
/>
|
||||
) : (
|
||||
<button
|
||||
onClick={() => router.push("/verification")}
|
||||
className="btn btn-info text-white w-full"
|
||||
>
|
||||
{data?.verificationStatus === 1
|
||||
? "您已提交实名认证,请等待审核"
|
||||
: "您还未通过实名认证,请点击此处进行认证"}
|
||||
</button>
|
||||
)}
|
||||
<p className="text-white text-base mt-2">
|
||||
<span className="text-error">*</span>绑定手机
|
||||
<p className="text-secondary text-sm">
|
||||
5.自助提现渠道每日只能提现一次,若有更多提现需求,请联系客服。
|
||||
</p>
|
||||
<p className="text-secondary text-base">{maskedMobilePhone}</p>
|
||||
<p className="text-white text-base mt-2">
|
||||
<span className="text-error">*</span>验证码
|
||||
</p>
|
||||
{data?.verificationStatus === 0 ? (
|
||||
<div className="flex flex-row">
|
||||
<input
|
||||
type="number"
|
||||
placeholder="请输入正确验证码"
|
||||
value={veriCode}
|
||||
onChange={(e) => setVeriCode(e.target.value)}
|
||||
className="input input-bordered input-md input-primary w-full"
|
||||
/>
|
||||
<button
|
||||
disabled={isCounting}
|
||||
onClick={handleVerification}
|
||||
className="btn btn-primary text-white ml-2"
|
||||
>
|
||||
{isCounting ? `(${seconds})重新发送` : "获取验证码"}
|
||||
</button>
|
||||
</div>
|
||||
) : (
|
||||
<button
|
||||
onClick={() => router.push("/verification")}
|
||||
className="btn btn-info text-white w-full"
|
||||
>
|
||||
{data?.verificationStatus === 1
|
||||
? "您已提交实名认证,请等待审核"
|
||||
: "您还未通过实名认证,请点击此处进行认证"}
|
||||
</button>
|
||||
)}
|
||||
<div className="flex justify-center mt-8 mb-4">
|
||||
<Checkbox
|
||||
style={{
|
||||
"--icon-size": "18px",
|
||||
"--font-size": "14px",
|
||||
"--gap": "6px",
|
||||
}}
|
||||
checked={checked}
|
||||
onChange={() => setChecked(!checked)}
|
||||
>
|
||||
<p className="text-gray-400 text-sm">
|
||||
同意
|
||||
<Link className="link text-primary" href="/doc/withdrawalagreement">
|
||||
《用户提现协议》
|
||||
</Link>
|
||||
</p>
|
||||
</Checkbox>
|
||||
</div>
|
||||
<button
|
||||
onClick={handleSubmit}
|
||||
className="btn btn-md btn-primary text-white rounded-full w-full mb-4"
|
||||
>
|
||||
提交申请
|
||||
</button>
|
||||
<Divider />
|
||||
<p className="text-error text-base mt-2">注意事项:</p>
|
||||
<p className="text-error text-sm">
|
||||
1.需实名认证后方可提现,详情请点击
|
||||
<Link className="link text-info" href="/verification">
|
||||
“实名认证”
|
||||
</Link>
|
||||
;
|
||||
</p>
|
||||
<p className="text-error text-sm">
|
||||
2.请确保输入信息准确无误,并且支付宝收款人与实名认证本人保持一致,以防提现失败,由输入错误带来的损失与平台方无关;
|
||||
</p>
|
||||
<p className="text-error text-sm">
|
||||
3.单笔最低提现金额为100元(即1000钻石),若提现金额大于20000元(即200000钻石)请联系客服;
|
||||
</p>
|
||||
<p className="text-error text-sm">
|
||||
4.自助提现渠道每日只能提现一次,若有更多提现需求,请联系客服。
|
||||
</p>
|
||||
<dialog id="comfirm_modal" className="modal">
|
||||
<div className="modal-box bg-[#17161A]">
|
||||
<p className="text-white text-base font-medium">
|
||||
提现金额:
|
||||
<span className="text-secondary">¥{withdrawalNum / 10}</span>
|
||||
</p>
|
||||
<p className="text-white text-base font-medium">
|
||||
收款人姓名:<span className="text-secondary">{payee}</span>
|
||||
</p>
|
||||
<p className="text-white text-base font-medium">
|
||||
收款支付宝:<span className="text-secondary">{alipayAccount}</span>
|
||||
</p>
|
||||
{errorMessage && (
|
||||
<p className="text-error text-base font-medium mt-2">
|
||||
提现失败:{errorMessage}
|
||||
</p>
|
||||
)}
|
||||
<div className="flex flex-col mt-4">
|
||||
<button
|
||||
disabled={isSubmitting}
|
||||
onClick={handleConfirm}
|
||||
className="flex items-center justify-center bg-[#FF669E] rounded-lg py-2"
|
||||
>
|
||||
{isSubmitting && (
|
||||
<span className="loading loading-spinner"></span>
|
||||
)}
|
||||
{isSubmitting ? "提交中..." : "确认提交"}
|
||||
</button>
|
||||
<form method="dialog" className="flex mt-2">
|
||||
<button className="flex flex-row flex-1 items-center justify-center border border-secondary rounded-lg py-2">
|
||||
<p className="text-secondary text-base ml-1">返回修改</p>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ export default function Success() {
|
|||
></path>
|
||||
</svg>
|
||||
<p className="text-center text-white text-base font-medium mx-4 mt-4">
|
||||
已为您提交提现申请,提现款项将在24内到账,若未及时到账请联系客服处理。
|
||||
已为您提交提现申请,提现款项将在24小时内到账,若未及时到账请联系客服处理。
|
||||
</p>
|
||||
<button
|
||||
onClick={() => router.push("/withdrawal")}
|
||||
|
|
Loading…
Reference in New Issue