结论
只有 uni-app 当前是登陆状态
且当前登陆状态是通过微信认证登陆 uni-app 时
uni-app 微信解绑或退出才需调用 uni-app 提供的plus.oauth.AuthService.logout()
Api
解决方案
手机号登陆解绑不调用plus.oauth.AuthService.logout()
发现问题
近日与前端调试 uni-app 应用时
发现登陆应用后再点击微信解绑会发生如下错误
{
"code": -7,
"message": "业务参数配置缺失,http://ask.dcloud.net.cn/article/282"
}
uni-app 官网错误描述
根据提示信息和链接http://ask.dcloud.net.cn/article/282可找到 uni-app 官网的详细信息
如下截图
初次排查
据上述信息可知是微信移动应用相关的信息缺失导致的
但根据前端代码的检查并未发现有信息缺失
微信登陆功能都是正常的
后来重复测试了这个 Bug 并不是一定会出现
事实也印证了这一点
前端在微信解绑时会调用 plus.oauth.AuthService.logout()
参考uni-app plus.oauth.AuthService 文档
继续和前端的交流中得知这个是 uni-app 框架要求的必须调用的
如微信移动应用登陆时需要调用 plus.oauth.AuthService.authorize()
但是根据微信移动应用-微信登陆功能可知其并不要求前端需要和微信服务器发送任何请求
参考微信移动应用-微信登陆功能文档
所以觉得解决方法就是微信解绑时不要去调用plus.oauth.AuthService.logout()
但是前端非常肯定是需要调用的
根据 uni-app 的 Api 可知前端的这一说法还是有理有据的
毕竟 uni-app 不可能平白无故的会多提供这些 Api
有必要去认真考证一下
打消双方的疑虑
于是大家一起去uni-app 的问答社区搜索
但是搜索一圈下来并没有找到想要的答案
由于还有其它优先级比较高的任务
所以大家都暂时搁置了这个 Bug
进一步排查
次日
找前端要了安装包
首先在模拟器中用手机号登陆运行
同时打开抓包工具 Charles
走了一遍 Bug 用例
确实重现了 Bug
发现并没有发出任何相关的网络请求
同时又操作了几遍
发现依旧如此
然后用微信认证登陆
结果可以正常解绑微信
基本确定问题是 uni-app 的内部原理导致的
基于此打算看下 uni-app 的源代码
根据 uni-app plus.oauth.AuthService 文档可知相关类接口是 AuthService
查看相关 Android 源代码
Andoird 源代码地址https://github.com/dcloudio/H5P.Android.git
十分幸运代码库分支主要就是 master
没有 tag
所以直接切此分支即可
相关类BaseOAuthService.java
、WeiXinOAuthService.java
logout:前端调用plus.oauth.AuthService.logout()
对应的 Android 接口
super.logout:首先调用父类的 logout 代码
super.hasGeneralError、super.hasFullConfigData:实际传递错误的调用点
hasFullConfigData:实际判断是否存在微信信息的调用点
可知 appId、appSecret 只有调用 initMetaData 或 initAuthOptions 方法才设置
而上述2个方法只有被 login、authorize 调用
login 对应前端调用plus.oauth.AuthService.login()
authorize 对应前端调用plus.oauth.AuthService.authorize()
removeToken:清楚绑定的变量
makeResultJSONObject:创建返回结果信息给前端
onLogoutFinished:返回结果给前端
查看相关 IOS 源代码
由于未学习过 Objective-C
所以临时去菜鸟教程网站上简单过了一遍 Objective-C 的语法
IOS 源代码地址https://github.com/dcloudio/H5P.iOS.git
十分幸运代码库分支主要就是 master
虽然有 tag
但是 tag 不多
所以直接切此分支即可
相关类PGWXOAuth.m
、PGWXOpenApi.m
logout:前端调用plus.oauth.AuthService.logout()
对应的 IOS 接口
getWXAPI:此处是关键,和 Android 代码不同的是这里不会判断是否为空
cancelPreConn:取消之前的连接,并释放连接资源
clear:实例变量设置为 nil,nil 类似于 Java 的 null
executeJSSucessCallback:获取 OAuth 用户信息,构造状态为OK
的返回信息
getOauthInfo:主要是构造用户信息字典,字典类似于 Java 中的 Map