联合编号
微信开放平台下同一个实体的应用、公众号、小程序unionid相同,因此无论是否是同一个用户都可以锁定
微信对于不同应用内的不同用户都有唯一的openId,但是如果要判断是否是同一个用户,需要使用unionid来区分
对于同一个微信开放平台下,同一主体的应用、公众号、小程序,若用户已经关注公众号,或之前登录过应用或公众号,则用户打开小程序时,开发者可以通过wx.login直接获取用户的UnionID,无需用户再次授权。
(解读:如果用户没有登录APP、没有登录公众号、没有关注公众号,是无法通过小程序中的wx.login获取unionid的)
如何获取 UnionID
使用的 API
注意:getUserInfo 已调整,如果您使用此接口,授权弹窗将不再出现,请使用
坑:
我们一般都是先获取微信的unionid,然后使用unionid登录自己的网站,这样就可以在自己的网站上和用户的user_id进行关联了。但是在登录小程序的时候,有时候可以获取到unionid,有时候却获取不到,如果获取不到unionid,那么用户就无法正常登录网站。
原因:对于同一个微信开放平台下,同一主体的应用、公众号、小程序,若用户已经关注公众号,或之前登录过应用或公众号,则用户打开小程序时,开发者可以通过wx.login直接获取用户的UnionID,无需用户再次授权。
(解读:如果用户没有登录APP、没有登录公众号、没有关注公众号,是无法通过小程序中的wx.login获取unionid的)
所以就有两种情况:
一般是用户已经登录过其他关联公众账号。
使用wx.login获取code,传给后端,并将code转换为openid和unionId
//1.login
wx.login({
success: function(data) {
wx.request({
url: openIdUrl,
data: {
code: data.code
},
success: function(res) {
self.globalData.openid = res.data.openid
},
fail: function(res) {
console.log('拉取用户openid失败,将无法正常使用开放接口等服务', res)
}
})
},
fail: function(err) {
console.log('wx.login 接口调用失败,将无法正常使用开放接口等服务', err)
callback(err)
}
})
2.用户未使用过关联的公众账号等。
此时wx.login无法获取unionId,需要使用wx.getUserInfo
解决方案:通过登录态的wx.getUserInfo获取用户的加密数据encryptedData和加密算法的初始向量iv,然后将encrypteddata、iv、code传给后端,后端再通过收到的encryptedData、iv、code和之前的session_key解密出用户的openid、unionid等。
wx.getUserInfo({
withCredentials:false,
success:(obj)=>{
wx.request({
url: openIdUrl,
data: {
code: data.code,
encryptedData : obj.encryptedData,
iv : obj.iv,
},
success: function(res) {
self.globalData.openid = res.data.openid
},
fail: function(res) {
console.log('拉取用户openid失败,将无法正常使用开放接口等服务', res)
}
})
}
})
在实际项目中,需要将两种情况结合起来使用
两个选项:
第一种方式:(前端判断是否有unionid)wx.login上传code到后端,后端返回数据后,前端判断返回值中是否有unionid或者unionid是否为null获取小程序信息,如果为null则带用户登录态调用wx.getUserInfo(),然后把微信返回的encryptedData和iv返回给后端,后端解密出相应信息返回给前端;
第二种方式:(后端判断是否有unionid)前端调用wx.login()、wx.getUserInfo(),返回code、encryptedData、iv给后端,后端拿到前端code之后,请求微信接口获取unionid,如果返回的unionid为空,则使用encryptedData、iv和之前的session_key解密unionid获取小程序信息,后端解密出相应信息返回给前端。
暂无评论内容