获取小程序信息 微信小程序获取用户unionId

联合编号

微信开放平台下同一个实体的应用、公众号、小程序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获取小程序信息,后端解密出相应信息返回给前端。

© 版权声明
THE END
喜欢就支持一下吧
点赞141赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容