import styles from "@/pages/pay/pay.module.less"; import {useNavigate, useSearchParams} from "react-router-dom"; import {useSetState} from "ahooks"; import {useEffect} from "react"; import {createExternalBill} from "@/service/api/bill.ts"; import {IconLoading} from "@/components/icons"; import {FailIcon} from "@/assets/images/pay/fail.tsx"; import {PayLogo} from "@/pages/pay/component"; // 获取必填参数 const RequiredParams = [ // 'application_number','student_number', 可以不设置 'source', 'amount', 'program_code', 'intake_year', 'intake_semester' /* 'student_english_name', 'programme_chinese_name', 'student_email','student_chinese_name', 'programme_english_name', 'department_chinese_name', 'department_english_name', 'attendance_mode', */ ] const ExternalCreate = () => { const [state, setState] = useSetState<{ error?: string; params?: ExternalCreateParamsType; loading?: boolean; }>({ loading: true }) const [searchParams] = useSearchParams(); const navigate = useNavigate() const createBill = (params: ExternalCreateParamsType) => { setState({loading: true}) const pay_channel = searchParams.get('pay_channel') || 'flywire' createExternalBill(params).then((ret) => { setState({loading: false}) navigate(`/pay?bill=${ret.id}&pay_channel=${pay_channel}`, {replace: true}) }).catch(() => { setState({loading: false, 'error': 'create pay order failed'}) }) } useEffect(() => { if (searchParams) { const paramsContent = searchParams.get('params'); if (!paramsContent) { return setState({error: 'params error',loading: false}) } const params: ExternalCreateParamsType = JSON.parse(paramsContent); for (let i = 0; i < RequiredParams.length; i++) { const key = RequiredParams[i]; if (!params[key]) { return setState({error: 'params error: require ' + key,loading: false}) } } if (!params.application_number && !params.student_number) { return setState({error: 'params error: require application_number or student_number',loading: false}) } if (!params.details || params.details.length == 0) { return setState({error: 'params error: require detail',loading: false}) } let tempAmount = 0; params.details.forEach((d:BillDetail) => { tempAmount += Number(d.amount) }) if(tempAmount != Number(params.amount)){ return setState({error: 'params error: amount not equal to detail amount',loading: false}) } createBill(params) return; } }, [searchParams]) return (
{state.loading &&
} {state.error &&

{state.error}

}
) } export default ExternalCreate