微信的openid(OpenID和UnionID到底的哪些秘密)
话不多说,直奔主题,当然也不是谈论什么惊天大秘密,只是公开的小秘密。
OpenID: 相当于用户在应用(小程序、公众号、小游戏)里的userid,这个id在本应用里固定不变,但是不同应用的OpenID不一样。比如在抖音小程序的OpenID是1,在头条小程序的OpenID是2。
开发者可以通过微信官方提供的登录能力方便地获取OpenID。官方流程如下图。
小程序前端通过wx.login()获取一个用户的临时code(有效期五分钟),然后通过wx.request()接口发送到开发者服务器。
wx.login({success(res){if(res.code){//发起网络请求
wx.request({url:'https://test.com/onLogin',data:{code:res.code
}
})
}else{console.log('登录失败!'+res.errMsg)
}
}
})
开发者服务器通过前端传过来的code,再加上appid+appsecret请求微信服务器,获取用户OpenID和session_key。其中session_key是有有效期的,至于多少开发者不知道。之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。官方建议不要把openid和session_key给小程序前端,而是在后端把他们作为value存到缓存中,把key传给前端。前端在调用接口的时候带上key。后端通过key获取到value,来维护用户身份。
请求地址:
GEThttps://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
为什么每个应用的OpenID不一样,如果每个微信用户在不同的应用中OpenID,岂不是更好维护。
其实还是为了安全,如果OpenID一样,首先我们就可以通过OpenID做一些营销,就比如我们现在收到的垃圾短信,因为我们对外界暴露的手机号只有一个。但是如果我们给每个商家留的手机号不一样,短信只收这个商家的,那我们就少了许多垃圾短信。再有就是,几个微信大号有上亿的粉丝,如果让他们掌握了OpenID,也就是间接地掌握了微信用户的一些信息。微信肯定是不允许这样的。
UnionID:一个主体(公司)下的用户唯一标识。之前讲的抖音和头条的OpenID不一样。既然他们都属于字节跳动,为什么登陆授权了头条,再用抖音的时候还需要登陆授权呢。就是老生常谈的SSO。UnionID就是为了解决这个问题而生。主要主体拥有了用户的UnionID,就可以自己授权用户登陆主体下的其他应用。当然用户在每个主体里的UnionID也是不一样的。
用户可以通过如下方式获取UnionID。
1.调用接口wx.getUserInfo,从解密数据中获取UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。2.如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过wx.login+code2Session获取到该用户UnionID,无须用户再次授权。3.如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过wx.login+code2Session获取到该用户UnionID,无须用户再次授权。4.用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。5.小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过cloud.getWXContext获取UnionID。6.小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过cloud.getWXContext获取UnionID。
所以 : OpenID的是针对单个应用的,UnionID针对主体的。
相关文章:
相关推荐: