25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 

183 satır
7.2 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 * as UrlUtils from "utils/ApiPathConst";
  11. import { useNavigate } from "react-router-dom";
  12. import { useLocation } from 'react-router-dom';
  13. // import {paymentPath} from "auth/utils";
  14. // import {poll} from "utils/Utils";
  15. import VisaIcon from "assets/images/icons/visacard.svg";
  16. import MasterIcon from "assets/images/icons/mastercard.svg";
  17. import JcbIcon from "assets/images/icons/jcb.svg";
  18. import UnionPayIcon from "assets/images/icons/unionpay.svg";
  19. import PpsIcon from "assets/images/icons/ppshk.svg";
  20. import Loadable from 'components/Loadable';
  21. const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent')));
  22. import titleBackgroundImg from 'assets/images/dashboard/gazette-bar.png'
  23. import {FormattedMessage} from "react-intl";
  24. import { ERROR_CONTAINED_BUTTON_SX } from "themes/colorConst";
  25. const BackgroundHead = {
  26. backgroundImage: `url(${titleBackgroundImg})`,
  27. width: '100%',
  28. height: '100%',
  29. backgroundSize: 'contain',
  30. backgroundRepeat: 'no-repeat',
  31. backgroundColor: '#0C489E',
  32. backgroundPosition: 'right'
  33. }
  34. const Index = () => {
  35. const navigate = useNavigate()
  36. const location = useLocation();
  37. const [paymentData, setPaymentData] = React.useState({});
  38. const [onReady, setOnReady] = React.useState(false);
  39. // const [paymentstatuscode, setPaymentstatuscode] = React.useState("");
  40. // const [fpsqrcodeurl, setFpsqrcodeurl] = React.useState("");
  41. // const pasgPath = 'https://fps.payapps.hkicl.com.hk'; //PRD
  42. // const pasgPath = 'https://sim.fps.payapps.hkicl.com.hk'; //Testing
  43. // const loadPaymentUrl = "/api/payment/web/";
  44. // const paymentStatusApi = "/api/payment/status/";
  45. // const payloadUrl = "/api/payment/wallet/fps/enquiryfpspayload/";
  46. // const receiverUrl = "/noti-api/payment/payment-notification";
  47. React.useEffect(() => {
  48. if (location.state != undefined) {
  49. setPaymentData(location.state)
  50. }
  51. }, []);
  52. React.useEffect(() => {
  53. if (Object.keys(paymentData).length > 0){
  54. setOnReady(true);
  55. loadForm();
  56. }
  57. }, [paymentData]);
  58. const loadForm = () => {
  59. // const timeoutdatetime = "2023-10-26T09:04:30Z[UTC]"
  60. // const convertedDateString = timeoutdatetime.replace("[UTC]", "");
  61. // setFpsmerchanttimeoutdatetime(convertedDateString)
  62. localStorage.removeItem("transactionid")
  63. localStorage.removeItem("webtoken")
  64. localStorage.setItem("transactionid", paymentData.transactionid)
  65. localStorage.setItem("webtoken", paymentData.webtoken)
  66. HttpUtils.post({
  67. url: UrlUtils.LOAD_PAYMENT_URL+(paymentData.type=="PPS"?"pps":"creditcard"),
  68. params:{
  69. "transactionid": paymentData.transactionid,
  70. //"apprefid:": paymentData.transactionid,
  71. "webtoken": paymentData.webtoken,
  72. "paymentmethod":paymentData.paymentMethod,
  73. "order": {
  74. "totalamount":paymentData.amount,
  75. "currency":"HKD",
  76. "orderdetail":
  77. [
  78. {
  79. "itemid": "1",
  80. "qty":"1",
  81. "unitprice":paymentData.amount,
  82. "amount":paymentData.amount
  83. },
  84. ]
  85. },
  86. // "locale":"<locale>",
  87. // "eserviceid":"<eserviceid>",
  88. "returnurl": "https://"+window.location.hostname+"/paymentPage/callback"
  89. },
  90. ///{state:{transactionid:paymentData.transactionid,webtoken:paymentData.webtoken} }
  91. onSuccess: function(responseData){
  92. /*
  93. {
  94. "transactionid": "<transactionid>",
  95. "redirecturl": "<redirecturl>"
  96. }
  97. */
  98. //window.open(responseData.redirecturl);
  99. window.location.assign(responseData.redirecturl);
  100. }
  101. });
  102. }
  103. const cancelPayment = () => {
  104. navigate("/dashboard");
  105. }
  106. const getIcon = () => {
  107. if(paymentData.type=="Visa") return VisaIcon;
  108. if(paymentData.type=="Mastercard") return MasterIcon;
  109. if(paymentData.type=="UnionPay") return UnionPayIcon;
  110. if(paymentData.type=="JCB") return JcbIcon;
  111. if(paymentData.type=="PPS") return PpsIcon;
  112. }
  113. return (
  114. !onReady ?
  115. <Grid container sx={{ minHeight: '87vh', mb: 3 }} direction="column" justifyContent="center" alignItems="center">
  116. <Grid item>
  117. <LoadingComponent />
  118. </Grid>
  119. </Grid>
  120. :
  121. (
  122. <Grid container sx={{ minHeight: '110vh', backgroundColor: '#fff' }} direction="column" justifyContent="flex-start" alignItems="center" >
  123. <Grid item xs={12} width="100%">
  124. <div style={BackgroundHead} width="100%">
  125. <Stack direction="row" height='70px'>
  126. <Typography ml={15} color='#FFF' variant="h4" sx={{ pt: 2 }}>公共啟事: 信用卡付款</Typography>
  127. </Stack>
  128. </div>
  129. </Grid>
  130. {/*row 1*/}
  131. <Grid item xs={12} md={12} >
  132. <Grid container justifyContent="flex-start" alignItems="center" >
  133. <center>
  134. <Grid item xs={12} md={12} >
  135. <Typography variant="h3" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "center" }}>
  136. <img src={getIcon()} width="80" height="80" alt={paymentData.type}></img>
  137. <br />
  138. <FormattedMessage id="payFee"/>
  139. <br />
  140. {"$HK " + paymentData.amount}
  141. </Typography>
  142. <Typography variant="h3" sx={{ ml: 8, mt: 4, mr: 8, textAlign: "center" }}>
  143. <Button
  144. component="span"
  145. variant="contained"
  146. size="large"
  147. onClick={() => {
  148. cancelPayment();
  149. }}
  150. sx={{ m: 4, ...ERROR_CONTAINED_BUTTON_SX }}
  151. >
  152. <FormattedMessage id="payCancel"/>
  153. </Button>
  154. </Typography>
  155. </Grid>
  156. </center>
  157. </Grid>
  158. </Grid>
  159. {/*row 2*/}
  160. </Grid >
  161. )
  162. );
  163. }
  164. export default Index;