我们在微信内 H5 页面使用 JSAPI 方式调起支付:
WeixinJSBridge.invoke('getBrandWCPayRequest', payParams)
流程:
1. 用户打开支付页
2. 无 code 时跳 OAuth 获取 code
3. 带 code 回到支付页
4. 后端返回 getBrandWCPayRequest 所需参数
5. 前端等待 WeixinJSBridge 后 invoke
目前偶现 Android / OpenHarmony 无法调起支付。
异常时:
- OAuth code 已正常获取
- 后端支付参数已正常返回
- 但等待 6~8 秒后:
typeof window.WeixinJSBridge === 'undefined'
因此没有机会执行 invoke。
我们已按官方示例处理:
```js
if (typeof WeixinJSBridge === 'undefined') {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false)
} else {
onBridgeReady()
}
同时也加了轮询检测,但部分页面会话中 WeixinJSBridge 始终没有注入。
典型案例:
同一设备:
第一次带 code 回到支付页,支付参数已返回,WeixinJSBridge 6 秒后仍为 undefined,未 invoke
第二次重新进入,仍然 undefined,未 invoke
第三次重新进入,WeixinJSBridge 正常变为 object,成功 invoke,并返回 get_brand_wcpay_request:ok
请问:
这种 Android WebView 会话内 Bridge 不注入是否正常?官方推荐的恢复方式是什么?
这里是调起支付失败了吗?调起的参数发下,操作视频私发下
这是微信 Android/OpenHarmony WebView 已知现象——
WeixinJSBridge对象偶发永不注入,不是你们监听写法问题,也不是OAuth导致。官方也承认此情况存在,推荐做法是检测超时后主动location.reload()让微信重新注入 Bridge。结论
WeixinJSBridgeReady监听写法正确undefined→ 整页刷新一次(reload),刷新后 Bridge 通常会正常注入推荐实现(带超时兜底刷新)
let bridgeReady = false; function onBridgeReady() { if (bridgeReady) return; bridgeReady = true; // 这里调 WeixinJSBridge.invoke('getBrandWCPayRequest', ...) } if (typeof WeixinJSBridge !== 'undefined') { onBridgeReady(); } else { document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); // 超时兜底:2.5s 还没注入 → reload 一次 setTimeout(() => { if (!bridgeReady && typeof WeixinJSBridge === 'undefined') { // 建议保留 code / state,避免重复 OAuth const url = new URL(location.href); url.searchParams.set('_jbridge_retry', '1'); location.replace(url.toString()); } }, 2500); }降低触发概率的补充建议
DOMContentLoaded之前同步阻塞 JS(大型同步脚本)我们目前的做法也是超时后刷新页面,想看看大家有没有更好的解决方案。