收藏
回答

微信H5支付偶现WeixinJSBridge一直为undefined

我们在微信内 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 不注入是否正常?官方推荐的恢复方式是什么?
回答关注问题邀请回答
收藏

2 个回答

  • 支付社区运营
    支付社区运营
    06-22

    这里是调起支付失败了吗?调起的参数发下,操作视频私发下

    06-22
    有用
    回复
  • Yegod
    Yegod
    06-21

    这是微信 Android/OpenHarmony WebView 已知现象——WeixinJSBridge对象偶发永不注入,不是你们监听写法问题,也不是OAuth导致。官方也承认此情况存在,推荐做法是检测超时后主动 location.reload()让微信重新注入 Bridge


    结论

    • WeixinJSBridgeReady监听写法正确
    • ❌ 部分会话(尤其冷启、多级跳转、OAuth 回跳)微信内核未注入 Bridge,属已知兼容问题,非异常
    • 官方推荐恢复方式:监听超过约定时间(如 2~3s)仍为 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);
    }
    
    
    
    _jbridge_retry参数防止无限刷新循环(最多刷一次)

    降低触发概率的补充建议

    • OAuth 回跳页尽量轻量、无 iframe / document.write 重写,复杂 DOM 操作会延迟 Bridge 注入
    • 不要在 DOMContentLoaded之前同步阻塞 JS(大型同步脚本)
    • OpenHarmony 微信内核表现更接近 Android,同样适用 reload 兜底

    ⚠️ 以上内容仅供参考,WeixinJSBridge 注入时机属微信客户端 WebView 行为,以官方最新说明及真机实测为准。

    06-21
    有用 1
    回复 1
    • 荔荔气泡水🍧
      荔荔气泡水🍧
      16小时前
      谢谢,很详细的回复。
      我们目前的做法也是超时后刷新页面,想看看大家有没有更好的解决方案。
      16小时前
      回复
登录 后发表内容