diff --git a/common/api.js b/common/api.js index 012b199..93b51fe 100644 --- a/common/api.js +++ b/common/api.js @@ -17,6 +17,7 @@ var default_api = 'https://api.global-interaction.com/'; var memoryEnv = ''; var memoryAccessToken = ''; var memoryAppCode = ''; + var activeAppConfig = null; function currentQueryParams() { var params = new URLSearchParams(window.location.search); @@ -114,6 +115,8 @@ var default_api = 'https://api.global-interaction.com/'; function resolveBaseURL() { var env = resolveEnv(); + var configuredAPI = activeAppAPIBaseURL(env); + if (configuredAPI) return configuredAPI; if (env === 'test') return isLocalDevOrigin() ? devProxyBase('/__api_test__/') @@ -122,6 +125,14 @@ var default_api = 'https://api.global-interaction.com/'; return normalizeBaseURL(default_api); } + function activeAppAPIBaseURL(env) { + var api = activeAppConfig && activeAppConfig.api; + if (!api) return ''; + if (env === 'local' && api.local) return normalizeBaseURL(api.local); + if (env === 'test' && api.test) return normalizeBaseURL(api.test); + return api.prod || api.default ? normalizeBaseURL(api.prod || api.default) : ''; + } + function buildURL(path, query) { var url = new URL(path.replace(/^\/+/, ''), resolveBaseURL()); if (query) { @@ -181,7 +192,7 @@ var default_api = 'https://api.global-interaction.com/'; } function getAppCode() { - var queryAppCode = readQuery('app_code') || readQuery('appCode'); + var queryAppCode = readQuery('app') || readQuery('app_code') || readQuery('appCode'); if (queryAppCode) { memoryAppCode = queryAppCode; if (shouldPersist()) @@ -215,6 +226,43 @@ var default_api = 'https://api.global-interaction.com/'; if (shouldPersist()) window.localStorage.removeItem(APP_CODE_KEY); } + function setAppConfig(config) { + activeAppConfig = config || null; + if (activeAppConfig && activeAppConfig.app) { + setAppCode(activeAppConfig.app); + } + return activeAppConfig; + } + + function getAppConfig() { + return activeAppConfig; + } + + function loadAppConfig(scope) { + var appCode = String(getAppCode() || 'lalu').trim().toLowerCase(); + if (!appCode || appCode === 'lalu') { + activeAppConfig = null; + return Promise.resolve(null); + } + var scopePath = String(scope || '').replace(/^\/+|\/+$/g, ''); + var configPath = + (scopePath ? '/' + scopePath : '.') + '/config/' + appCode + '.json'; + var configURL = new URL(configPath, window.location.origin + window.location.pathname); + return window + .fetch(configURL.toString(), { cache: shouldPersist() ? 'default' : 'no-store' }) + .then(function (response) { + if (!response.ok) return null; + return response.json(); + }) + .then(function (config) { + return setAppConfig(config); + }) + .catch(function () { + activeAppConfig = null; + return null; + }); + } + function errorMessageForResponse(response, payload) { if (response.status === 409) return 'Duplicate request.'; return payload.message || response.statusText || 'request_failed'; @@ -276,7 +324,11 @@ var default_api = 'https://api.global-interaction.com/'; function request(path, options) { var opts = options || {}; - var headers = Object.assign({}, opts.headers || {}); + var headers = Object.assign( + {}, + (activeAppConfig && activeAppConfig.headers) || {}, + opts.headers || {} + ); var token = getAccessToken(); var appCode = getAppCode(); var url = buildURL(path, opts.query); @@ -378,20 +430,139 @@ var default_api = 'https://api.global-interaction.com/'; // H5 充值 API 只做路径和参数名封装;token、app_code、env、错误 envelope 仍由 request 统一处理。 // 金额、金币数、普通/币商钱包、MiFaPay 参数和 USDT 链上校验都以后端订单快照为准。 + function isAslanWebPay() { + return activeAppConfig && activeAppConfig.adapter === 'aslan-web-pay'; + } + + function appEndpoint(name, fallback) { + return ( + (activeAppConfig && + activeAppConfig.endpoints && + activeAppConfig.endpoints[name]) || + fallback + ); + } + + function aslanUserQuery(displayUserID) { + var value = String(displayUserID || '').trim(); + var query = { + applicationId: activeAppConfig.application_id, + type: activeAppConfig.type || 'GOLD', + sysOrigin: activeAppConfig.sys_origin || 'ATYOU', + }; + if (/^\d+$/.test(value)) { + query.userId = value; + } else if (value) { + query.account = value; + } + return query; + } + + function aslanPaymentMethods(options) { + var providers = (activeAppConfig && activeAppConfig.providers) || {}; + var mifapay = providers.mifapay || {}; + var countries = mifapay.countries || []; + var countryCode = String( + options.country_code || options.countryCode || '' + ).toUpperCase(); + var candidates = countries.filter(function (country) { + return ( + String(country.country_code || '').toUpperCase() === countryCode || + String(country.country_code || '').toUpperCase() === 'GLOBAL' + ); + }); + var methods = []; + candidates.forEach(function (country) { + (country.methods || []).forEach(function (method, index) { + methods.push( + Object.assign({}, method, { + method_id: [ + mifapay.provider_code || 'mifapay', + country.country_code, + method.pay_way, + method.pay_type, + index, + ].join(':'), + provider_code: mifapay.provider_code || 'mifapay', + provider_name: mifapay.provider_name || 'MiFaPay', + country_code: country.country_code, + country_name: country.country_name, + currency_code: + country.country_code === 'GLOBAL' + ? options.currency_code || country.currency_code + : country.currency_code, + usd_to_currency_rate: + options.usd_to_currency_rate || + options.usdToCurrencyRate || + 0, + pay_country_id: + options.pay_country_id || + options.payCountryId || + '', + status: mifapay.status || 'active', + }) + ); + }); + }); + return methods; + } + var rechargeAPI = { context: function (displayUserID) { + if (isAslanWebPay()) { + return request(appEndpoint('context', '/order/web/pay/h5/context'), { + method: 'GET', + query: aslanUserQuery(displayUserID), + }); + } return request('/api/v1/recharge/h5/context', { method: 'GET', query: { display_user_id: displayUserID || '' }, }); }, - options: function (displayUserID) { + options: function (displayUserID, extra) { + if (isAslanWebPay()) { + var query = Object.assign(aslanUserQuery(displayUserID), { + payCountryId: + extra && (extra.pay_country_id || extra.payCountryId), + regionId: extra && (extra.region_id || extra.regionId), + userId: extra && (extra.user_id || extra.userId), + }); + return request(appEndpoint('options', '/order/web/pay/h5/options'), { + method: 'GET', + query: query, + }).then(function (options) { + options = options || {}; + options.payment_methods = aslanPaymentMethods(options); + options.usdt_trc20_enabled = false; + return options; + }); + } return request('/api/v1/recharge/h5/options', { method: 'GET', query: { display_user_id: displayUserID || '' }, }); }, createOrder: function (payload) { + if (isAslanWebPay()) { + return request(appEndpoint('orders', '/order/web/pay/h5/orders'), { + method: 'POST', + body: { + applicationId: activeAppConfig.application_id, + goodsId: payload && payload.product_id, + payCountryId: payload && payload.pay_country_id, + userId: payload && payload.user_id, + providerCode: payload && payload.provider_code, + payWay: payload && payload.pay_way, + payType: payload && payload.pay_type, + channelCode: payload && payload.channel_code, + returnUrl: payload && payload.return_url, + commandId: payload && payload.command_id, + type: (activeAppConfig && activeAppConfig.type) || 'GOLD', + language: readLanguageQuery() || 'en', + }, + }); + } return request('/api/v1/recharge/h5/orders', { method: 'POST', query: { language: readLanguageQuery() }, @@ -410,6 +581,15 @@ var default_api = 'https://api.global-interaction.com/'; ); }, getOrder: function (orderID, displayUserID) { + if (isAslanWebPay()) { + return request( + appEndpoint('order', '/order/web/pay/h5/orders/{orderId}').replace( + '{orderId}', + encodeURIComponent(orderID || '') + ), + { method: 'GET' } + ); + } return request( '/api/v1/recharge/h5/orders/' + encodeURIComponent(orderID || ''), @@ -976,6 +1156,9 @@ var default_api = 'https://api.global-interaction.com/'; getAppCode: getAppCode, setAccessToken: setAccessToken, setAppCode: setAppCode, + setAppConfig: setAppConfig, + getAppConfig: getAppConfig, + loadAppConfig: loadAppConfig, request: request, get: function (path, query) { return request(path, { method: 'GET', query: query }); diff --git a/common/params.js b/common/params.js index 605e8a0..e49387e 100644 --- a/common/params.js +++ b/common/params.js @@ -1,6 +1,6 @@ (function () { var TOKEN_KEYS = ['token', 'access_token', 'accessToken']; - var APP_CODE_KEYS = ['app_code', 'appCode']; + var APP_CODE_KEYS = ['app', 'app_code', 'appCode']; var USER_READY_EVENT = 'hyapp:user-ready'; var USER_ERROR_EVENT = 'hyapp:user-error'; diff --git a/recharge/config/aslan.json b/recharge/config/aslan.json new file mode 100644 index 0000000..bc19892 --- /dev/null +++ b/recharge/config/aslan.json @@ -0,0 +1,193 @@ +{ + "app": "aslan", + "adapter": "aslan-web-pay", + "application_id": "1963531459019739137", + "sys_origin": "ATYOU", + "type": "GOLD", + "api": { + "prod": "https://api.atuchat.com/", + "test": "https://api.atuchat.com/", + "local": "http://127.0.0.1:1100/" + }, + "headers": { + "req-sys-origin": "origin=ATYOU;originChild=ATYOU", + "Req-Atyou": "true" + }, + "endpoints": { + "context": "/order/web/pay/h5/context", + "options": "/order/web/pay/h5/options", + "orders": "/order/web/pay/h5/orders", + "order": "/order/web/pay/h5/orders/{orderId}" + }, + "providers": { + "mifapay": { + "provider_code": "mifapay", + "provider_name": "MiFaPay", + "status": "active", + "countries": [ + { + "country_code": "AE", + "country_name": "United Arab Emirates", + "currency_code": "AED", + "methods": [ + { "pay_way": "Card", "pay_type": "CreditCard", "method_name": "UAE Credit Card", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/ae/card-creditcard.png" } + ] + }, + { + "country_code": "BD", + "country_name": "Bangladesh", + "currency_code": "BDT", + "methods": [ + { "pay_way": "Ewallet", "pay_type": "Nagad", "method_name": "Nagad", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/bd/ewallet-nagad.png" }, + { "pay_way": "Ewallet", "pay_type": "bKash", "method_name": "bKash", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/bd/ewallet-bkash.png" } + ] + }, + { + "country_code": "BH", + "country_name": "Bahrain", + "currency_code": "BHD", + "methods": [ + { "pay_way": "Card", "pay_type": "CreditCard", "method_name": "Bahrain Credit Card", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/bh/card-creditcard.png" } + ] + }, + { + "country_code": "EG", + "country_name": "Egypt", + "currency_code": "EGP", + "methods": [ + { "pay_way": "Card", "pay_type": "CreditCard", "method_name": "Egypt Credit Card", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/eg/card-creditcard.png" }, + { "pay_way": "Ewallet", "pay_type": "FawryPay", "method_name": "FawryPay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/eg/ewallet-fawrypay.png" }, + { "pay_way": "Ewallet", "pay_type": "Meeza", "method_name": "Meeza", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/eg/ewallet-meeza.png" }, + { "pay_way": "Ewallet", "pay_type": "Opay", "method_name": "Opay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/eg/ewallet-opay.png" }, + { "pay_way": "Ewallet", "pay_type": "Orange", "method_name": "Orange", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/eg/ewallet-orange.png" }, + { "pay_way": "Ewallet", "pay_type": "Vodafone", "method_name": "Vodafone", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/eg/ewallet-vodafone.png" } + ] + }, + { + "country_code": "GLOBAL", + "country_name": "Global", + "currency_code": "USD", + "methods": [ + { "pay_way": "BankTransfer", "pay_type": "UnionPay", "method_name": "UnionPay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/global/banktransfer-unionpay.png" }, + { "pay_way": "Card", "pay_type": "CreditCard", "method_name": "Credit Card", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/global/card-creditcard.png" }, + { "pay_way": "Ewallet", "pay_type": "ApplePay", "method_name": "Apple Pay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/global/ewallet-applepay.png" }, + { "pay_way": "Ewallet", "pay_type": "GooglePay", "method_name": "Google Pay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/global/ewallet-googlepay.png" } + ] + }, + { + "country_code": "ID", + "country_name": "Indonesia", + "currency_code": "IDR", + "methods": [ + { "pay_way": "BankTransfer", "pay_type": "BCA", "method_name": "BCA Bank", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/banktransfer-bca.png" }, + { "pay_way": "BankTransfer", "pay_type": "BNI", "method_name": "BNI Bank", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/banktransfer-bni.png" }, + { "pay_way": "BankTransfer", "pay_type": "BRI", "method_name": "BRI Bank", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/banktransfer-bri.png" }, + { "pay_way": "BankTransfer", "pay_type": "Mandiri", "method_name": "Mandiri Bank", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/banktransfer-mandiri.png" }, + { "pay_way": "BankTransfer", "pay_type": "Permata", "method_name": "Permata Bank", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/banktransfer-permata.png" }, + { "pay_way": "BankTransfer", "pay_type": "QRIS", "method_name": "QRIS Bank Transfer", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/banktransfer-qris.png" }, + { "pay_way": "Ewallet", "pay_type": "DANA", "method_name": "DANA", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/ewallet-dana.png" }, + { "pay_way": "Ewallet", "pay_type": "LinkAja", "method_name": "LinkAja", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/ewallet-linkaja.png" }, + { "pay_way": "Ewallet", "pay_type": "OVO", "method_name": "OVO", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/ewallet-ovo.png" }, + { "pay_way": "Ewallet", "pay_type": "ShopeePay", "method_name": "ShopeePay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/ewallet-shopeepay.png" }, + { "pay_way": "QR", "pay_type": "QRIS", "method_name": "QRIS", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/id/qr-qris.png" } + ] + }, + { + "country_code": "IN", + "country_name": "India", + "currency_code": "INR", + "methods": [ + { "pay_way": "Ewallet", "pay_type": "BHIM", "method_name": "BHIM", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/in/ewallet-bhim.png" }, + { "pay_way": "Ewallet", "pay_type": "GooglePay", "method_name": "Google Pay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/in/ewallet-googlepay.png" }, + { "pay_way": "Ewallet", "pay_type": "Mobikwik", "method_name": "Mobikwik", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/in/ewallet-mobikwik.png" }, + { "pay_way": "Ewallet", "pay_type": "Paytm", "method_name": "Paytm", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/in/ewallet-paytm.png" }, + { "pay_way": "Ewallet", "pay_type": "PhonePe", "method_name": "PhonePe", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/in/ewallet-phonepe.png" }, + { "pay_way": "Ewallet", "pay_type": "UPI", "method_name": "UPI", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/in/ewallet-upi.png" } + ] + }, + { + "country_code": "KW", + "country_name": "Kuwait", + "currency_code": "KWD", + "methods": [ + { "pay_way": "Card", "pay_type": "KENT", "method_name": "KENT", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/kw/card-kent.png" }, + { "pay_way": "Card", "pay_type": "Knet", "method_name": "KNET", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/kw/card-knet.png" } + ] + }, + { + "country_code": "MY", + "country_name": "Malaysia", + "currency_code": "MYR", + "methods": [ + { "pay_way": "BankTransfer", "pay_type": "FPX", "method_name": "FPX", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/my/banktransfer-fpx.png" }, + { "pay_way": "Ewallet", "pay_type": "TNG", "method_name": "Touch n Go", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/my/ewallet-tng.png" } + ] + }, + { + "country_code": "OM", + "country_name": "Oman", + "currency_code": "OMR", + "methods": [ + { "pay_way": "Card", "pay_type": "CreditCard", "method_name": "Oman Credit Card", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/om/card-creditcard.png" } + ] + }, + { + "country_code": "PH", + "country_name": "Philippines", + "currency_code": "PHP", + "methods": [ + { "pay_way": "BankTransfer", "pay_type": "QRPH", "method_name": "QRPH Bank Transfer", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/ph/banktransfer-qrph.png" }, + { "pay_way": "Ewallet", "pay_type": "Gcash", "method_name": "GCash", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/ph/ewallet-gcash.png" }, + { "pay_way": "Ewallet", "pay_type": "PayMaya", "method_name": "PayMaya", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/ph/ewallet-paymaya.png" }, + { "pay_way": "QR", "pay_type": "QRPH", "method_name": "QRPH", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/ph/qr-qrph.png" } + ] + }, + { + "country_code": "PK", + "country_name": "Pakistan", + "currency_code": "PKR", + "methods": [ + { "pay_way": "Ewallet", "pay_type": "Easypaisa", "method_name": "Easypaisa", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/pk/ewallet-easypaisa.png" }, + { "pay_way": "Ewallet", "pay_type": "JazzCash", "method_name": "JazzCash", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/pk/ewallet-jazzcash.png" } + ] + }, + { + "country_code": "QA", + "country_name": "Qatar", + "currency_code": "QAR", + "methods": [ + { "pay_way": "Card", "pay_type": "CreditCard", "method_name": "Qatar Credit Card", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/qa/card-creditcard.png" } + ] + }, + { + "country_code": "SA", + "country_name": "Saudi Arabia", + "currency_code": "SAR", + "methods": [ + { "pay_way": "Card", "pay_type": "MADA", "method_name": "MADA", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/sa/card-mada.png" }, + { "pay_way": "Ewallet", "pay_type": "ApplePay", "method_name": "Apple Pay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/sa/ewallet-applepay.png" }, + { "pay_way": "Ewallet", "pay_type": "STCPay", "method_name": "STCPay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/sa/ewallet-stcpay.png" } + ] + }, + { + "country_code": "TH", + "country_name": "Thailand", + "currency_code": "THB", + "methods": [ + { "pay_way": "BankTransfer", "pay_type": "PromptPay", "method_name": "PromptPay", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/th/banktransfer-promptpay.png" }, + { "pay_way": "Ewallet", "pay_type": "TrueMoney", "method_name": "TrueMoney", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/th/ewallet-truemoney.png" } + ] + }, + { + "country_code": "VN", + "country_name": "Vietnam", + "currency_code": "VND", + "methods": [ + { "pay_way": "BankTransfer", "pay_type": "VN_BankTransfer", "method_name": "Vietnam Bank Transfer", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/vn/banktransfer-vn-banktransfer.png" }, + { "pay_way": "QR", "pay_type": "VietQR", "method_name": "VietQR", "logo_url": "https://media.haiyihy.com/admin/payment/mifapay/logos/vn/qr-vietqr.png" } + ] + } + ] + } + } +} diff --git a/recharge/index.html b/recharge/index.html index b89b01f..a49eaef 100644 --- a/recharge/index.html +++ b/recharge/index.html @@ -1064,6 +1064,10 @@ var state = { context: null, options: null, + appConfig: null, + selectedPayCountryID: '', + selectedCountryCode: '', + selectedCurrencyCode: '', selectedProductID: 0, selectedMethodKey: '', order: null, @@ -1149,6 +1153,25 @@ (pendingOrder && pendingOrder.display_user_id) || ''; nodes.displayUserID.value = displayUserID; + var configReady = + window.HyAppAPI && window.HyAppAPI.loadAppConfig + ? window.HyAppAPI.loadAppConfig('recharge') + : Promise.resolve(null); + configReady + .then(function (config) { + state.appConfig = + config || + (window.HyAppAPI && + window.HyAppAPI.getAppConfig + ? window.HyAppAPI.getAppConfig() + : null); + }) + .finally(function () { + continueInit(current, displayUserID); + }); + } + + function continueInit(current, displayUserID) { if (current.token) { // token 模式必须隐藏账号输入,目标用户只能由服务端鉴权结果决定,不能让前端改充值对象。 nodes.accountSearch.classList.add('hidden'); @@ -1216,10 +1239,18 @@ .then(function (context) { // context 只返回安全账号信息和 audience_type;前端不读取手机号、邮箱、余额等敏感字段。 state.context = context; + selectPayCountryFromContext(context); return window.HyAppAPI.recharge.options( context.auth_mode === 'token' ? '' - : context.account.display_user_id + : context.account.display_user_id, + { + pay_country_id: state.selectedPayCountryID, + country_code: state.selectedCountryCode, + region_id: + context.region_id || context.regionId, + user_id: currentAccountUserID(), + } ); }) .then(function (options) { @@ -1308,6 +1339,9 @@ var previousID = currentAccountDisplayUserID(); state.context = null; state.options = null; + state.selectedPayCountryID = ''; + state.selectedCountryCode = ''; + state.selectedCurrencyCode = ''; state.selectedProductID = 0; state.selectedMethodKey = ''; state.order = null; @@ -1550,6 +1584,22 @@ providerCode: method.provider_code || 'mifapay', methodID: method.method_id, + payCountryID: + method.pay_country_id || + state.selectedPayCountryID, + countryCode: + method.country_code || + state.selectedCountryCode, + currencyCode: + method.currency_code || + state.selectedCurrencyCode, + payWay: method.pay_way, + payType: method.pay_type, + channelCode: + method.channel_code || + [method.pay_way, method.pay_type] + .filter(Boolean) + .join('_'), }); }); return methods; @@ -1582,8 +1632,21 @@ .createOrder({ display_user_id: targetDisplayUserID(), product_id: product.product_id, + user_id: currentAccountUserID(), + pay_country_id: + method.payCountryID || + state.selectedPayCountryID, provider_code: method.providerCode, payment_method_id: method.methodID || 0, + pay_way: method.payWay || '', + pay_type: method.payType || '', + channel_code: method.channelCode || '', + country_code: + method.countryCode || + state.selectedCountryCode, + currency_code: + method.currencyCode || + state.selectedCurrencyCode, command_id: commandID(product, method), return_url: externalPayReturnURL(), }) @@ -2076,6 +2139,16 @@ : ''; } + function currentAccountUserID() { + if (!state.context || !state.context.account) return ''; + return ( + state.context.account.user_id || + state.context.account.userId || + state.context.account.id || + '' + ); + } + function isTerminalOrder(order) { return ( !!order && @@ -2111,6 +2184,10 @@ ); } if (window.HyAppAPI && window.HyAppAPI.getAppCode) { + url.searchParams.set( + 'app', + window.HyAppAPI.getAppCode() + ); url.searchParams.set( 'app_code', window.HyAppAPI.getAppCode() @@ -2167,6 +2244,34 @@ return params; } + function selectPayCountryFromContext(context) { + var countries = + (context && (context.country_list || context.countryList)) || + []; + var selected = countries[0] || {}; + state.selectedPayCountryID = + selected.pay_country_id || + selected.payCountryId || + selected.id || + ''; + state.selectedCountryCode = String( + selected.country_code || + selected.countryCode || + firstValue(selected.country || {}, [ + 'alphaTwo', + 'alpha_two', + 'countryCode', + 'country_code', + ]) || + '' + ).toUpperCase(); + state.selectedCurrencyCode = + selected.currency_code || + selected.currencyCode || + state.selectedCurrencyCode || + ''; + } + // command_id 给服务端幂等使用,包含时间、商品、方式和随机后缀;真实订单号仍由后端生成。 // 三方拒单会把本地订单置失败,后续重用同一 command_id 只会回放旧失败结果,所以每次点击都必须生成新命令。 function commandID(product, method) {