瀏覽代碼

fix fps bug

master
Alex Cheung 1 年之前
父節點
當前提交
bb1d9180d9
共有 4 個檔案被更改,包括 130 行新增83 行删除
  1. +15
    -12
      src/pages/Payment/FPS/AckPage.js
  2. +51
    -40
      src/pages/Payment/FPS/FPS.js
  3. +30
    -4
      src/pages/Payment/MultiPaymentWindow.js
  4. +34
    -27
      src/pages/Payment/index.js

+ 15
- 12
src/pages/Payment/FPS/AckPage.js 查看文件

@@ -43,14 +43,16 @@ const AckPage = () => {
const [paymentid, setPaymentid] = React.useState(""); const [paymentid, setPaymentid] = React.useState("");


React.useEffect(() => { React.useEffect(() => {
if(location.state != undefined){
console.log(location.state)
if(Object.keys(location.state).length > 0){
console.log(location.state) console.log(location.state)
setPaymentData(location.state) setPaymentData(location.state)
} }
}, []); }, []);


React.useEffect(() => { React.useEffect(() => {
console.log(paymentData)
console.log(transactionData)
if(Object.keys(transactionData).length > 0 ){ if(Object.keys(transactionData).length > 0 ){
setOnReady(true); setOnReady(true);
} }
@@ -65,6 +67,16 @@ const AckPage = () => {
setTransactionDate(trnDate) setTransactionDate(trnDate)
setTransactionTime(trnTime) setTransactionTime(trnTime)
setPaymentid(paymentData.paymentid) setPaymentid(paymentData.paymentid)
HttpUtils.post({
url: paymentPath+paymentStatusApi+paymentid,
params:{
"apprefid": paymentData.transactionid,
"webtoken": paymentData.webtoken,
},
onSuccess: function(responseData){
setTransactionData(responseData)
}
});
} }
// setTransactionData( // setTransactionData(
// { // {
@@ -87,16 +99,7 @@ const AckPage = () => {
// "transactionid": "20231026170103921" // "transactionid": "20231026170103921"
// } // }
// ) // )
HttpUtils.post({
url: paymentPath+paymentStatusApi+paymentid,
params:{
"apprefid": paymentData.transactionid,
"webtoken": paymentData.webtoken,
},
onSuccess: function(responseData){
setTransactionData(responseData)
}
});
}, [paymentData]); }, [paymentData]);


return ( return (


+ 51
- 40
src/pages/Payment/FPS/FPS.js 查看文件

@@ -33,12 +33,13 @@ const Index = () => {
const navigate = useNavigate() const navigate = useNavigate()
const location = useLocation(); const location = useLocation();


const [locationData, setLocationData] = React.useState({});
const [paymentData, setPaymentData] = React.useState({}); const [paymentData, setPaymentData] = React.useState({});
const [onReady, setOnReady] = React.useState(false); const [onReady, setOnReady] = React.useState(false);
const [paymentid, setPaymentid] = React.useState("");
const [fpsTransctionData, setFpsTransctionData] = React.useState({});
const [fpsmerchanttimeoutdatetime, setFpsmerchanttimeoutdatetime] = React.useState(""); const [fpsmerchanttimeoutdatetime, setFpsmerchanttimeoutdatetime] = React.useState("");
const [fpsqrcodeimgbase64, setFpsqrcodeimgbase64] = React.useState("");
const [paymentstatuscode, setPaymentstatuscode] = React.useState("");
// const [fpsqrcodeurl, setFpsqrcodeurl] = React.useState(""); // const [fpsqrcodeurl, setFpsqrcodeurl] = React.useState("");
// const pasgPath = 'https://fps.payapps.hkicl.com.hk'; //PRD // const pasgPath = 'https://fps.payapps.hkicl.com.hk'; //PRD
// const pasgPath = 'https://sim.fps.payapps.hkicl.com.hk'; //Testing // const pasgPath = 'https://sim.fps.payapps.hkicl.com.hk'; //Testing
@@ -53,16 +54,38 @@ const Index = () => {
const [time, setTime] = React.useState(0); const [time, setTime] = React.useState(0);


React.useEffect(() => { React.useEffect(() => {
setFpsqrcodeimgbase64("")
if(location.state != undefined){
setPaymentData(location.state)
loadForm();
console.log (location.state)
if(Object.keys(location.state).length > 0){
console.log (location.state)
setLocationData(location.state)
} }
}, []); }, []);


React.useEffect(() => { React.useEffect(() => {
setOnReady(true);
}, [fpsqrcodeimgbase64]);
console.log (locationData)
if (Object.keys(locationData).length > 0){
setPaymentData(locationData)
// loadForm();
}
}, [locationData]);

React.useEffect(() => {
console.log (paymentData)
if (Object.keys(paymentData).length > 0){
loadForm();
}
}, [paymentData]);

React.useEffect(() => {
console.log(fpsTransctionData)
if(Object.keys(fpsTransctionData).length > 0 && fpsmerchanttimeoutdatetime!=""){
setOnReady(true);
currentTimer.current = setInterval(() => {
setTime((prevTime) => prevTime + 1);
}, 1000);
return () => clearInterval(currentTimer.current);
}
}, [fpsTransctionData]);




const loadForm = () => { const loadForm = () => {
@@ -103,55 +126,43 @@ const Index = () => {
"fpsqrcodeurl": "<fpsqrcodeurl>" "fpsqrcodeurl": "<fpsqrcodeurl>"
} }
*/ */
setFpsqrcodeimgbase64(responseData.fpsqrcodeimgbase64);
setPaymentid(responseData.paymentid);

setFpsTransctionData(responseData)
const timeoutdatetime = responseData.fpsmerchanttimeoutdatetime const timeoutdatetime = responseData.fpsmerchanttimeoutdatetime
const convertedDateString = timeoutdatetime.replace("[UTC]", ""); const convertedDateString = timeoutdatetime.replace("[UTC]", "");
setFpsmerchanttimeoutdatetime(convertedDateString) setFpsmerchanttimeoutdatetime(convertedDateString)
setPaymentstatuscode(responseData.paymentstatuscode);
// const parsedUrl = new URL(responseData.fpsqrcodeurl); // const parsedUrl = new URL(responseData.fpsqrcodeurl);
// const fpsqrcodeurl = parsedUrl.pathname; // const fpsqrcodeurl = parsedUrl.pathname;
// const openPASGUrl = pasgPath + '?pay_req_obj=' + encodeURIComponent(responseData.fpsqrcodeurl) + '&callback=' // const openPASGUrl = pasgPath + '?pay_req_obj=' + encodeURIComponent(responseData.fpsqrcodeurl) + '&callback='
// + encodeURIComponent(paymentPath + payment.config.fpscallbackPage); // + encodeURIComponent(paymentPath + payment.config.fpscallbackPage);
// setFpsqrcodeurl(openPASGUrl) // setFpsqrcodeurl(openPASGUrl)
} }
}); });
currentTimer.current = setInterval(() => {
setTime((prevTime) => prevTime + 1);
}, 1000);
return () => clearInterval(currentTimer.current);
} }


