From c49bccc26971cfebb78e77a01cfeb5cfcd89a145 Mon Sep 17 00:00:00 2001 From: kdletters Date: Sat, 20 Jun 2026 13:19:18 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=81=E5=AE=9A=E5=BE=AE=E4=BF=A1=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E5=A4=B1=E8=B4=A5=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 微信订阅消息失败结果不再向 H5 透出原生错误 微信订阅测试覆盖 requestSubscribeMessage 失败的稳定原因 native shell 总门禁反查微信订阅结果边界 --- miniprogram/host-bridge/subscribeMessage.js | 5 ++- .../host-bridge/subscribeMessage.test.js | 33 +++++++++++++++++ scripts/check-native-shells.mjs | 36 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/miniprogram/host-bridge/subscribeMessage.js b/miniprogram/host-bridge/subscribeMessage.js index 18a391abe..af5901390 100644 --- a/miniprogram/host-bridge/subscribeMessage.js +++ b/miniprogram/host-bridge/subscribeMessage.js @@ -1,6 +1,7 @@ /* global wx */ const SUBSCRIBE_RESULT_STORAGE_KEY = 'genarrative:wechat-subscribe-result'; +const WECHAT_SUBSCRIBE_UNAVAILABLE_REASON = 'wechat subscribe unavailable'; function appendSubscribeResult(url, result) { const hashIndex = String(url || '').indexOf('#'); @@ -98,10 +99,11 @@ function createSubscribeMessagePageController(pageContext, options = {}) { wx.navigateBack(); }, fail(error) { + console.error('[subscribe-message] request failed', error); notifyPageResult( page, 'skip', - error && error.errMsg ? error.errMsg : 'failed', + WECHAT_SUBSCRIBE_UNAVAILABLE_REASON, ); wx.navigateBack(); }, @@ -121,6 +123,7 @@ function createSubscribeMessagePageController(pageContext, options = {}) { module.exports = { SUBSCRIBE_RESULT_STORAGE_KEY, + WECHAT_SUBSCRIBE_UNAVAILABLE_REASON, appendSubscribeResult, buildSubscribeResultValue, createSubscribeMessagePageController, diff --git a/miniprogram/host-bridge/subscribeMessage.test.js b/miniprogram/host-bridge/subscribeMessage.test.js index ef96a3dfd..7fe3a51d0 100644 --- a/miniprogram/host-bridge/subscribeMessage.test.js +++ b/miniprogram/host-bridge/subscribeMessage.test.js @@ -15,6 +15,7 @@ describe('subscribe-message mini program bridge', () => { let subscribeMessageBridge; beforeEach(() => { + vi.spyOn(console, 'error').mockImplementation(() => {}); globalThis.wx = { requestSubscribeMessage: vi.fn(), setStorageSync: vi.fn(), @@ -62,6 +63,38 @@ describe('subscribe-message mini program bridge', () => { expect(globalThis.wx.navigateBack).toHaveBeenCalled(); }); + test('hides requestSubscribeMessage native failure details from H5 result', () => { + const { + SUBSCRIBE_RESULT_STORAGE_KEY, + createSubscribeMessagePageController, + } = subscribeMessageBridge; + const subscribeError = { + errMsg: 'requestSubscribeMessage:fail private native detail', + }; + globalThis.wx.requestSubscribeMessage.mockImplementationOnce((options) => { + options.fail?.(subscribeError); + }); + const page = createSubscribeMessagePageController( + { + setData: vi.fn(), + }, + { templateId: TEST_TEMPLATE_ID }, + ); + page.onLoad({ requestId: 'request-fail' }); + + page.requestSubscribe(); + + expect(globalThis.wx.setStorageSync).toHaveBeenCalledWith( + SUBSCRIBE_RESULT_STORAGE_KEY, + 'request-fail:skip:wechat%20subscribe%20unavailable', + ); + expect(console.error).toHaveBeenCalledWith( + '[subscribe-message] request failed', + subscribeError, + ); + expect(globalThis.wx.navigateBack).toHaveBeenCalled(); + }); + test('skip action notifies previous web-view', () => { const { SUBSCRIBE_RESULT_STORAGE_KEY, diff --git a/scripts/check-native-shells.mjs b/scripts/check-native-shells.mjs index 494e8125d..a48aad5d2 100644 --- a/scripts/check-native-shells.mjs +++ b/scripts/check-native-shells.mjs @@ -1909,6 +1909,39 @@ function assertWechatPaymentResultBoundaries() { } } +function assertWechatSubscribeResultBoundaries() { + const subscribeSource = fs.readFileSync( + 'miniprogram/host-bridge/subscribeMessage.js', + 'utf8', + ); + const subscribeTestSource = fs.readFileSync( + 'miniprogram/host-bridge/subscribeMessage.test.js', + 'utf8', + ); + + for (const snippet of [ + "WECHAT_SUBSCRIBE_UNAVAILABLE_REASON = 'wechat subscribe unavailable'", + "console.error('[subscribe-message] request failed', error)", + 'WECHAT_SUBSCRIBE_UNAVAILABLE_REASON', + ]) { + if (!subscribeSource.includes(snippet)) { + throw new Error(`wechat subscribe bridge must include ${snippet}`); + } + } + if (subscribeSource.includes("error && error.errMsg ? error.errMsg : 'failed'")) { + throw new Error('wechat subscribe bridge must not expose native subscribe errors to H5'); + } + for (const snippet of [ + 'hides requestSubscribeMessage native failure details from H5 result', + 'wechat%20subscribe%20unavailable', + "expect(console.error).toHaveBeenCalledWith(", + ]) { + if (!subscribeTestSource.includes(snippet)) { + throw new Error(`wechat subscribe bridge test must include ${snippet}`); + } + } +} + function assertHostBridgeLayerLayout() { assertSameList( readDirectoryFileList( @@ -2139,6 +2172,9 @@ assertWechatMiniProgramCapabilityFlows(); console.log('[check:native-shells] wechat-payment-result-boundaries'); assertWechatPaymentResultBoundaries(); +console.log('[check:native-shells] wechat-subscribe-result-boundaries'); +assertWechatSubscribeResultBoundaries(); + console.log('[check:native-shells] h5-host-bridge-event-subscription-gates'); assertH5HostBridgeEventSubscriptionGates();