diff --git a/common/api.js b/common/api.js index f77da87..2ef11f9 100644 --- a/common/api.js +++ b/common/api.js @@ -295,14 +295,23 @@ var default_api = 'https://api.global-interaction.com/'; throw httpError; } var code = payload && payload.code; + var errorCode = payload && payload.errorCode; var isErrorCode = (typeof code === 'number' && code !== 0) || - (typeof code === 'string' && code !== '' && code !== 'OK'); + (typeof code === 'string' && code !== '' && code !== 'OK') || + (typeof errorCode === 'number' && errorCode !== 0) || + (typeof errorCode === 'string' && + errorCode !== '' && + errorCode !== '0' && + errorCode !== 'OK'); if (isErrorCode) { var apiError = new Error( - payload.message || 'api_request_failed' + payload.message || + payload.errorMsg || + payload.error || + 'api_request_failed' ); - apiError.code = payload.code; + apiError.code = payload.code || payload.errorCode; apiError.request_id = payload.request_id; apiError.payload = payload; throw apiError; @@ -310,6 +319,9 @@ var default_api = 'https://api.global-interaction.com/'; return payload && Object.prototype.hasOwnProperty.call(payload, 'data') ? payload.data + : payload && + Object.prototype.hasOwnProperty.call(payload, 'body') + ? payload.body : payload; }); } @@ -434,6 +446,14 @@ var default_api = 'https://api.global-interaction.com/'; return activeAppConfig && activeAppConfig.adapter === 'aslan-web-pay'; } + function isYumiWebPay() { + return activeAppConfig && activeAppConfig.adapter === 'yumi-web-pay'; + } + + function isConfiguredWebPay() { + return isAslanWebPay() || isYumiWebPay(); + } + function appEndpoint(name, fallback) { return ( (activeAppConfig && @@ -459,6 +479,12 @@ var default_api = 'https://api.global-interaction.com/'; return query; } + function configuredWebPayUserQuery(displayUserID) { + return Object.assign(aslanUserQuery(displayUserID), { + sysOrigin: activeAppConfig.sys_origin || 'LIKEI', + }); + } + function aslanPaymentMethods(options) { var providers = (activeAppConfig && activeAppConfig.providers) || {}; var mifapay = providers.mifapay || {}; @@ -508,6 +534,246 @@ var default_api = 'https://api.global-interaction.com/'; return methods; } + function firstValue(object, keys) { + object = object || {}; + for (var i = 0; i < keys.length; i += 1) { + var value = object[keys[i]]; + if (value !== undefined && value !== null && value !== '') + return value; + } + return ''; + } + + function normalizeCountryCode(value) { + return String(value || '') + .trim() + .toUpperCase(); + } + + function countryCodeFromCountry(country) { + country = country || {}; + return normalizeCountryCode( + firstValue(country, [ + 'alphaTwo', + 'alpha_two', + 'countryCode', + 'country_code', + 'code', + ]) + ); + } + + function countryNameFromCountry(country) { + return firstValue(country, [ + 'aliasName', + 'enName', + 'countryName', + 'country_name', + 'name', + ]); + } + + function normalizeAmountUsd(value) { + var amount = Number(value || 0); + return Number.isFinite(amount) && amount > 0 ? amount : 0; + } + + function decimalToMinor(value) { + return Math.round(normalizeAmountUsd(value) * 100); + } + + function mapYumiContext(context) { + context = context || {}; + var profile = context.userProfile || context.user_profile || {}; + var countryList = context.countryList || context.country_list || []; + var selectedCountry = countryList[0] || {}; + var country = selectedCountry.country || {}; + var countryCode = + normalizeCountryCode(profile.countryCode || profile.country_code) || + countryCodeFromCountry(country); + return { + auth_mode: 'display_user_id', + account: { + id: profile.id || '', + user_id: profile.id || '', + userId: profile.id || '', + display_user_id: profile.account || profile.id || '', + username: profile.userNickname || profile.user_nickname || '', + avatar: profile.userAvatar || profile.user_avatar || '', + country_code: countryCode, + countryCode: countryCode, + country_name: + profile.countryName || + profile.country_name || + countryNameFromCountry(country), + countryName: + profile.countryName || + profile.country_name || + countryNameFromCountry(country), + }, + country_list: countryList.map(function (item) { + var itemCountry = item.country || {}; + return { + id: item.id || '', + pay_country_id: + item.payCountryId || item.pay_country_id || item.id || '', + payCountryId: + item.payCountryId || item.pay_country_id || item.id || '', + country_id: item.countryId || item.country_id || '', + currency_code: item.currency || item.currency_code || '', + currencyCode: item.currency || item.currency_code || '', + country_code: countryCodeFromCountry(itemCountry), + countryCode: countryCodeFromCountry(itemCountry), + country_name: countryNameFromCountry(itemCountry), + countryName: countryNameFromCountry(itemCountry), + country: itemCountry, + }; + }), + region_id: context.regionId || context.region_id || '', + regionId: context.regionId || context.region_id || '', + raw: context, + }; + } + + function mapYumiOptions(options) { + options = options || {}; + var products = (options.commodity || options.products || []).map( + function (item) { + var content = Number(item.content || 0); + var awardContent = Number(item.awardContent || item.award_content || 0); + var amountUsd = normalizeAmountUsd(item.amountUsd || item.amount_usd); + return { + product_id: item.id, + productId: item.id, + pay_country_id: + item.payCountryId || + item.pay_country_id || + options.payCountryId || + options.pay_country_id || + '', + coin_amount: + (Number.isFinite(content) ? content : 0) + + (Number.isFinite(awardContent) ? awardContent : 0), + base_coin_amount: Number.isFinite(content) ? content : 0, + award_coin_amount: Number.isFinite(awardContent) + ? awardContent + : 0, + amount_usdt: amountUsd, + amount_usdt_micro: Math.round(amountUsd * 1000000), + amount_minor: decimalToMinor(amountUsd), + currency_code: item.currency || item.currency_code || '', + raw: item, + }; + } + ); + var firstProduct = products[0] || {}; + var countryCode = normalizeCountryCode( + options.country_code || options.countryCode || '' + ); + var currencyCode = + options.currency_code || + options.currencyCode || + firstProduct.currency_code || + ''; + return { + products: products, + payment_methods: yumiPaymentMethods( + Object.assign({}, options, { + pay_country_id: + options.payCountryId || + options.pay_country_id || + firstProduct.pay_country_id || + '', + country_code: countryCode, + currency_code: currencyCode, + usd_to_currency_rate: + options.usd_to_currency_rate || + options.usdToCurrencyRate || + 0, + }) + ), + pay_country_id: + options.payCountryId || + options.pay_country_id || + firstProduct.pay_country_id || + '', + country_code: countryCode, + currency_code: currencyCode, + usd_to_currency_rate: + options.usd_to_currency_rate || options.usdToCurrencyRate || 0, + usdt_trc20_enabled: false, + raw: options, + }; + } + + function yumiPaymentMethods(options) { + var channels = (options.raw && options.raw.channels) || options.channels || []; + var supported = {}; + channels.forEach(function (item) { + var channel = item.channel || {}; + var details = item.details || {}; + [ + channel.channelCode, + channel.channel_code, + details.channelCode, + details.channel_code, + ].forEach(function (code) { + if (code) supported[String(code)] = item; + }); + }); + return aslanPaymentMethods(options).filter(function (method) { + var channelCode = + method.channel_code || + [method.pay_way, method.pay_type].filter(Boolean).join('_'); + if (!Object.keys(supported).length) return true; + return !!supported[channelCode]; + }); + } + + function mapYumiOrder(order) { + order = order || {}; + var factoryCode = String( + order.factoryCode || order.factory_code || '' + ).toUpperCase(); + return { + order_id: order.orderId || order.order_id || '', + trade_no: order.tradeNo || order.trade_no || '', + provider_code: factoryCode === 'MIFA_PAY' ? 'mifapay' : factoryCode, + factory_code: factoryCode, + pay_url: order.requestUrl || order.request_url || order.pay_url || '', + currency_code: order.currency || order.currency_code || '', + country_code: order.countryCode || order.country_code || '', + provider_amount_minor: decimalToMinor(order.amount), + status: 'pending', + raw: order, + }; + } + + function mapYumiOrderStatus(order) { + order = order || {}; + var status = String(order.status || '').toUpperCase(); + var normalized = + order.success === true || status === 'SUCCESS' + ? 'credited' + : order.finished === true || status === 'FAIL' + ? 'failed' + : 'pending'; + var factoryCode = String( + order.factoryCode || order.factory_code || '' + ).toUpperCase(); + return { + order_id: order.orderId || order.order_id || '', + trade_no: order.tradeNo || order.trade_no || '', + provider_code: factoryCode === 'MIFA_PAY' ? 'mifapay' : factoryCode, + factory_code: factoryCode, + currency_code: order.currency || order.currency_code || '', + provider_amount_minor: decimalToMinor(order.amount), + status: normalized, + failure_reason: order.reason || '', + raw: order, + }; + } + var rechargeAPI = { context: function (displayUserID) { if (isAslanWebPay()) { @@ -516,13 +782,19 @@ var default_api = 'https://api.global-interaction.com/'; query: aslanUserQuery(displayUserID), }); } + if (isYumiWebPay()) { + return request(appEndpoint('context', '/order/web/pay/user-profile'), { + method: 'GET', + query: configuredWebPayUserQuery(displayUserID), + }).then(mapYumiContext); + } return request('/api/v1/recharge/h5/context', { method: 'GET', query: { display_user_id: displayUserID || '' }, }); }, options: function (displayUserID, extra) { - if (isAslanWebPay()) { + if (isConfiguredWebPay()) { var query = Object.assign(aslanUserQuery(displayUserID), { payCountryId: extra && (extra.pay_country_id || extra.payCountryId), @@ -536,6 +808,14 @@ var default_api = 'https://api.global-interaction.com/'; query: query, }).then(function (options) { options = options || {}; + if (isYumiWebPay()) { + return mapYumiOptions( + Object.assign({}, options, { + country_code: + query.countryCode || options.country_code, + }) + ); + } options.payment_methods = aslanPaymentMethods(options); options.usdt_trc20_enabled = false; return options; @@ -566,6 +846,20 @@ var default_api = 'https://api.global-interaction.com/'; }, }); } + if (isYumiWebPay()) { + return request(appEndpoint('orders', '/order/web/pay/recharge'), { + method: 'POST', + body: { + applicationId: activeAppConfig.application_id, + goodsId: payload && payload.product_id, + payCountryId: payload && payload.pay_country_id, + userId: payload && payload.user_id, + channelCode: payload && payload.channel_code, + newVersion: true, + appVersion: 'h5', + }, + }).then(mapYumiOrder); + } return request('/api/v1/recharge/h5/orders', { method: 'POST', query: { language: readLanguageQuery() }, @@ -593,6 +887,15 @@ var default_api = 'https://api.global-interaction.com/'; { method: 'GET' } ); } + if (isYumiWebPay()) { + return request(appEndpoint('order', '/order/web/pay/order-status'), { + method: 'GET', + query: { + orderId: orderID || '', + userId: displayUserID || '', + }, + }).then(mapYumiOrderStatus); + } return request( '/api/v1/recharge/h5/orders/' + encodeURIComponent(orderID || ''), diff --git a/recharge/config/yumi.json b/recharge/config/yumi.json new file mode 100644 index 0000000..5b92d5d --- /dev/null +++ b/recharge/config/yumi.json @@ -0,0 +1,194 @@ +{ + "app": "yumi", + "adapter": "yumi-web-pay", + "application_id": "2048200000000000701", + "sys_origin": "LIKEI", + "type": "GOLD", + "api": { + "prod": "https://jvapi.haiyihy.com/", + "test": "https://jvapi.haiyihy.com/", + "local": "http://127.0.0.1:13000/" + }, + "headers": { + "Req-Sys-Origin": "origin=LIKEI;originChild=LIKEI;", + "Req-Client": "H5", + "Req-App-Intel": "version=1.0.0;build=1;channel=h5;" + }, + "endpoints": { + "context": "/order/web/pay/user-profile", + "options": "/order/web/pay/commodity", + "orders": "/order/web/pay/recharge", + "order": "/order/web/pay/order-status" + }, + "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 7c656bb..3e9f3c0 100644 --- a/recharge/index.html +++ b/recharge/index.html @@ -1385,11 +1385,12 @@ products.length > 0 ); products.forEach(function (product) { + var currentProductID = productID(product); var button = document.createElement('button'); button.type = 'button'; button.className = 'choice' + - (product.product_id === state.selectedProductID + (currentProductID === state.selectedProductID ? ' is-selected' : ''); button.innerHTML = @@ -1401,7 +1402,7 @@ escapeHTML(formatUSD(product)) + ''; button.addEventListener('click', function () { - state.selectedProductID = product.product_id; + state.selectedProductID = currentProductID; // 档位、支付方式和订单必须是一组同源快照;切档位时清空旧支付方式和旧订单,防止旧金额被带入新订单。 state.selectedMethodKey = ''; state.order = null; @@ -1641,7 +1642,7 @@ window.HyAppAPI.recharge .createOrder({ display_user_id: targetDisplayUserID(), - product_id: product.product_id, + product_id: productID(product), user_id: currentAccountUserID(), pay_country_id: method.payCountryID || @@ -1769,7 +1770,7 @@ renderOrder(); } return window.HyAppAPI.recharge - .getOrder(state.order.order_id, targetDisplayUserID()) + .getOrder(state.order.order_id, orderStatusUserID()) .then(function (payload) { state.order = payload.order || payload; renderOrder(); @@ -1811,7 +1812,7 @@ window.HyAppAPI.recharge .getOrder( pending.order_id, - targetDisplayUserID() || pending.display_user_id + orderStatusUserID() || pending.display_user_id ) .then(function (payload) { state.order = payload.order || payload; @@ -2083,7 +2084,7 @@ ((state.options && state.options.products) || []).find( function (item) { return ( - item.product_id === state.selectedProductID + productID(item) === state.selectedProductID ); } ) || null @@ -2109,10 +2110,10 @@ return; } var hasSelectedProduct = products.some(function (product) { - return product.product_id === state.selectedProductID; + return productID(product) === state.selectedProductID; }); if (!hasSelectedProduct) { - state.selectedProductID = products[0].product_id; + state.selectedProductID = productID(products[0]); } var methods = availableMethods(); if (!methods.length) { @@ -2159,6 +2160,10 @@ ); } + function orderStatusUserID() { + return currentAccountUserID() || targetDisplayUserID(); + } + function isTerminalOrder(order) { return ( !!order && @@ -2393,12 +2398,22 @@ return [ 'h5', Date.now(), - product.product_id, + productID(product), method.key.replace(/[^a-zA-Z0-9_:-]/g, ''), randomCommandSuffix(), ].join(':'); } + function productID(product) { + product = product || {}; + return String( + product.product_id || + product.productId || + product.id || + '' + ); + } + function randomCommandSuffix() { if ( window.crypto &&