Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

251 righe
10 KiB

  1. // material-ui
  2. import {
  3. Grid,
  4. Typography,
  5. Stack,
  6. Button,
  7. } from '@mui/material';
  8. import * as React from "react";
  9. import * as HttpUtils from "utils/HttpUtils";
  10. import { useNavigate } from "react-router-dom";
  11. import FpsIcon from "assets/images/icons/fps.svg";
  12. import { useLocation } from 'react-router-dom';
  13. import {paymentPath} from "auth/utils";
  14. // import {poll} from "utils/Utils";
  15. import Loadable from 'components/Loadable';
  16. const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent')));
  17. import titleBackgroundImg from 'assets/images/dashboard/gazette-bar.png'
  18. const BackgroundHead = {
  19. backgroundImage: `url(${titleBackgroundImg})`,
  20. width: '100%',
  21. height: '100%',
  22. backgroundSize: 'contain',
  23. backgroundRepeat: 'no-repeat',
  24. backgroundColor: '#0C489E',
  25. backgroundPosition: 'right'
  26. }
  27. // ==============================|| DASHBOARD - DEFAULT ||============================== //
  28. const Index = () => {
  29. const navigate = useNavigate()
  30. const location = useLocation();
  31. const [paymentData, setPaymentData] = React.useState({});
  32. const [onReady, setOnReady] = React.useState(false);
  33. const [paymentid, setPaymentid] = React.useState("");
  34. const [fpsmerchanttimeoutdatetime, setFpsmerchanttimeoutdatetime] = React.useState("");
  35. const [fpsqrcodeimgbase64, setFpsqrcodeimgbase64] = React.useState("");
  36. const [paymentstatuscode, setPaymentstatuscode] = React.useState("");
  37. // const [fpsqrcodeurl, setFpsqrcodeurl] = React.useState("");
  38. // const pasgPath = 'https://fps.payapps.hkicl.com.hk'; //PRD
  39. // const pasgPath = 'https://sim.fps.payapps.hkicl.com.hk'; //Testing
  40. const loadPaymentUrl = "/api/payment/wallet/fps";
  41. const cancelPaymentUrl = "/api/payment/cancelpayment";
  42. const paymentStatusApi = "/api/payment/status/";
  43. // const payloadUrl = "/api/payment/wallet/fps/enquiryfpspayload/";
  44. // const receiverUrl = "/noti-api/payment/payment-notification";
  45. //timer
  46. const currentTimer = React.useRef();
  47. const [time, setTime] = React.useState(0);
  48. React.useEffect(() => {
  49. setFpsqrcodeimgbase64("")
  50. if(location.state != undefined){
  51. setPaymentData(location.state)
  52. loadForm();
  53. }
  54. }, []);
  55. React.useEffect(() => {
  56. setOnReady(true);
  57. }, [fpsqrcodeimgbase64]);
  58. const loadForm = () => {
  59. // const timeoutdatetime = "2023-10-26T09:04:30Z[UTC]"
  60. // const convertedDateString = timeoutdatetime.replace("[UTC]", "");
  61. // setFpsmerchanttimeoutdatetime(convertedDateString)
  62. // setPaymentid("C202310268000681")
  63. // setPaymentstatuscode("APPR")
  64. HttpUtils.post({
  65. url: paymentPath+loadPaymentUrl,
  66. params:{
  67. "transactionid": paymentData.transactionid,
  68. "webtoken": paymentData.webtoken,
  69. "paymentmethod":"04,BCFP,FPS",
  70. "order": {
  71. "totalamount":paymentData.amount,
  72. "currency":"HKD",
  73. "orderdetail":
  74. [
  75. {
  76. "itemid": "1",
  77. "qty":"1",
  78. "unitprice":paymentData.amount,
  79. "amount":paymentData.amount
  80. },
  81. ]
  82. },
  83. // "locale":"<locale>",
  84. // "eserviceid":"<eserviceid>"
  85. },
  86. onSuccess: function(responseData){
  87. /*
  88. {
  89. "paymentid": "<paymentid>",
  90. "paymentstatus": "<paymentstatus>",
  91. "fpsmerchanttimeoutdatetime": <fpsmerchanttimeoutdatetime>,
  92. "fpsqrcodeimgbase64": "<fpsqrcodeimgbase64>",
  93. "fpsqrcodeurl": "<fpsqrcodeurl>"
  94. }
  95. */
  96. setFpsqrcodeimgbase64(responseData.fpsqrcodeimgbase64);
  97. setPaymentid(responseData.paymentid);
  98. const timeoutdatetime = responseData.fpsmerchanttimeoutdatetime
  99. const convertedDateString = timeoutdatetime.replace("[UTC]", "");
  100. setFpsmerchanttimeoutdatetime(convertedDateString)
  101. setPaymentstatuscode(responseData.paymentstatuscode);
  102. // const parsedUrl = new URL(responseData.fpsqrcodeurl);
  103. // const fpsqrcodeurl = parsedUrl.pathname;
  104. // const openPASGUrl = pasgPath + '?pay_req_obj=' + encodeURIComponent(responseData.fpsqrcodeurl) + '&callback='
  105. // + encodeURIComponent(paymentPath + payment.config.fpscallbackPage);
  106. // setFpsqrcodeurl(openPASGUrl)
  107. }
  108. });
  109. currentTimer.current = setInterval(() => {
  110. setTime((prevTime) => prevTime + 1);
  111. }, 1000);
  112. return () => clearInterval(currentTimer.current);
  113. }
  114. const getPaymentStatus = () => {
  115. console.log(paymentstatuscode)
  116. // if (paymentstatuscode != "" && paymentstatuscode != "INPR" ){
  117. // if (paymentstatuscode === 'APPR') {
  118. // const timestamp = Date.now();
  119. // navigate('/payment/fps/ackpage', {state:{transactionDateTime:timestamp,transactionid:"",webtoken:"", paymentid:paymentid} });
  120. // } else if (paymentstatuscode === 'CANC') {
  121. // navigate('/payment');
  122. // } else {
  123. // alert("error")
  124. // }
  125. // }
  126. HttpUtils.post({
  127. url: paymentPath+paymentStatusApi+paymentid,
  128. params:{
  129. "apprefid": paymentData.transactionid,
  130. "webtoken": paymentData.webtoken,
  131. },
  132. onSuccess: function(responseData){
  133. const paymentstatuscode = responseData.paymentdetail.result.paymentstatuscode;
  134. if (paymentstatuscode === 'APPR') {
  135. const timestamp = Date.now();
  136. navigate('/payment/fps/ackpage', {state:{transactionDateTime:timestamp,transactionid:"",webtoken:"", paymentid:paymentid} });
  137. } else if (paymentstatuscode === 'CANC') {
  138. window.top.location.href = paymentPath + payment.config.indexPagePath;
  139. } else {
  140. window.top.location.href = paymentPath + payment.config.errPagePath;
  141. }
  142. },
  143. onError: function(){
  144. cancelPayment()
  145. clearInterval(currentTimer.current);
  146. }
  147. });
  148. };
  149. React.useEffect(() => {
  150. const timeOutDate = new Date(fpsmerchanttimeoutdatetime);
  151. const currentTime = new Date;
  152. console.log(time)
  153. getPaymentStatus();
  154. if (timeOutDate.getTime()<currentTime.getTime()){
  155. console.log("stop");
  156. clearInterval(currentTimer.current);
  157. }
  158. },[time])
  159. const cancelPayment = ()=>{
  160. HttpUtils.post({
  161. url: paymentPath+cancelPaymentUrl,
  162. params:{
  163. "transactionid": paymentData.transactionid,
  164. "webtoken": paymentData.webtoken,
  165. "paymentid": paymentid
  166. },
  167. onSuccess: function(){
  168. navigate("/dashboard");
  169. }
  170. });
  171. }
  172. return (
  173. !onReady ?
  174. <LoadingComponent />
  175. :
  176. (
  177. <Grid container sx={{ minHeight: '110vh', backgroundColor: '#fff' }} direction="column" justifyContent="flex-start" alignItems="center" >
  178. <Grid item xs={12} width="100%">
  179. <div style={BackgroundHead} width="100%">
  180. <Stack direction="row" height='70px'>
  181. <Typography ml={15} color='#FFF' variant="h4" sx={{ pt: 2 }}>公共啟事:FPS付款</Typography>
  182. </Stack>
  183. </div>
  184. </Grid>
  185. {/*row 1*/}
  186. <Grid item xs={12} md={12} >
  187. <Grid container justifyContent="flex-start" alignItems="center" >
  188. <center>
  189. <Grid item xs={12} md={12} >
  190. <Typography variant="h3" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "center" }}>
  191. <img src={FpsIcon} width="80" height="80" alt="FPS"></img>
  192. <br />
  193. 支付金額
  194. <br />
  195. {"$HK " + paymentData.amount}
  196. </Typography>
  197. <Typography variant="h3" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "center" }}>
  198. 請掃描以下二維碼
  199. <br />
  200. <img src={fpsqrcodeimgbase64} alt="QR Code"/>
  201. <br />
  202. 二維碼有效期限10分鐘
  203. <br />
  204. 請在規定時間內完成付款流程 ({fpsmerchanttimeoutdatetime})
  205. </Typography>
  206. <Typography variant="h3" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "center" }}>
  207. <Button
  208. component="span"
  209. variant="contained"
  210. size="large"
  211. color="error"
  212. onClick={()=>{
  213. cancelPayment();
  214. }}
  215. sx={{ m: 4 }}
  216. >取消付款</Button>
  217. </Typography>
  218. </Grid>
  219. </center>
  220. </Grid>
  221. </Grid>
  222. {/*row 2*/}
  223. </Grid >
  224. )
  225. );
  226. };
  227. export default Index;