本环境是nuxt项目,其实vue项目也差不多,原理就是在路由的beforeEach函数里做个判断,并去签名
本次对接的是微信公众号录音功能,jssdk ios第一次签名失败,刷新后签名成功
//中间件iosaudio.js
export default async function ({ store, route, app: { $axios, router } }) {
//返回true 是ios手机
let isIOS = () => {
let u = navigator.userAgent;
let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
return isIOS;
}
let shareSignature = async () => {
let wxOpt = {};
let res = await $axios({
url: "/wx-user/sound",
method: "post",
data: {
action: "sign",
url: location.href
}
});
if (+res.code === 1) {
wxOpt = res.data;
}
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: wxOpt.appid, // 必填,公众号的唯一标识
timestamp: wxOpt.timestamp, // 必填,生成签名的时间戳
nonceStr: wxOpt.noncestr, // 必填,生成签名的随机串
signature: wxOpt.signature, // 必填,签名
jsApiList: ["downloadVoice", "startRecord", "stopRecord", "uploadVoice"] // 必填,需要使用的JS接口列表
});
wx.ready(function () {
console.log("校验通过1");
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口
//,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
wx.error(res => {
console.log("微信校验失败1", res);
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
}
router.beforeEach((to, from, next) => {
if (isIOS() && from.path === '/') {
shareSignature()
}
next()
})
}
使用:nuxt.config.js配置中间件
//
export default {
...
router: {
middleware: 'iosaudio'
},
...
}
参考博客: