303 lines
18 KiB
JavaScript
303 lines
18 KiB
JavaScript
"use client";
|
||
import React, { useState } from "react";
|
||
import { Toast } from "antd-mobile";
|
||
import { uploadImage } from "@/utils/upload";
|
||
import { getCookie } from "cookies-next";
|
||
import baseRequest from "@/utils/baseRequest";
|
||
import { JSEncrypt } from "jsencrypt";
|
||
import { useRouter } from "next/navigation";
|
||
import { generateSignature } from "@/utils/crypto";
|
||
import Image from "next/image";
|
||
import verification_water_mark from "@/public/images/verification_water_mark.png";
|
||
|
||
export default function Verification() {
|
||
const router = useRouter();
|
||
|
||
const [idNumber, setIdNumber] = useState("");
|
||
const [realName, setRealName] = useState("");
|
||
const [idCardFront, setIdCardFront] = useState();
|
||
const [idCardBack, setIdCardBack] = useState();
|
||
const [handleIdCard, setHandleIdCard] = useState();
|
||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||
|
||
const handleSubmit = async (e) => {
|
||
e.preventDefault();
|
||
if (
|
||
!idNumber ||
|
||
!realName ||
|
||
!idCardFront ||
|
||
!idCardBack ||
|
||
!handleIdCard
|
||
) {
|
||
Toast.show({ content: "请完善信息后提交" });
|
||
return;
|
||
}
|
||
if (idNumber.length !== 18) {
|
||
Toast.show({ content: "身份证位数不正确" });
|
||
return;
|
||
}
|
||
const mid = getCookie("mid");
|
||
const token = getCookie("token");
|
||
if (!mid || !token) {
|
||
Toast.show({ content: "身份验证失败,请联系客服提现" });
|
||
return;
|
||
}
|
||
setIsSubmitting(true);
|
||
const idCardFrontSrcId = await uploadImage(idCardFront);
|
||
const idCardBackSrcId = await uploadImage(idCardBack);
|
||
const handleIdCardSrcId = await uploadImage(handleIdCard);
|
||
|
||
//提交数据
|
||
try {
|
||
const base = baseRequest();
|
||
//对手机号进行RSA加密
|
||
const encrypt = new JSEncrypt();
|
||
encrypt.setPublicKey(process.env.NEXT_PUBLIC_RSA_KEY);
|
||
const encrypted_real_name = encrypt.encrypt(realName);
|
||
const encrypted_ID_no = encrypt.encrypt(idNumber);
|
||
const signature = generateSignature({
|
||
mid: parseInt(mid, 10),
|
||
real_name: encrypted_real_name,
|
||
ID_no: encrypted_ID_no,
|
||
ID_card_photos: { image_ids: [idCardFrontSrcId, idCardBackSrcId] },
|
||
full_face_photo_with_ID_card_in_hand: {
|
||
image_ids: [handleIdCardSrcId],
|
||
},
|
||
...base,
|
||
b_mid: parseInt(mid, 10),
|
||
});
|
||
const detailResponse = await fetch(
|
||
`/api/realname_authentication/create?signature=${signature}`,
|
||
{
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
body: JSON.stringify({
|
||
mid: parseInt(mid, 10),
|
||
real_name: encrypted_real_name,
|
||
ID_no: encrypted_ID_no,
|
||
ID_card_photos: { image_ids: [idCardFrontSrcId, idCardBackSrcId] },
|
||
full_face_photo_with_ID_card_in_hand: {
|
||
image_ids: [handleIdCardSrcId],
|
||
},
|
||
...base,
|
||
b_mid: parseInt(mid, 10),
|
||
}),
|
||
}
|
||
);
|
||
const detailData = await detailResponse.json();
|
||
if (detailData.ret === -1) {
|
||
Toast.show({
|
||
content: detailData.msg,
|
||
});
|
||
return;
|
||
}
|
||
Toast.show({
|
||
content: "提交成功,请耐心等待审核",
|
||
});
|
||
router.back();
|
||
} catch (error) {
|
||
console.error(error);
|
||
} finally {
|
||
setIsSubmitting(false);
|
||
}
|
||
};
|
||
|
||
return (
|
||
<section className="container flex flex-col flex-1 items-center p-4">
|
||
<form
|
||
onSubmit={handleSubmit}
|
||
className="flex flex-col flex-1 w-full max-w-sm"
|
||
>
|
||
<p className="text-white text-base mt-2">
|
||
<span className="text-error">*</span>真实姓名:
|
||
</p>
|
||
<input
|
||
type="text"
|
||
name="realName"
|
||
placeholder="请输入您的姓名"
|
||
value={realName}
|
||
onChange={(e) => setRealName(e.target.value)}
|
||
className="input input-bordered input-md input-primary w-full max-w-sm"
|
||
/>
|
||
<p className="text-white text-base mt-2">
|
||
<span className="text-error">*</span>身份证号:
|
||
</p>
|
||
<input
|
||
name="idNumber"
|
||
placeholder="请输入您的身份证号"
|
||
value={idNumber}
|
||
onChange={(e) => setIdNumber(e.target.value)}
|
||
className="input input-bordered input-md input-primary w-full max-w-sm"
|
||
/>
|
||
<p className="text-white text-base mt-2">
|
||
<span className="text-error">*</span>身份证照片:
|
||
</p>
|
||
<div className="flex flex-row gap-4">
|
||
<label
|
||
htmlFor="idCardFront"
|
||
className="basis-1/2 aspect-[214/135] rounded-xl overflow-hidden relative"
|
||
>
|
||
{idCardFront ? (
|
||
<div className="relative w-full h-full">
|
||
<Image
|
||
className="w-full object-cover"
|
||
src={URL.createObjectURL(idCardFront)}
|
||
fill
|
||
alt=""
|
||
/>
|
||
<Image
|
||
className="w-full h-full object-cover absolute top-0 left-0 bg-black/50"
|
||
src={verification_water_mark}
|
||
alt=""
|
||
/>
|
||
</div>
|
||
) : (
|
||
<div className="flex justify-center items-center w-full h-full bg-[#FFFFFF1A]">
|
||
<svg viewBox="0 0 1024 1024" width="150" height="150">
|
||
<path
|
||
d="M361.50303 474.763636c-48.09697 0-88.436364-38.787879-88.436363-88.436363s38.787879-88.436364 88.436363-88.436364 88.436364 38.787879 88.436364 88.436364-40.339394 88.436364-88.436364 88.436363z m0-145.842424c-31.030303 0-57.406061 24.824242-57.40606 57.406061 0 31.030303 24.824242 57.406061 57.40606 57.40606S418.909091 418.909091 418.909091 386.327273c-1.551515-31.030303-26.375758-57.406061-57.406061-57.406061z"
|
||
fill="#FFFFFF26"
|
||
></path>
|
||
<path
|
||
d="M263.757576 553.890909h-4.654546c-7.757576-3.10303-12.412121-10.860606-10.860606-20.169697 15.515152-49.648485 63.612121-85.333333 116.363637-85.333333 52.751515 0 100.848485 35.684848 116.363636 85.333333 3.10303 7.757576-1.551515 17.066667-10.860606 20.169697-7.757576 3.10303-17.066667-1.551515-20.169697-10.860606-12.412121-37.236364-46.545455-63.612121-86.884849-63.612121-38.787879 0-74.472727 26.375758-86.884848 63.612121 0 6.206061-6.206061 10.860606-12.412121 10.860606zM754.036364 631.466667H260.654545c-9.309091 0-15.515152-6.206061-15.515151-15.515152s6.206061-15.515152 15.515151-15.515151h493.381819c9.309091 0 15.515152 6.206061 15.515151 15.515151s-6.206061 15.515152-15.515151 15.515152zM754.036364 710.593939H260.654545c-9.309091 0-15.515152-6.206061-15.515151-15.515151s6.206061-15.515152 15.515151-15.515152h493.381819c9.309091 0 15.515152 6.206061 15.515151 15.515152s-6.206061 15.515152-15.515151 15.515151zM754.036364 451.490909H595.781818c-9.309091 0-15.515152-6.206061-15.515151-15.515151s6.206061-15.515152 15.515151-15.515152h158.254546c9.309091 0 15.515152 6.206061 15.515151 15.515152s-6.206061 15.515152-15.515151 15.515151zM754.036364 530.618182H595.781818c-9.309091 0-15.515152-6.206061-15.515151-15.515152s6.206061-15.515152 15.515151-15.515151h158.254546c9.309091 0 15.515152 6.206061 15.515151 15.515151s-6.206061 15.515152-15.515151 15.515152zM754.036364 370.812121H595.781818c-9.309091 0-15.515152-6.206061-15.515151-15.515151s6.206061-15.515152 15.515151-15.515152h158.254546c9.309091 0 15.515152 6.206061 15.515151 15.515152s-6.206061 15.515152-15.515151 15.515151z"
|
||
fill="#FFFFFF26"
|
||
></path>
|
||
<path
|
||
d="M822.30303 808.339394H201.69697c-26.375758 0-46.545455-20.169697-46.545455-46.545455V263.757576c0-26.375758 20.169697-46.545455 46.545455-46.545455h620.60606c26.375758 0 46.545455 20.169697 46.545455 46.545455v498.036363c0 24.824242-20.169697 46.545455-46.545455 46.545455zM201.69697 248.242424c-9.309091 0-15.515152 6.206061-15.515152 15.515152v498.036363c0 9.309091 6.206061 15.515152 15.515152 15.515152h620.60606c9.309091 0 15.515152-6.206061 15.515152-15.515152V263.757576c0-9.309091-6.206061-15.515152-15.515152-15.515152H201.69697z"
|
||
fill="#FFFFFF26"
|
||
></path>
|
||
</svg>
|
||
</div>
|
||
)}
|
||
<input
|
||
type="file"
|
||
id="idCardFront"
|
||
name="idCardFront"
|
||
accept="image/*"
|
||
onChange={(e) => setIdCardFront(e.target.files[0])}
|
||
className="w-full h-full opacity-0 cursor-pointer absolute top-0 left-0"
|
||
/>
|
||
</label>
|
||
<label
|
||
htmlFor="idCardBack"
|
||
className="basis-1/2 aspect-[214/135] rounded-xl overflow-hidden relative"
|
||
>
|
||
{idCardBack ? (
|
||
<div className="relative w-full h-full">
|
||
<Image
|
||
className="w-full object-cover"
|
||
src={URL.createObjectURL(idCardBack)}
|
||
fill
|
||
alt=""
|
||
/>
|
||
<Image
|
||
className="w-full h-full object-cover absolute top-0 left-0 bg-black/50"
|
||
src={verification_water_mark}
|
||
alt=""
|
||
/>
|
||
</div>
|
||
) : (
|
||
<div className="flex justify-center items-center w-full h-full bg-[#FFFFFF1A]">
|
||
<svg viewBox="0 0 1024 1024" width="150" height="150">
|
||
<path
|
||
d="M341.333333 513.551515c-48.09697 0-88.436364-38.787879-88.436363-88.436363 0-48.09697 38.787879-88.436364 88.436363-88.436364s88.436364 38.787879 88.436364 88.436364c-1.551515 49.648485-40.339394 88.436364-88.436364 88.436363z m0-144.290909c-31.030303 0-57.406061 24.824242-57.40606 57.406061 0 31.030303 24.824242 57.406061 57.40606 57.40606 31.030303 0 57.406061-24.824242 57.406061-57.40606-1.551515-32.581818-26.375758-57.406061-57.406061-57.406061zM754.036364 631.466667H260.654545c-9.309091 0-15.515152-6.206061-15.515151-15.515152s6.206061-15.515152 15.515151-15.515151h493.381819c9.309091 0 15.515152 6.206061 15.515151 15.515151s-7.757576 15.515152-15.515151 15.515152zM754.036364 710.593939H260.654545c-9.309091 0-15.515152-6.206061-15.515151-15.515151s6.206061-15.515152 15.515151-15.515152h493.381819c9.309091 0 15.515152 6.206061 15.515151 15.515152s-7.757576 15.515152-15.515151 15.515151zM754.036364 390.981818H513.551515c-9.309091 0-15.515152-6.206061-15.515151-15.515151s6.206061-15.515152 15.515151-15.515152h238.933333c9.309091 0 15.515152 6.206061 15.515152 15.515152s-6.206061 15.515152-13.963636 15.515151zM754.036364 510.448485H513.551515c-9.309091 0-15.515152-6.206061-15.515151-15.515152s6.206061-15.515152 15.515151-15.515151h238.933333c9.309091 0 15.515152 6.206061 15.515152 15.515151s-6.206061 15.515152-13.963636 15.515152z"
|
||
fill="#FFFFFF26"
|
||
></path>
|
||
<path
|
||
d="M822.30303 806.787879H201.69697c-26.375758 0-46.545455-20.169697-46.545455-46.545455V263.757576c0-26.375758 20.169697-46.545455 46.545455-46.545455h620.60606c26.375758 0 46.545455 20.169697 46.545455 46.545455v496.484848c0 26.375758-20.169697 46.545455-46.545455 46.545455zM201.69697 248.242424c-9.309091 0-15.515152 6.206061-15.515152 15.515152v496.484848c0 9.309091 6.206061 15.515152 15.515152 15.515152h620.60606c9.309091 0 15.515152-6.206061 15.515152-15.515152V263.757576c0-9.309091-6.206061-15.515152-15.515152-15.515152H201.69697z"
|
||
fill="#FFFFFF26"
|
||
></path>
|
||
</svg>
|
||
</div>
|
||
)}
|
||
<input
|
||
type="file"
|
||
id="idCardBack"
|
||
name="idCardBack"
|
||
accept="image/*"
|
||
onChange={(e) => setIdCardBack(e.target.files[0])}
|
||
className="w-full h-full opacity-0 cursor-pointer absolute top-0 left-0"
|
||
/>
|
||
</label>
|
||
</div>
|
||
<div className="flex flex-row gap-4">
|
||
<p className="basis-1/2 text-center text-secondary text-base">
|
||
身份证人像面
|
||
</p>
|
||
<p className="basis-1/2 text-center text-secondary text-base">
|
||
身份证国徽面
|
||
</p>
|
||
</div>
|
||
<p className="text-white text-base mt-2">
|
||
<span className="text-error">*</span>本人手持身份证人像面照片:
|
||
</p>
|
||
<div className="flex flex-row gap-4">
|
||
<label
|
||
htmlFor="idCardFront"
|
||
className="basis-1/2 aspect-[214/135] rounded-xl overflow-hidden relative"
|
||
>
|
||
{handleIdCard ? (
|
||
<div className="relative w-full h-full">
|
||
<Image
|
||
className="w-full object-cover"
|
||
src={URL.createObjectURL(handleIdCard)}
|
||
fill
|
||
alt=""
|
||
/>
|
||
<Image
|
||
className="w-full h-full object-cover absolute top-0 left-0 bg-black/50"
|
||
src={verification_water_mark}
|
||
alt=""
|
||
/>
|
||
</div>
|
||
) : (
|
||
<div className="flex justify-center items-center w-full h-full bg-[#FFFFFF1A]">
|
||
<svg viewBox="0 0 1024 1024" width="100" height="100">
|
||
<path
|
||
d="M371.64357008 315.14947033c6.49709819 44.52423193 21.40220498 69.74825947 31.72112731 81.97809222h207.52495798c10.12782902-12.42092287 25.797301-37.07167852 31.72112729-81.97809222 19.30020283 5.35055124 26.17948435-21.40220498 27.32602968-38.02713377 1.14654691-16.05165376 11.84764942-67.07298383-12.42092286-62.67788785 4.7772778-34.39640288 8.59910032-64.77988999 6.87928152-81.02263542-5.9238247-57.32733659-48.72823625-116.94776702-156.5036295-121.15177291-91.72373949 4.20400432-151.15307823 64.39770821-157.07690294 121.15177291-1.5287287 16.05165376 1.5287287 47.19950756 6.49709817 81.02263542-24.07748219-4.7772778-13.37637813 46.62623408-12.22983275 62.67788785 0.19109168 16.6249272 6.68818983 42.80441155 26.5616661 38.02713377z m0 0M160.87006143 545.79645526h328.10345902v31.72112726H160.87006143v-31.72112726z m0 150.0065313h328.10345902v31.72112729H160.87006143v-31.72112729z m0 149.62434953h709.33024877v31.72112731H160.87006143v-31.72112731z m423.64901951-49.3015097h257.39974276c8.02582687 0 14.52292505-5.9238247 14.52292501-13.37637813 0 0 0-48.15496281-38.60040722-65.92643849-24.07748219-11.27437596-9.17237379-2.67527563-38.60040563-13.94965157-30.0013069-11.27437596-33.82312944-15.0961985-33.82312945-15.09619851l-0.57327345-26.17948435s11.27437596-8.02582687 14.52292502-32.10330748c6.87927995 1.5287287 9.17237379-7.45255342 9.74564726-13.37637968 0.57327345-5.9238247 4.20400432-23.50420873-4.20400433-21.97547846 1.5287287-11.84764942 3.24854908-23.12202537 2.67527562-28.85475997-2.10200217-20.44674974-17.19820066-41.27568286-55.79860787-42.80441154-32.67658252 1.5287287-53.69660572 22.54875191-55.7986079 42.80441154-0.57327345 5.9238247 0.57327345 16.6249272 2.10200218 28.85475997-8.59910032-1.5287287-4.7772778 16.6249272-4.20400434 21.97547846 0.57327345 5.9238247 2.67527563 15.47838028 9.55455559 13.37637968 3.24854908 24.65075407 14.52292505 32.67658252 14.52292659 32.67658095l-0.57327344 26.37057604s-1.14654691 3.82182254-30.57458036 15.47838027c-30.0013069 11.27437596-14.52292505 2.10200217-38.60040724 13.37637813-38.60040722 17.77147413-38.60040722 65.92643692-38.60040565 65.92643848 0.38218179 6.87927995 6.68818983 12.80310465 14.90510685 12.80310466z m0 0"
|
||
fill="#FFFFFF26"
|
||
></path>
|
||
<path
|
||
d="M1001.47991057 755.80560036c0-43.377685-23.50420873-78.72954316-53.69660416-82.5513657V448.14889108c0-27.89930315-23.12202537-51.02133009-51.02133008-51.02132853H124.75383973c-27.89930315 0-51.02133009 23.12202537-51.02133009 51.02132853v225.10534358c-30.0013069 3.82182254-53.69660572 39.17368068-53.69660571 82.5513657 0 43.377685 23.50420873 78.72954316 53.69660571 82.55136411v105.10011759c0 27.89930315 23.12202537 51.02133009 51.02133009 51.02133011h772.0081366c27.89930315 0 51.02133009-23.12202537 51.02133008-51.02133011v-105.10011759c30.19239699-3.63073087 53.69660572-39.55586247 53.69660416-82.55136411zM896.95306642 983.77730969h-772.00813503c-21.97547846 0-40.12913593-18.1536559-40.1291359-40.12913594v-105.10011759c30.0013069-3.82182254 53.69660572-39.17368068 53.69660414-82.5513657 0-43.377685-23.50420873-78.72954316-53.69660414-82.55136411V448.14889108c0-21.97547846 18.1536559-40.12913593 40.1291359-40.12913436h772.00813503c21.97547846 0 40.12913593 18.1536559 40.12913593 40.12913436v225.10534358c-30.0013069 3.82182254-53.69660572 39.17368068-53.69660571 82.5513657 0 43.377685 23.50420873 78.72954316 53.69660571 82.55136411v105.10011759c0.19109168 22.54875191-18.1536559 40.32022761-40.12913593 40.32022763z m0 0"
|
||
fill="#FFFFFF26"
|
||
></path>
|
||
</svg>
|
||
</div>
|
||
)}
|
||
<input
|
||
type="file"
|
||
id="handleIdCard"
|
||
name="handleIdCard"
|
||
accept="image/*"
|
||
onChange={(e) => setHandleIdCard(e.target.files[0])}
|
||
className="w-full h-full opacity-0 cursor-pointer absolute top-0 left-0"
|
||
/>
|
||
</label>
|
||
</div>
|
||
<div className="flex flex-row gap-4">
|
||
<p className="basis-1/2 text-center text-secondary text-sm">
|
||
手持身份证照片
|
||
<br />
|
||
(需清晰可见身份证号码)
|
||
</p>
|
||
</div>
|
||
<p className="text-error text-base mt-4">重要提示:</p>
|
||
<p className="text-error text-sm">
|
||
1.所有信息仅用于审核用途,预计24小时内完成,请耐心等待,如进度缓慢,请联系客服;
|
||
<br />
|
||
2.请确认当前实名认证人与提现收款人一致,否则无法打款。
|
||
</p>
|
||
<button
|
||
disabled={isSubmitting}
|
||
className="btn btn-md btn-primary text-white rounded-full w-full max-w-sm mt-4"
|
||
>
|
||
{isSubmitting && <span className="loading loading-spinner"></span>}
|
||
{isSubmitting ? "提交中..." : "提交"}
|
||
</button>
|
||
</form>
|
||
</section>
|
||
);
|
||
}
|