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' })
                         }
                    },
                });
            },

 

posted @ 2025-07-15 11:22  心向阳  阅读(652)  评论(0)    收藏  举报