手机系统: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传递给后台进行加签
你好,记录用户首次访问地址 (即A页面),然后当用户在B页面调用wx.config代码时,进行判断