阅读

浅析"WeixinJSBridge is not defined"

Fundebug并没有使用微信JS-SDK,然而却收到了WeixinJSBridge is not defined的报错:



我们的用户也收到了类似的错误报警,并且很多开发者都遇到类似的问题:

  • 我的微信项目,没有用到微信JS-SDK,但iphone部分手机点击某些功能无效,后来加了window.onerror监控,发现有Uncaught ReferenceError: WeixinJSBridge is not defined报错;
  • 从微信进入支付中心直接唤起微信支付时有时会抛出ReferenceError:weixinJSBridge is not defined的异常;
  • 使用AppCan生成Web/微信App版,调用微信JSAPI支付方式,提示WeixinJSBridge内置对象undefined;
  • ……

由此可见,这是一个非常普遍的问题。但是如果没有在测试阶段没有遇到过,然后又没有做线上错误监控的话,就很难发现这个问题。我们在这里将这个错误进行一些分析,让大家少走弯路。

什么是微信JS-SDK?

这里引用官方文档:

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。

Q&A

我没有使用微信JS-SDK, 为什么会报错呢?

  • 微信内置浏览器会有WeixinJSBridge,但是需要一定的加载时间。

我使用了微信JS-SDK, 为什么会报错呢?

  • 微信webview注入钩子有时序问题:在WeixinJSBridge还未注入之前,就已经成功注入其它依赖于WeixinJSBridge的其它XX模块。在XX模块中调用WeixinJSBridge就会失败。

如何解决?

如果你开发一款移动应用,必不可少要考虑分享到微信的功能;如果你开发网页,那么用户之间的分享更多的也是通过微信。那么这个问题到底有多严重,如何解决也变得至关重要。

  • 如果网页中未使用微信JS-SDK, 用户在微信中打开网站可能会触发这个错误,目前看来只有忽略。因为是微信JS-SDK自身的问题,我们也无法控制。

  • 关于微信支付

    • 方法1: 监听ready事件之后再进行下一步操作
    if (typeof window.WeixinJSBridge == "undefined")
    {
    $(document).on('WeixinJSBridgeReady', function()
    {
    $('#weiXinPay').click();
    });
    }
    else
    {
    $('#weiXinPay').click();
    }

PS: 关于这个问题的帖子从2014年开始就有了,然而问题依然存在,希望微信的同学能够给出官方的解决方案。

参考链接