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

@@ -15,6 +15,7 @@ const CLIENT_INSTANCE_STORAGE_KEY = 'genarrative:mini-program-client-instance-id
const PAY_RESULT_STORAGE_KEY = 'genarrative:wechat-pay-result';
const AUTH_RESULT_STORAGE_KEY = 'genarrative:mini-program-auth-result';
const AUTH_ACTION_LOGIN = 'login';
const PAY_RESULT_RECHECK_DELAY_MS = 120;
function isConfiguredEntryUrl(value) {
const trimmed = String(value || '').trim();
@@ -45,6 +46,7 @@ function appendQuery(url, query) {
}
function appendHashParams(url, params) {
const nextKeys = new Set(Object.keys(params).filter((key) => params[key]));
const pairs = Object.keys(params)
.filter((key) => params[key])
.map(
@@ -58,8 +60,18 @@ function appendHashParams(url, params) {
const hashIndex = url.indexOf('#');
const baseUrl = hashIndex >= 0 ? url.slice(0, hashIndex) : url;
const rawHash = hashIndex >= 0 ? url.slice(hashIndex + 1) : '';
const separator = rawHash ? '&' : '';
return `${baseUrl}#${rawHash}${separator}${pairs.join('&')}`;
const keptHashParts = rawHash.split('&').filter((part) => {
if (!part) {
return false;
}
const [rawKey = ''] = part.split('=');
try {
return !nextKeys.has(decodeURIComponent(rawKey));
} catch (_error) {
return !nextKeys.has(rawKey);
}
});
return `${baseUrl}#${keptHashParts.concat(pairs).join('&')}`;
}
function parseBooleanQueryFlag(value) {
@@ -259,6 +271,18 @@ async function resolveAuthResult() {
};
}
async function refreshMiniProgramSessionSilently() {
if (!isConfiguredApiBaseUrl(API_BASE_URL)) {
return null;
}
try {
return await resolveAuthResult();
} catch (error) {
console.warn('[web-view] silent mini program login refresh failed', error);
return null;
}
}
Page({
data: {
authResult: null,
@@ -285,13 +309,14 @@ Page({
const forcedPhoneBinding = parseBooleanQueryFlag(query.phoneBindingRequired);
const returnToPreviousPage = shouldReturnToPreviousPage(query);
if (!shouldStartAuthFromQuery(query) && !forcedPhoneBinding) {
const authResult = await refreshMiniProgramSessionSilently();
this.setData({
authResult: null,
authResult,
errorMessage: '',
loading: false,
phoneBindingRequired: false,
returnToPreviousPage: false,
webViewUrl: resolveWebViewUrl(null),
webViewUrl: resolveWebViewUrl(authResult),
});
return;
}
@@ -362,6 +387,13 @@ Page({
});
}
this.consumePayResult();
setTimeout(() => {
this.consumePayResult();
}, PAY_RESULT_RECHECK_DELAY_MS);
},
consumePayResult() {
const result = wx.getStorageSync(PAY_RESULT_STORAGE_KEY);
if (result && this.data.webViewUrl) {
wx.removeStorageSync(PAY_RESULT_STORAGE_KEY);