各小程序登录/权限/接口

June 23, 2020

微信小程序

流程

img

接口

微信小程序和用户权限相关的接口有以下几个: 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 一致. 这个接口感觉只能引导用户自己改授权. 其实都要做好失败的处理.


Written by 梁伯豪