收藏
回答

History.pushState()实现的SPA导致微信jssdk配置签名失败

首先贴微信jssdk的文档原文

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

简单来说解决方案就是IOS的配置一次就行,android的话就要每跳到一个新页面(也就是通过History.pushState()改变了当前地址栏URL)就重新生成签名并进行配置。

接下来说说我的实际情况:

  1. IOS下是完全没问题的,反正就是用落地页的URL来生成签名并且配置嘛。

  2. 我的备用机——一加X(最新微信客户端版本6.5.23,安卓版本5.x)按上述技术解决方案是完完全全没有问题的。

  3. 我的主力机——小米6(同样是最新微信客户端版本6.5.23,MIUI9,安卓版本7.0)按上述技术解决方案就出问题了:落地页面自然是没问题的;点解超链接跳转到第二个页面,我选择在dom渲染结束后这一时机来生成新的配置,并保证在执行wx.config()后再接wx.ready(function() {}),由于我开了jssdk的debug模式,因此会alert回馈给我看jssdk的执行结果:首先是配置的结果——{"errMsg":"config:ok"},接着就是我在wx.ready(function() {})中用以测试jssdk功能是否正常而使用的checkJsApi(),结果是这样的:{"errMsg":"checkJsApi:permission denied"}

总结一下:我的方案总体来说应该是没有问题的,毕竟在IOS以及一加X上都是正常的,因此我怀疑这里面是不是有机型还是系统方面的兼容性差异。

另外:我也试过在小米6上,干脆就像IOS那样只配置一次(按落地页URL),也还是不行。


回答关注问题邀请回答
收藏

10 个回答

  • Liao
    Liao
    2019-10-11

    安卓版本已经没有问题了,现在 iOS  里不在打开的第一个页面签名的话就会报错(如果跳转是用 pushState 的话)。

    解决思路是在每个落地页面都执行 wx.config ,第一个页面会执行成功,其他页面会执行失败,但不影响使用。

    2019-10-11
    有用 1
    回复 2
    • 詹小辉
      詹小辉
      2020-09-10
      现在用的就是这个解决方式
      2020-09-10
      回复
    • 随心
      随心
      2020-12-22
      这个方式基本能解决问题,但还是有点小瑕疵。就是在非首页的页面刷新时,第一次刷新后wx.config无响应,ready和error的回调都没触发,后续的刷新都能正常响应,不知道有没有遇到过这样的问题?
      2020-12-22
      回复
  • sher
    sher
    2021-01-21

    马克

    2021-01-21
    有用
    回复
  • 藻雪
    藻雪
    2020-05-20

    ios用落地页没问题,问题是ios页面刷新后再用落地页的url就会签名失效

    2020-05-20
    有用
    回复
  • phevose
    phevose
    2019-09-07

    我也是最新版的,还是有这个问题

    2019-09-07
    有用
    回复
  • George (乔治)
    George (乔治)
    2019-04-08

    @官方 - 这个问题怎么还存在?安装8.0微信7.0.3、7.0.4

    2019-04-08
    有用
    回复
  • ClassField
    ClassField
    2018-03-26

    另外刚刚又遇到一个坑,就是在获取微信授权的时候,因为链接中多了一个#号导致微信回跳失败,解决办法是强制把#号改为?号,同时链接中带有自己的识别信息,正确回跳后再内部重定向即可

    2018-03-26
    有用
    回复
  • ClassField
    ClassField
    2018-03-26

    微信支付也成功发起了,只要把配置中间加#号就可以,祝你好运

    2018-03-26
    有用
    回复 1
  • ClassField
    ClassField
    2018-03-26

    兄弟我又回来了,刚刚把问题给解决了,最主要原因是因为路由用的pushState特性即history模式,改为hash模式用domain/#/home就不会有问题!目前在之前出问题的手机上测试都没有错误。目前微信支付目录配置还有问题,待会儿再来

    2018-03-26
    有用
    回复
  • ClassField
    ClassField
    2018-03-26

    我也遇到这样的问题,config ok 其他api就是permission denied。并且我落地页偶尔都不行,在不同的手机上,不同的页面有的有问题,有的又没有。真不知该如何是好!

    2018-03-26
    有用
    回复
  • 可乐
    可乐
    2018-03-16

    同样遇到该问题,正在想办法解决中...

    2018-03-16
    有用
    回复
登录 后发表内容