From fe574f6fbf29d83c2978f4bc4a6dfa6ea8dbe0ce Mon Sep 17 00:00:00 2001 From: Jason Chuang Date: Sat, 12 Sep 2026 01:58:22 +0800 Subject: [PATCH] fix payment limit check --- src/pages/Payment/MultiPaymentWindow.js | 12 +-- src/pages/Payment/index.js | 101 ++++++++++++++++++------ 2 files changed, 84 insertions(+), 29 deletions(-) diff --git a/src/pages/Payment/MultiPaymentWindow.js b/src/pages/Payment/MultiPaymentWindow.js index a53f8ac6..f1bbcef9 100644 --- a/src/pages/Payment/MultiPaymentWindow.js +++ b/src/pages/Payment/MultiPaymentWindow.js @@ -346,27 +346,27 @@ const MultiPaymentWindow = (props) => { - - - - - @@ -374,7 +374,7 @@ const MultiPaymentWindow = (props) => { {props.browserType==mobileBrowser? null : - } diff --git a/src/pages/Payment/index.js b/src/pages/Payment/index.js index 02789d16..21bdefe5 100644 --- a/src/pages/Payment/index.js +++ b/src/pages/Payment/index.js @@ -106,6 +106,12 @@ const Index = () => { setTotalAmount(totalAmount); setSelectedPaymentMethod("") setConfirmPayment(false) + setOnReady(false) + setAvailableMethods([]) + setFPSStatus({}) + setCreditCardStatus({}) + setUnionPayStatus({}) + setPPSStatus({}) if (totalAmount > 0) { getAvailablePayment() getTransactionId() @@ -190,48 +196,97 @@ const Index = () => { } }, [afterConfirmPayment]); - const getAvailablePayment = () =>{ + const filterPreferPaymentMethodsByLimit = (methods, amount, limits) => { + if (!methods) { + return []; + } + if (!limits) { + return methods; + } + return methods.filter((method) => { + const key = (method || "").toLowerCase(); + let maxLimit; + if (key === "fps") { + maxLimit = limits.fpsLimitRecord?.maxLimit; + } else if (key === "pps" || key === "ppsb") { + maxLimit = limits.ppsbLimitRecord?.maxLimit; + } else if (key === "unionpay") { + maxLimit = limits.unionPlayLimitRecord?.maxLimit; + } else if (key === "visa" || key === "mastercard" || key === "jcb" || key === "creditcard") { + maxLimit = limits.creditCardLimitRecord?.maxLimit; + } else { + return true; + } + return maxLimit == null || amount <= maxLimit; + }); + }; + + const filterAvailableMethodsByLimit = (methods, amount, limits) => { + if (!methods) { + return []; + } + if (!limits) { + return methods; + } + return methods.filter((method) => { + if (method.subtype === "FPS") { + return limits.fpsLimitRecord?.maxLimit == null || amount <= limits.fpsLimitRecord.maxLimit; + } + if (method.subtype === "PPS") { + return limits.ppsbLimitRecord?.maxLimit == null || amount <= limits.ppsbLimitRecord.maxLimit; + } + if (method.subtype === "CreditCard") { + const isUnionPay = method.supportedcard?.some((card) => card === "UnionPay"); + if (isUnionPay) { + return limits.unionPlayLimitRecord?.maxLimit == null || amount <= limits.unionPlayLimitRecord.maxLimit; + } + return limits.creditCardLimitRecord?.maxLimit == null || amount <= limits.creditCardLimitRecord.maxLimit; + } + return true; + }); + }; + + const requestPaymentAvailability = (methods, limits) => { HttpUtils.post({ url: UrlUtils.PAYMENT_AVAILABLE_PAYMENT, params: { "locale": locale === 'en' ?local.en:locale === 'zh-HK' ?local.zh:local.cn, "amount": totalAmount, - // "eserviceids": [ - // "", "" - // ], - "preferpaymentmethods": preferpaymentmethods + "preferpaymentmethods": methods }, onSuccess: (responseData) => { - let availableMethods = responseData.availablepaymentmethods; + let availableMethods = filterAvailableMethodsByLimit( + responseData.availablepaymentmethods || [], totalAmount, limits + ); setAvailableMethods(availableMethods); - HttpUtils.get({ - url: UrlUtils.PAYMENT_LIMIT_SETTING_LIST, - params: {}, - onSuccess: (responseData) => { - // console.log(responseData) - setPaymentLimit(responseData) - - }, - onError: () =>{ - // setOnReady(true) - } - }); + if (availableMethods.length === 0) { + setOnReady(true) + } }, onError: () =>{ setOnReady(true) } }); - + }; + + const getAvailablePayment = () =>{ HttpUtils.get({ url: UrlUtils.PAYMENT_LIMIT_SETTING_LIST, params: {}, onSuccess: (responseData) => { - // console.log(responseData) setPaymentLimit(responseData) - + const methodsWithinLimit = filterPreferPaymentMethodsByLimit( + preferpaymentmethods, totalAmount, responseData + ); + if (methodsWithinLimit.length === 0) { + setAvailableMethods([]) + setOnReady(true) + return; + } + requestPaymentAvailability(methodsWithinLimit, responseData); }, onError: () =>{ - // setOnReady(true) + requestPaymentAvailability(preferpaymentmethods); } }); @@ -383,7 +438,7 @@ const Index = () => { setFPSStatus(method) } } else if (method.subtype === "CreditCard") { - method.supportedcard.forEach((supportedcard) => { + (method.supportedcard || []).forEach((supportedcard) => { if (supportedcard === "JCB" || supportedcard === "MasterCard" || supportedcard === "Visa") { setCreditCardStatus(method) } else {