小程序的用户唯一标识openid
为了区分小程序的用户,微信提供了 openid 来唯一识别,获取 openid 的方式很简单,只需要通过 wx.login 后通过返回的登录凭证 code ,调用官方提供的 code2session 接口即可获取到 openid 和 session_key
wx.login({
success(res) {
const code = res.code
request('/api/code2session', {
code: code
}).then(res => {
console.log(res.data.session_key, res.data.openid)
})
}
})
微信公众平台的用户唯一标识unionid
如果只是做小程序,上面的openid完全够用,但是大部分情况下我们还需要打通微信平台下的所有通道,比如公众号和小程序要识别的是同一个用户,这就需要unionid来识别了
UnionID机制说明
如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
UnionID获取途径
绑定了开发者帐号的小程序,可以通过下面 4 种途径获取 UnionID。
- 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
- 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。
- 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。
- 小程序端调用云函数时,当满足 UnionID 获取条件时可在云函数中通过 cloud.getWXContext 获取 UnionID
解密用户信息失败
在小程序解密的时候遇到一种情况是解密用户信息失败,困扰了很久,这里要注意的是会话密钥 session_key 有效性,先看看解密用户信息需要的字段有 appid session_key iv encryptedData 四个字段,其中 encryptedData 是通过 session_key 来签名和加密的得到的,那么通过 wx.getUserInfo 获取用户的 unionid 的流程必须是先有 session_key 然后再微信授权获取用户信息来解密,获取用户信息有两种方式
- 用户未授权的情况下,需要通过 open-type 来授权登录弹窗
<!-- 需要使用 button 来授权登录 -->
<button wx:if="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">授权登录</button>
注意: 开发遇到在 getUserInfo 回调后再调用 wx.login,会导致新的 session_key 加密的信息,服务器用旧的 session_key 来解密导致解密失败,所以绝对不能在 bindgetuserinfo 回调调用 wx.login
- 用户已经授权的情况下,可以直接通过 wx.getUserInfo 来获取,一般做法是检测是否授权
wx.getSetting({
success (res){
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称
wx.getUserInfo({
success: function(res) {
console.log(res.userInfo)
}
})
}
}
})