收藏
回答

如何解决ios系统在刷新公众号页面后签名失败的问题?

手机系统:ios16.5.1;开发框架:Vue2 路由模式:history

问题描述:

ios设备做公众号开发时,正常打开公众号页面能正确加载jssdk,可以正常授权。但当在任意授权后的页面刷新页面过后,此时再次加载jssdk时报错invalid config,原因是微信判断当前页面是B,而后端传递的是A,所以导致授权链接无法验签成功。

问题复现描述:

1、打开A页面,将A页面的url记录进sessionStorage中

2、加签时提交sessionStorage中的记录给后端进行加签

3、返回签名结果再设置到wx.config中,此时签名加载结果为"errMsg":"config:ok"

4、打开B页面,签名加载结果为config:ok,当点击右上角三个小点,选择刷新按钮后,此时签名加载结果为"errMsg":"config:invalid signature"

问题复现视频:

https://qhyg-test-1258702188.cos.ap-chengdu.myqcloud.com/upload/common/20200616/31-909068682.mp4

问题产生原因:

在ios下,vue-router切换的时候都是浏览器的历史记录,所以url其实都是一开始进入的url,每次签名只能使用首次打开SPA的url,也就是当你第一次打开A页面,再跳到B页面,需要拿A页面做签名。刷新B页面以后sessionStorage中地址没变还是A,但浏览器认定首次打开的是B页面,所以导致加签失败。

出现该问题应该如何处理!

部分实现代码

// router.js
router.afterEach((to, from) => {
    const currentUrl = wechatUtil.montageUrl(to.fullPath)
    //IOS浏览器记录的是第一次进来的url
    if (wechatUtil.isIOS() && !wechatUtil.isWeChatDevTools()) {
        if (!store.state.page.initLink) {
            store.commit('setPageInitLink', currentUrl)
        }
    } else {
        store.commit('setPageInitLink', currentUrl)
    }
})

//wechatUtil.js
montageUrl(vueRouterTo) {
    const currentHostname = window.location.hostname; // 获取当前页面的域名
    //协议部分(http 或 https)
    const protocol = window.location.protocol;
    // 完整的域名(包括协议和端口号,如果有的话)
    const fullUrlWithoutPath = `${protocol}//${currentHostname}${window.location.port ? `:${window.location.port}` : ''}`;
    return fullUrlWithoutPath + vueRouterTo;
}
//使用store.state.page.initLink 获取url传递给后台进行加签
回答关注问题邀请回答
收藏

1 个回答

  • 社区技术运营专员--许涛
    社区技术运营专员--许涛
    02-05

    你好,记录用户首次访问地址 (即A页面),然后当用户在B页面调用wx.config代码时,进行判断 

    02-05
    有用
    回复
登录 后发表内容