fix wechat mini program virtual payment flow

This commit is contained in:
kdletters
2026-05-28 00:41:06 +08:00
parent b43c3cd823
commit 9c6fa10301
10 changed files with 335 additions and 57 deletions

View File

@@ -64,6 +64,23 @@ function resolvePayStatus(error) {
return errCode === -2 || /cancel/i.test(errMsg) ? 'cancel' : 'fail';
}
function normalizePayError(error) {
if (!error) {
return '';
}
if (typeof error === 'string') {
return error;
}
try {
return JSON.stringify({
errCode: error.errCode,
errMsg: error.errMsg,
});
} catch (_error) {
return String(error.errMsg || error);
}
}
function requestOrdinaryPayment(payParams) {
return new Promise((resolve) => {
wx.requestPayment({
@@ -73,10 +90,13 @@ function requestOrdinaryPayment(payParams) {
signType: payParams.signType || 'RSA',
paySign: String(payParams.paySign || ''),
success() {
resolve('success');
resolve({ status: 'success', errorMessage: '' });
},
fail(error) {
resolve(resolvePayStatus(error));
resolve({
status: resolvePayStatus(error),
errorMessage: normalizePayError(error),
});
},
});
});
@@ -85,7 +105,10 @@ function requestOrdinaryPayment(payParams) {
function requestVirtualPayment(payParams) {
return new Promise((resolve) => {
if (!canUseVirtualPayment() || typeof wx.requestVirtualPayment !== 'function') {
resolve('fail');
resolve({
status: 'fail',
errorMessage: '当前微信基础库不支持 requestVirtualPayment',
});
return;
}
wx.requestVirtualPayment({
@@ -94,10 +117,13 @@ function requestVirtualPayment(payParams) {
paySig: String(payParams.paySig || ''),
signature: String(payParams.signature || ''),
success() {
resolve('success');
resolve({ status: 'success', errorMessage: '' });
},
fail(error) {
resolve(resolvePayStatus(error));
resolve({
status: resolvePayStatus(error),
errorMessage: normalizePayError(error),
});
},
});
});
@@ -112,8 +138,7 @@ function requestWechatPayment(payParams) {
const PAY_RESULT_STORAGE_KEY = 'genarrative:wechat-pay-result';
function appendPayResult(url, requestId, status) {
const value = `${requestId}:${status}`;
function appendPayResult(url, result) {
const hashIndex = String(url || '').indexOf('#');
const baseUrl =
hashIndex >= 0 ? String(url).slice(0, hashIndex) : String(url || '');
@@ -121,23 +146,27 @@ function appendPayResult(url, requestId, status) {
const nextHash = rawHash
.split('&')
.filter((part) => part && !part.startsWith('wx_pay_result='))
.concat(`wx_pay_result=${encodeURIComponent(value)}`)
.concat(`wx_pay_result=${encodeURIComponent(result)}`)
.join('&');
return `${baseUrl}#${nextHash}`;
}
function notifyPreviousWebView(requestId, status) {
const result = `${requestId}:${status}`;
function buildPayResultValue(requestId, orderId, payResult) {
const segments = [requestId, payResult.status, orderId || ''];
if (payResult.errorMessage) {
segments.push(encodeURIComponent(payResult.errorMessage));
}
return segments.join(':');
}
function notifyPreviousWebView(requestId, orderId, payResult) {
const result = buildPayResultValue(requestId, orderId, payResult);
wx.setStorageSync(PAY_RESULT_STORAGE_KEY, result);
const pages = getCurrentPages();
const previousPage = pages.length >= 2 ? pages[pages.length - 2] : null;
if (previousPage && typeof previousPage.setData === 'function') {
previousPage.setData({
webViewUrl: appendPayResult(
previousPage.data.webViewUrl,
requestId,
status,
),
webViewUrl: appendPayResult(previousPage.data.webViewUrl, result),
});
}
}
@@ -151,6 +180,7 @@ function createWechatPayPage(pageContext) {
async onLoad(query) {
const requestId = String(query.requestId || '');
const orderId = String(query.orderId || '');
const payParams = parsePayParams(query.payParams);
if (!requestId || !payParams) {
const page = pageContext ?? this;
@@ -161,8 +191,8 @@ function createWechatPayPage(pageContext) {
return;
}
const status = await requestWechatPayment(payParams);
notifyPreviousWebView(requestId, status);
const payResult = await requestWechatPayment(payParams);
notifyPreviousWebView(requestId, orderId, payResult);
wx.navigateBack();
},
@@ -176,7 +206,9 @@ module.exports = {
canUseVirtualPayment,
PAY_RESULT_STORAGE_KEY,
appendPayResult,
buildPayResultValue,
createWechatPayPage,
normalizePayError,
parsePayParams,
safeCompareVersion,
requestWechatPayment,