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

@@ -17,6 +17,8 @@ type MiniProgramPage = {
data: Record<string, unknown>;
setData: (patch: Record<string, unknown>) => void;
onLoad: (query?: Record<string, string>) => Promise<void>;
onShow: () => void;
consumePayResult: () => void;
};
function createWxMock() {
@@ -44,6 +46,10 @@ function loadWebViewPage(
Page(config: Record<string, unknown>) {
pageConfig = config;
},
setTimeout(callback: () => void) {
callback();
return 1;
},
require(requestPath: string) {
if (requestPath === '../../config') {
return {
@@ -85,22 +91,40 @@ describe('mini-program web-view auth page', () => {
vi.clearAllMocks();
});
test('默认进入时直接打开 web-view,不触发微信登录请求', async () => {
test('默认进入时刷新微信小程序登录态后打开 web-view', async () => {
const wxMock = createWxMock();
wxMock.login.mockImplementation(({ success }) => {
success({ code: 'wx-login-code' });
});
wxMock.request.mockImplementation(({ success }) => {
success({
statusCode: 200,
data: {
token: 'jwt-active-wechat',
bindingStatus: 'active',
},
});
});
const page = loadWebViewPage(wxMock);
await page.onLoad({});
expect(wxMock.login).not.toHaveBeenCalled();
expect(wxMock.request).not.toHaveBeenCalled();
expect(wxMock.login).toHaveBeenCalledTimes(1);
expect(wxMock.request).toHaveBeenCalledWith(
expect.objectContaining({
url: 'https://www.genarrative.world/api/auth/wechat/miniprogram-login',
method: 'POST',
data: { code: 'wx-login-code' },
}),
);
expect(page.data.loading).toBe(false);
expect(page.data.phoneBindingRequired).toBe(false);
expect(page.data.webViewUrl).toBe(
'https://www.genarrative.world/?clientType=mini_program&clientRuntime=wechat_mini_program',
'https://www.genarrative.world/?clientType=mini_program&clientRuntime=wechat_mini_program#auth_provider=wechat&auth_token=jwt-active-wechat&auth_binding_status=active',
);
});
test('默认匿名进入 web-view 不依赖 API_BASE_URL 配置', async () => {
test('默认匿名进入 web-view 不依赖 API_BASE_URL 配置', async () => {
const wxMock = createWxMock();
const page = loadWebViewPage(wxMock, {
API_BASE_URL: '',
@@ -116,6 +140,27 @@ describe('mini-program web-view auth page', () => {
);
});
test('onShow 二次检查支付结果并写回 web-view hash', () => {
const wxMock = createWxMock();
wxMock.getStorageSync.mockImplementation((key) =>
key === 'genarrative:wechat-pay-result'
? 'request-1:success:order-1'
: '',
);
const page = loadWebViewPage(wxMock);
page.data.webViewUrl =
'https://www.genarrative.world/?clientType=mini_program#tab=profile';
page.onShow();
expect(wxMock.removeStorageSync).toHaveBeenCalledWith(
'genarrative:wechat-pay-result',
);
expect(page.data.webViewUrl).toBe(
'https://www.genarrative.world/?clientType=mini_program#tab=profile&wx_pay_result=request-1%3Asuccess%3Aorder-1',
);
});
test('H5 请求登录时才启动微信小程序登录并进入手机号授权态', async () => {
const wxMock = createWxMock();
wxMock.login.mockImplementation(({ success }) => {