解决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接口列表
    });
}
相关推荐
我是小路路呀8 小时前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
JIngJaneIL9 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
澄江静如练_9 小时前
列表渲染(v-for)
前端·javascript·vue.js
Loo国昌10 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构
前端白袍10 小时前
Vue:如何实现一个具有复制功能的文字按钮?
前端·javascript·vue.js
new code Boy11 小时前
escape谨慎使用
前端·javascript·vue.js
个微管理15 小时前
告别多手机切换烦恼,无需下载安装软件的CRM管理系统
微信·智能手机·自动化·微信开放平台
爱分享的鱼鱼15 小时前
对比理解 Vue 响应式 API:data(), ref、reactive、computed 与 watch 详解
前端·vue.js
JS_GGbond15 小时前
【性能优化】给Vue应用“瘦身”:让你的网页快如闪电的烹饪秘籍
前端·vue.js
刘一说15 小时前
Vue Router:官方路由解决方案解析
前端·javascript·vue.js