解决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接口列表
    });
}
相关推荐
daols8818 分钟前
vue 表格组件 vxe-table 实现自定义多行编辑功能
前端·javascript·vue.js·vxe-table
志尊宝22 分钟前
Vue3 零基础每日笔记(075):图片懒加载与骨架屏
javascript·vue.js·笔记
用户1733598075372 小时前
纯前端 PDF 压平避坑指南:压平后表单字段变了?
前端·javascript·vue.js
雪芽蓝域zzs2 小时前
第 4 节:点击地图添加 Marker 标记点
vue.js
雪芽蓝域zzs2 小时前
第 1 章:天地图 V4 + Vue3 + TS(UniApp / 若依可用)从零教学
vue.js
爱喝水的小周3 小时前
实验十 Vue‑Router 王者荣耀战绩查询 APP 开发实践
前端·javascript·vue.js
yexianglunbai3 小时前
Vue 3 全面详解:从核心特性到工程化实践
前端·javascript·vue.js
专业程序开发源3 小时前
django便利店外卖后台管理系统19650-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
志尊宝14 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
加我攻城狮19 小时前
当大模型把「景区」定位到附近公共厕所:我的 AI 旅行小程序踩坑实录
后端·微信