ios手机在微信内嵌h5扫码,报,scanQRCode: the permission value is offline verifying,刷新重新扫码就可以
一、问题
ios手机在微信内嵌h5扫码,报,scanQRCode: the permission value is offline verifying,刷新重新扫码就可以
二、原因
离线验证机制
iOS 微信客户端出于安全策略,首次调用敏感接口(如扫码)时,会触发后台的 "离线验证" 机制。该过程需要与微信服务器通信以确认当前页面的权限(签名、域名等),若网络延迟或验证未完成,会抛出此错误。
2、签名缓存失效
微信 JS-SDK 的权限签名(signature)有效期通常为 7200秒(2小时)。若签名过期或页面未及时更新签名,会导致验证失败。
3、页面未完全初始化
在页面资源未加载完成时调用 wx.scanQRCode(),微信客户端可能尚未完成环境初始化。
为何刷新后有效?
刷新页面会强制微信客户端重新初始化并完成离线验证,同时后端生成新的有效签名,绕过之前的验证状态
三、解决方案
1. 延迟调用扫码接口
在 wx.ready 回调中增加 500ms~1000ms 延迟,确保微信环境初始化完成:
wx.ready(() => { setTimeout(() => { wx.scanQRCode({ needResult: 1, success: (res) => { /* 处理结果 */ } }); }, 800); // 关键延迟 });
2、主动刷新签名(提醒用户刷新重试)
wx.error((err) => { if (err.errMsg.includes('offline verifying')) { alert("权限验证中,请刷新页面后重试"); // 或自动刷新:location.reload(); } });
总结
// #ifdef H5 scanQRCodeH5() { jWeixin.ready(() => { this.weixinScanQRCode() }); }, // 微信扫码 weixinScanQRCode() { jWeixin.scanQRCode({ needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, scanType: ['qrCode', 'barCode'], // 可以指定扫二维码('qrCode')还是一维码('barCode') success: async res => { if (res.errMsg == 'scanQRCode:ok') { const { serial } = util.getQueryString(res.resultStr); // uni.showToast({ title: 'serial:' + serial, icon: 'none' }); if (this.goDetail) { this.$uniRouter.push({ url: '/pages/scan/detail?source=qrcode&serial=' + serial }); } else { this.getPatrolQrCodeDetail(serial); } } else { uni.showToast({ title: res.errMsg, icon: 'none' }); } }, fail: res => { // uni.showToast({ title: res.errMsg, icon: 'none' }); if (res.errMsg.indexOf('offline verifying') !== -1 && this.retryCount < 3) { this.retryCount++; // 延迟一段时间后重试 setTimeout(this.weixinScanQRCode, 500); } else { // 提示用户刷新页面 uni.showToast({ title: '扫码调用失败,请刷新页面后重试!', icon: 'none' }) } }, }); },


浙公网安备 33010602011771号