不弹窗授权, 微信小程序获取用户 userInfo 的方法

作者: 科技微讯

日期:

wx.getUserInfo() 只有在用户已经授权的情况下, 才能获取 userInfo, 如果没有授权, 会 fail. 可以通过 wx.getSetting() 确认是否已经授权, 如果 authSetting['scope.userInfo'] 是 true 再执行. wx.getUserInfo() 不会调出请求权限的弹窗, 获取到的信息不包括 openid, unionid, appid, 但有 rawData, encryptedData, signature 等可以协助获取这三个 id 的信息.

<button open-type="getUserInfo" bindgetuserinfo="getUserInfo">授权</button> 也可以获取用户的信息, 信息在 getUserInfo 这个事件函数的参数中, 和 wx.getUserInfo() 所不同的是, 该方法如果用户已经授权就直接获取用户信息, 如果用户没有授权, 就先弹窗询问用户授权, 同意授权之后才能拿到用户信息. 和 wx.getUserInfo() 一样的是, 获取到的信息也不包括 openid, unionid, appid, 但有 rawData, encryptedData, signature 等可以协助获取这三个 id 的信息.

通过 rawData, encryptedData, signature 这三个信息间接获取 unionId 有点麻烦, 更方便的做法是通过小程序云开发的云函数获取.

前面没提到的是, wx.getUserInfo() 还可以返回 cloudID, 把这个 cloudID 传入一个非常简单的云函数就可以获取用户的 userInfo. 但是正如前面所说, wx.getUserInfo() 必须在用户已经授权的情况下才可以返回数据.

所以如何在不弹窗授权的情况下, 获取用户的 userInfo 呢?

如果公众号和小程序都绑定到微信开放平台, 并且用户关注了公众号, 那在云函数可以通过 cloud.getWXContext() 获取该用户的 unionid, openid, appid, 但是本地调试时 unionid 是获取不到的. 通过这种方法获取的信息中, 不包括头像url, 用户名称, 用户地理位置等 userInfo 的信息, 这些信息需要用第一和第二种方法获取, 即需要弹窗授权.

如果公众号和小程序都绑定到微信开放平台, 并且用户关注了公众号, 可以在小程序端通过 wx.login() 获取一个叫 code 的字符串, 把 code 传到云函数, 通过微信一个 url 式的 api 可获取 unionId, openId, session_key, 文档把这种方式简称 wx.login + code2session.

虽然 wx.login + code2session 可以获取 unionId, 但使用 wx.login() 的主要目的似乎不是用来获取 unionId, 而是通过获得的 sessionkey 维护用户的登录状态. 这种情况和 cloud.getWXContext() 一样, 获取 unionID 既不用授权, 也不会弹出授权窗口. sessionkey 有有效期, 可通过 wx.checkSession() 判断当前是否还有效. wx.login() 只能获得 code, 所以用户头像, 用户名称等信息依然需要用第一和第二种方法获取, 即需要弹窗授权.

由此可见, 要想在小程序端获得完整的 userInfo, 必须先获取授权. 如果只是想获得 unionId 和 openId, 可以不授权, 只要关注了公众号&绑定到微信开放平台就可以了.

虽然在小程序端获取完整的 userInfo 需要先弹窗授权, 但在公众号获取 userInfo 不需要弹窗授权. 当用户和公众号产生消息交互后, 例如用户订阅了公众号, 就可以通过公众号提供的 api 获取用户的 userInfo, 这些 userInfo 就包括用户头像, 用户名, 地理位置等信息, 如果这个公众号还绑定到微信开放平台, 还会包括 unionId.

小程序端可以不授权获取 unionId, 公众号可以不授权获取包括 unionId 的 userInfo, 两者对接起来, 就可以实现小程序端不授权就可以获取完整的 userInfo.

--

如果只是展示用户数据, 可以用 open-data 组件.