在小程序中调用 wx.scanCode 鉴权失败。
调用 wx.scanCode API,同样的代码,在微信小程序中会在显示 config ok 之后显示 permission denied。并且无法使用扫码功能。
在微信内置网页中打开,可以在 config ok 信息打印之后正常使用扫码功能。
这边目前尝试了大部分安卓手机,基本上 100% 复现。
最大的问题是,半个多月前进行过测试还好好的,最近一段时间突然大规模发生问题
框架类型 | 问题类型 | API/组件名称 | 终端类型 | 微信版本 | 基础库版本 |
---|---|---|---|---|---|
小程序 | Bug | wx.scanCode | 微信安卓客户端 | 8.0.24 | "Client:" "Android 10, WeChat 8.0.24.2180" |
4 个回答
简单记录下这个这个问题的解决方式,也许对后续遇到这个问题的人有帮助
背景
在最近的微信更新后,安卓机,小程序中嵌入 web-view 的页面使用微信 JS SDK 会产生如下奇怪的现象,`wx.confg` 调用成功,通过设置 debug 参数为 true 看到打印的信息能够确认 config 成功。鉴权成功后调用 JS SDK 的 API 仍然报错,一般的报错为 `permission denied` 。该问题只会在微信小程序的 web-view 页面中发生,在其他环境(微信内置浏览器、企业微信内置浏览器)均不会发生。
解决办法
通过尝试,发现在 web-view 中需要使用 wx.config 和 JS SDK 的页面只要在当前路由刷新一下页面,js 代码里面执行一下 `location.reload()` 方法,就可以正常使用了。可以通过判断当前是否为微信小程序中来判断是否执行刷新当前页面的逻辑。下面贴一段代码。
if (this.thidPartyPlatform.MINIPROGRAM) { // 判断当前环境是否为小程序 const stopReloadKey = 'stop_reload'; const stopReload = this.storageHelper.get(stopReloadKey); // 设置一个标识,防止页面一直 reload 死循环 if (!stopReload) { this.storageHelper.set(stopReloadKey, 'true'); location.reload(); return; } else { this.storageHelper.delete(stopReloadKey); } }
比较奇怪的点是,这种需要刷新来确保鉴权成功的情况,一般都是传递了不正确的 url 来获取鉴权的签名参数,但是微信这次的更新后的表现是,传递的 url 参数正确,并且也看到了 `config:ok` 的信息,仍然不能使用 SDK 中的 API。猜不出来微信做了啥更改,又只能靠自己的猜测来 hack 这次问题了
测试手机要扫码关注一下相应的公众号就可以了
微信版本是不是8.0.24?
微信申请授权使用摄像头时没同意?