各小程序登录/权限/接口
June 23, 2020
微信小程序
流程
接口
微信小程序和用户权限相关的接口有以下几个: wx.login, wx.checkSession, getUserInfo 等. 在测试的时候我发现, 用户是否登录和用户是否授权用户信息是两个毫不相关的概念, 之前也以为授权必须建立在登录态之上但是发现并不是这样. 例如 getUserInfo 可以在 checkSession 为 err 下进行, getUserInfo success 后 checkSession 也依然为 err
wx.login
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
调用接口获取登录凭证(code). 测试发现使用非常宽松, 直接调用后回调返回{ errMsg, code }, 目前看不到 login 失败的案例
注意, 只能获取登录凭证 code.
wx.checkSession
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.checkSession.html
检查登录态是否过期. 非常简单的接口, 从这里可以发现, 很明显, 小程序定义的登录态只和是否持有 code 有关, 其他用户信息等和用户的其他权限是有关的, 即用户登录后持有唯一 code, 并且这个 code 可能过期. 在此阶段用户登录后是匿名的, 且获取小程序获取不了任何信息.
wx.getUserInfo
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html
获取用户信息. 这是一个比较有争议的接口, 在之前的小程序中, 调用这个接口如果用户在登录态且没有授权用户信息, 则会直接弹出授权窗口. 但是在新的改动中, 这个行为被分开了, 弹出授权窗口有另外的接口, 不再在此接口中提供. https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01. 所以在目前的逻辑中, 小程序在调用该接口前, 必须先调用 wx.authroize 接口
open-type=“getUserInfo”
getUserInfo 的另一个版本, 需要用户主动点击才会生效, 和 wx.getUserInfo 不同的是, 这个版本会直接调起授权弹窗, 另外这个版本中, 是必定会带上 withCredentials=true
wx.authorize
用于申请某项权限, 参数 scope, 即可申请调用权限. 非常重要的是一旦用户明确同意或拒绝过授权,其授权关系会记录在后台,直到用户主动删除小程序. 但是这个条件和 getUserInfo 相悖, open-type=“getUserInfo”, 拒绝多次后依然可以调起授权窗口. 并且此接口同样无法调起授权窗口, 并且使用 scope.userLocation 需要在 minifest.json 中设置相应的 permission.
| scope | 对应接口 | 描述 |
|---|---|---|
| scope.userInfo | wx.getUserInfo | 用户信息 |
| scope.userLocation | wx.getLocation, wx.chooseLocation | 地理位置 |
| scope.userLocationBackground | wx.startLocationUpdateBackground | 后台定位 |
| scope.address | wx.chooseAddress | 通讯地址 |
| scope.invoiceTitle | wx.chooseInvoiceTitle | 发票抬头 |
| scope.invoice | wx.chooseInvoice | 获取发票 |
| scope.werun | wx.getWeRunData | 微信运动步数 |
| scope.record | wx.startRecord | 录音功能 |
| scope.writePhotosAlbum | wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum | 保存到相册 |
| scope.camera | camera 组件 | 摄像头 |
wx.getSetting
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/wx.getSetting.html
获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限. 其实在这里会看到, 权限的逻辑应当是, 当 authSetting 中存在相应逻辑, 直接返回结果, 否则调起授权弹窗. 这个接口没有任何副作用, 可以放心使用.
wx.openSetting
直接打开授权设置, 回调值与 getSetting 一致. 这个接口感觉只能引导用户自己改授权. 其实都要做好失败的处理.