const getPaymentStatus = () => { const getPaymentStatus = () => {
console.log(paymentstatuscode)
// if (paymentstatuscode != "" && paymentstatuscode != "INPR" ){
// if (paymentstatuscode === 'APPR') {
// const timestamp = Date.now();
// navigate('/payment/fps/ackpage', {state:{transactionDateTime:timestamp,transactionid:"",webtoken:"", paymentid:paymentid} });
// } else if (paymentstatuscode === 'CANC') {
// navigate('/payment');
// } else {
// alert("error")
// }
// }
console.log(fpsTransctionData.paymentstatuscode)
HttpUtils.post({ HttpUtils.post({
url: paymentPath+paymentStatusApi+paymentid,
url: paymentPath+paymentStatusApi+fpsTransctionData.transactionid,
params:{ params:{
"apprefid": paymentData.transactionid, "apprefid": paymentData.transactionid,
"webtoken": paymentData.webtoken, "webtoken": paymentData.webtoken,
}, },
onSuccess: function(responseData){ onSuccess: function(responseData){
const paymentstatuscode = responseData.paymentdetail.result.paymentstatuscode; const paymentstatuscode = responseData.paymentdetail.result.paymentstatuscode;
if (paymentstatuscode === 'APPR') {
const timestamp = Date.now();
navigate('/payment/fps/ackpage', {state:{transactionDateTime:timestamp,transactionid:"",webtoken:"", paymentid:paymentid} });
} else if (paymentstatuscode === 'CANC') {
window.top.location.href = paymentPath + payment.config.indexPagePath;
} else {
window.top.location.href = paymentPath + payment.config.errPagePath;
if (paymentstatuscode != "" && paymentstatuscode != "INPR" ){
if (paymentstatuscode === 'APPR') {
const timestamp = Date.now();
navigate('/payment/fps/ackpage', {state:{transactionDateTime:timestamp,transactionid:paymentData.transactionid,webtoken:paymentData.webtoken, paymentid:paymentid} });
} else if (paymentstatuscode === 'CANC') {
// window.top.location.href = paymentPath + payment.config.indexPagePath;
navigate('/payment');
} else {
// window.top.location.href = paymentPath + payment.config.errPagePath;
alert("ERROR")
}
} }
}, },
onError: function(){ onError: function(){
@@ -178,7 +189,7 @@ const Index = () => {
params:{ params:{
"transactionid": paymentData.transactionid, "transactionid": paymentData.transactionid,
"webtoken": paymentData.webtoken, "webtoken": paymentData.webtoken,
"paymentid": paymentid
"paymentid": fpsTransctionData.paymentid
}, },
onSuccess: function(){ onSuccess: function(){
navigate("/dashboard"); navigate("/dashboard");
@@ -216,7 +227,7 @@ const Index = () => {
<Typography variant="h3" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "center" }}> <Typography variant="h3" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "center" }}>
請掃描以下二維碼 請掃描以下二維碼
<br /> <br />
<img src={fpsqrcodeimgbase64} alt="QR Code"/>
<img src={fpsTransctionData.fpsqrcodeimgbase64} alt="QR Code"/>
<br /> <br />
二維碼有效期限10分鐘 二維碼有效期限10分鐘
<br /> <br />


+ 30
- 4
src/pages/Payment/MultiPaymentWindow.js 查看文件

@@ -2,6 +2,7 @@ import {
useEffect, useEffect,
useState useState
} from "react"; } from "react";
import * as React from "react";


// material-ui // material-ui
import { import {
@@ -18,6 +19,8 @@ import {
} from '@mui/material'; } from '@mui/material';
import { useFormik, FormikProvider } from 'formik'; import { useFormik, FormikProvider } from 'formik';
import * as yup from 'yup'; import * as yup from 'yup';
import Loadable from 'components/Loadable';
const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent')));




const MultiPaymentWindow = (props) => { const MultiPaymentWindow = (props) => {
@@ -25,6 +28,26 @@ const MultiPaymentWindow = (props) => {
const windowTitle = "請選擇付款方式"; const windowTitle = "請選擇付款方式";
const [content, setContent] = useState(); const [content, setContent] = useState();
const [paymentMethod, setPaymentMethod] = useState(""); const [paymentMethod, setPaymentMethod] = useState("");
const [transactionData, setTransactionData] = useState([]);
const [availableMethodData, setAvailableMethodData] = useState([]);
const [onReady, setOnReady] = useState(false);

useEffect(() => {
console.log(props.availableMethods)
console.log(props.transactionData)
if(props.availableMethods.length > 0){
setAvailableMethodData(props.availableMethods)
setTransactionData(props.transactionData)
}
}, [props.transactionData]);

useEffect(() => {
console.log(availableMethodData)
console.log(transactionData)
if(availableMethodData.length > 0){
setOnReady(true)
}
}, [availableMethodData]);


useEffect(() => { useEffect(() => {
console.log(paymentMethod) console.log(paymentMethod)
@@ -45,7 +68,7 @@ const MultiPaymentWindow = (props) => {
setPaymentMethod("") setPaymentMethod("")
} }
setPaymentMethod setPaymentMethod
if(props.availableMethods.length > 0){
if(availableMethodData.length > 0){
setContent( setContent(
<Grid container spacing={2} direction="column" justifyContent="space-between" alignItems="flex-start"> <Grid container spacing={2} direction="column" justifyContent="space-between" alignItems="flex-start">
<Grid item xs={12} md={12}> <Grid item xs={12} md={12}>
@@ -57,7 +80,7 @@ const MultiPaymentWindow = (props) => {
</Grid> </Grid>
<Grid item> <Grid item>
<FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}> <FormLabel sx={{ fontSize: "16px", color: "#000000", textAlign: "center" }}>
{props.transactionData.transicationId}
{transactionData.transicationId}
</FormLabel> </FormLabel>
</Grid> </Grid>
</Grid> </Grid>
@@ -137,7 +160,7 @@ const MultiPaymentWindow = (props) => {
</Grid> </Grid>
) )
} }
}, [props.open,paymentMethod]);
}, [availableMethodData]);


const formik = useFormik({ const formik = useFormik({
initialValues: ({ initialValues: ({
@@ -169,7 +192,10 @@ const MultiPaymentWindow = (props) => {
<form> <form>
<DialogContent> <DialogContent>
<DialogContentText> <DialogContentText>
{content}
{!onReady ?
<LoadingComponent />
:content
}
</DialogContentText> </DialogContentText>
</DialogContent> </DialogContent>
</form> </form>


+ 34
- 27
src/pages/Payment/index.js 查看文件

@@ -27,12 +27,12 @@ const BackgroundHead = {
} }


const Index = () => { const Index = () => {
// const getAvailablePaymentUrl = "/payment/api/payment/availability";
const getTransactionIdUrl = "/payment/api/payment/transaction";
const getAvailablePaymentUrl = "/api/payment/availability";
const getTransactionIdUrl = "/api/payment/transaction";
const navigate = useNavigate() const navigate = useNavigate()


// const local = {en:"en-us", zh:"zh-hk", cn:"zh-cn"}; // const local = {en:"en-us", zh:"zh-hk", cn:"zh-cn"};
// const preferpaymentmethods = ['visa','mastercard','pps','creditcard','fps'];
const preferpaymentmethods = ['visa','mastercard','pps','creditcard','fps'];
const [totalAmount,setTotalAmount] = useState(0); const [totalAmount,setTotalAmount] = useState(0);
const id =1; const id =1;
@@ -51,12 +51,15 @@ const Index = () => {
useEffect(() => { useEffect(() => {
if(id > 0 ){ if(id > 0 ){
setTotalAmount(2000) setTotalAmount(2000)
getAvailablePayment()
getTransactionId()
} }
}, []); }, []);


const handleClose = () => { const handleClose = () => {
// handleReset() // handleReset()
setOpen(false); setOpen(false);
getTransactionId()
}; };


const paymentClick = () => { const paymentClick = () => {
@@ -64,9 +67,8 @@ const Index = () => {
setSelectedPaymentMethod("") setSelectedPaymentMethod("")
setConfirmPayment(false) setConfirmPayment(false)
if (totalAmount>0){ if (totalAmount>0){
getTransactionId()
setOpen(true) setOpen(true)
getAvailablePayment()
getTransactionId()
} }
}; };


@@ -74,7 +76,7 @@ const Index = () => {
if (confirmPayment){ if (confirmPayment){
setOpen(false); setOpen(false);
if(selectedPaymentMethod === "FPS"){ if(selectedPaymentMethod === "FPS"){
navigate('/payment/fps', {state:{amount:totalAmount,transactionid:"",webtoken:""} });
navigate('/payment/fps', {state:{amount:totalAmount,transactionid:transactionData.transactionid,webtoken:transactionData.webtoken} });
// navigate('/payment/fps', {state:{amount:totalAmount,transactionid:transactionData.transactionid,webtoken:transactionData.webtoken} }); // navigate('/payment/fps', {state:{amount:totalAmount,transactionid:transactionData.transactionid,webtoken:transactionData.webtoken} });
} }
@@ -242,35 +244,40 @@ const Index = () => {
onSuccess: (responseData)=>{ onSuccess: (responseData)=>{
let availableMethods = responseData.availablepaymentmethods; let availableMethods = responseData.availablepaymentmethods;
setAvailableMethods(availableMethods); setAvailableMethods(availableMethods);
if (availableMethods.length>0){
availableMethods.forEach((method)=>{
if(method.subtype === "FPS" ){
setFPSStatus(method)
}else if (method.subtype === "CreditCard"){
method.supportedcard.forEach((supportedcard)=>{
if (supportedcard === "JCB" || supportedcard === "MasterCard" || supportedcard === "Visa"){
setCreditCardStatus(method)
} else {
if (supportedcard === "UnionPay"){
setUnionPayStatus(method)
}
}
})
}else if (method.subtype === "PPS" ){
setPPSStatus(method)
}
});
}
} }
}); });
} }


useEffect(() => {
console.log(availableMethods)
if (availableMethods.length>0){
availableMethods.forEach((method)=>{
if(method.subtype === "FPS" ){
setFPSStatus(method)
}else if (method.subtype === "CreditCard"){
method.supportedcard.forEach((supportedcard)=>{
if (supportedcard === "JCB" || supportedcard === "MasterCard" || supportedcard === "Visa"){
setCreditCardStatus(method)
} else {
if (supportedcard === "UnionPay"){
setUnionPayStatus(method)
}
}
})
}else if (method.subtype === "PPS" ){
setPPSStatus(method)
}
});
}
}, [availableMethods]);

const getTransactionId = () => { const getTransactionId = () => {
HttpUtils.get({ HttpUtils.get({
url: paymentPath+getTransactionIdUrl, url: paymentPath+getTransactionIdUrl,
onSuccess: (responseData)=>{ onSuccess: (responseData)=>{
const transactionData = responseData;
setTransactionData(transactionData)
// const transactionData = responseData;
setTransactionData(responseData)
} }
}); });
} }


Loading…
取消
儲存