解决ios页面跳转后调用微信js-sdk签名认证失败

如果前端项目使用的history模式的路由,当第一次打开的是首页或者其他页面,然后跳转到活动页面,再调用wx.config进行签名验证时,会签名验证失败。因为ios端的js-sdk在验证签名时取到的是第一次打开的页面地址,而不是当前的地址。

在官方文档有提到这一点,但是对于IOS的问题是一个字也没提到。

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

解决方案

  1. 在项目初始化的时候,如果在ios环境,则把当前页面的url缓存起来。
  2. 活动页面在获取签名的时候,去读取缓存的url,如果读不到则用当前页面的url。
  3. 获取到签名后再调用 wx.config 函数。

经过测试,是可以多次重复调用 wx.config 的,重点就是在ios端调用的时候,签名要传打开的第一个页面url。

举个🌰,我这边是 uni-app 的,就在 onLaunch 生命周期里缓存初始页面url。

javascript 复制代码
export default {
    onLaunch: function (option) {
        // #ifdef H5
        // 如果当前设备是ios
        if (global.SystemInfo.platform === "ios") {
            // 缓存初始页面url
            global._wxsdkUrl = window.location.href.split("#")[0]
        }
        // #endif
    }
}

然后在活动页面获取签名调用 wx.config 时,这么写

javascript 复制代码
// 初始化微信js-sdk
async initWx(){
    // 先尝试获取ios的缓存url,获取不到就取当前页面的url
    let url = global._wxsdkUrl || window.location.href.split("#")[0]
    // 调用后端接口获取签名
    const res = await getWxJsSdkSign({url: url})
    
    wxsdk.config({
        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: res.appId, // 必填,公众号的唯一标识
        timestamp: res.timestamp, // 必填,生成签名的时间戳
        nonceStr: res.nonceStr, // 必填,生成签名的随机串
        signature: res.signature,// 必填,签名
        jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData'] // 必填,需要使用的JS接口列表
    });
}
相关推荐
BillKu3 小时前
Vue3 + Element-Plus 抽屉关闭按钮居中
前端·javascript·vue.js
给月亮点灯|9 小时前
Vue基础知识-Vue集成 Element UI全量引入与按需引入
前端·javascript·vue.js
知识分享小能手9 小时前
React学习教程,从入门到精通,React 组件生命周期详解(适用于 React 16.3+,推荐函数组件 + Hooks)(17)
前端·javascript·vue.js·学习·react.js·前端框架·vue3
wow_DG10 小时前
【Vue2 ✨】Vue2 入门之旅 · 进阶篇(二):虚拟 DOM 与 Diff 算法
开发语言·javascript·vue.js·算法·前端框架
Hexene...11 小时前
【前端Vue】el-dialog关闭后黑色遮罩依然存在如何解决?
前端·javascript·vue.js·elementui·前端框架
Jay_See11 小时前
JC链客云——项目过程中获得的知识、遇到的问题及解决
前端·javascript·vue.js
叫我詹躲躲12 小时前
偷偷收藏!前端老鸟绝不外传的150个JS插件,让你效率翻3倍…
前端·vue.js
russ38512 小时前
Vue3.4版本新特性,更优雅的处理组件间的数据双向绑定
vue.js
鹏多多12 小时前
vue的监听属性watch的详解
前端·javascript·vue.js
streaker30312 小时前
Vue3 开发态轻量组件文档方案:基于动态路由 + Markdown
vue.js·vite