记一次分析、解决调用微信JSSDK方法时"the permission value is offline verifying"异常提示

前言:我把排查、分析思路、解决过程都记录下来了,有需要改进的地方,敬请不吝赐教。

场景:迎新管理系统需要实现”学生自助扫码检录“与”教师扫描学生条形码/二维码通过检录“,需要调用微信JSSDK的扫一扫方法。

但是前后出现了三次“the permission value is offline verifying”异常提示,三次异常提示可以总结为以下两种问题。

1、配置问题:config没有正确执行

2、地址问题:页面的地址(指通过“window.location.href”获取到的地址)与地址栏上面的地址(指的是点击微信的“复制链接”获取到的地址)不一致

壹、第一次报"the permission value is offline verifying"异常(配置问题)

原因:

config的jsApiList参数没有包含了这个JSAPI,添加上去即可

排查思路:

the permission value is offline verifying这个错误是因为config没有正确执行,或者是调用的JSAPI没有传入config的jsApiList参数中。

建议按如下顺序检查:

  1. 确认config正确通过。
  2. 如果是在页面加载好时就调用了JSAPI,则必须写在wx.ready的回调中。
  3. 确认config的jsApiList参数包含了这个JSAPI。

贰、第二、三次报"the permission value is offline verifying"异常(地址问题)

现象:

安卓手机无论如何操作都可以调用微信的扫一扫功能,但苹果手机时不时报"the permission value is offline verifying"异常

场景:

1、账号第一次绑定当前微信后自动跳转到调用微信扫一扫功能的页面

2、账号已绑定微信,单点登录后跳转到调用微信扫一扫功能的页面

分析思路:

1、安卓端无论如何操作都可以调用微信的扫一扫功能,只有苹果手机时不时报"the permission value is offline verifying"异常,基本可以排除“问题壹”的情况。

2、安卓端与苹果端调用扫一扫方法时所有的参数基本都是固定的,一致的。只有一个参数可能不一样,那就是用于计算“签名”的页面地址。苹果手机在调用微信扫一扫的页面上面执行“window.location.href”获取到的“页面地址”与"地址栏地址"(指的是点击微信的“复制链接”获取到的地址)不一致。

3、出现问题的两个场景都存在了“跳转”操作,而这个“跳转”是“无痕”跳转($.browserUtil.goToUrl),这个操作会导致在苹果微信浏览器下页面地址与地址栏地址不一致的情况。进而导致报"the permission value is offline verifying"异常。经网上查阅资料可得,苹果端微信浏览器该Bug于2015年已被发现,2019年微信开放社区内微信技术专员已确认存在该问题,但至今该问题仍未解决。

解决方法:

最终目标是确保“页面地址”与“地址栏地址”一致即可,包含但不限于以下解决方法

场景1:

在线注册页面正常的地址应该是有“#”的,但是“页面地址”是没有“#”的。

解决方法:

1、通过“window.location.href”获取页面地址

2、若地址不包含“#”则给当前地址后面拼接上“#”

PS:不能使用“window.location.hash”来判断有无“#”,因为当页面地址包含“#”但后面没有值时,此方法获取到的也会是与页面地址不包含“#”的结果一致,只能获取到空字符串。

示例代码:
//判断页面地址是否“不”存在“#”(此方法判断不是非常严谨,但是对于当前业务场景来说已经足够了)
if ((location.href.indexOf("#") === -1)) {
    location.href = location.href + "#";
    //有时候不reload的话,页面地址与地址栏地址还是会不一致
    location.reload();
}

场景2:

移动端院系检录管理列表页面正常的地址是没有“查询参数”(也就是地址后面的“?xxx=xxx”)的,但是单点登录之后会给这个页面添加上“查询参数”。

解决方法:

1、通过“window.location.href”获取页面地址

2、若页面地址如果存在“查询参数”的话,把“查询参数”去掉即可

//判断页面地址是否存在“查询次数”(此方法判断不是非常严谨,但是对于当前业务场景来说已经足够了)
if(window.location.search.length>0){
    location.href = window.location.href.substring(0, window.location.href.indexOf('?'));
}

PS:这场景都是发生在微信苹果端,安卓端一切正常,则可判断当前设备是否为微信苹果端后再执行上述解决方案

//判断当前设备是否为苹果设备
function isIOS(){
    var u = navigator.userAgent;
    var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
    return isiOS;
}

//判断当前设备是否为微信浏览器
function isWxClient () {
    var ua = navigator.userAgent.toLowerCase();
    if (ua.indexOf("micromessenger")>-1) {
        return true;
    }
    return false;
}

参考文章:

webView报错the permission value is offline verifying

IOS调用微信扫一扫scanQRCode报错the permission value is offline verifying

ios微信开网页history.pushState页面链接不改变,4年的老问题了

文章不足之处还请斧正!

本文By:NonNullPointer --2023/10/19

最后修改:2023 年 10 月 19 日
如果觉得我的文章对你有用,请随意赞赏