微信小程序> 微信openid,微信小程序登录openid和unionid

微信openid,微信小程序登录openid和unionid

浏览量:878 时间: 来源:凯皇
本文转自https://www.cnblogs.com/yaoyuqian/p/8203792.html
我们一般都是先获取到微信的unionid,然后再通过unionid去登录自己的网站,就可以关联到用户在自己网站上的user_id,但是在小程序登录中,有时候可以获取到unionid,有时候获取不到,在获取不到unionid的情况下,用户无法正常登录网站。UnionID机制说明:如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。同一个微信开放平台下的相同主体的App、公众号、小程序,如果用户已经关注公众号,或者曾经登录过App或公众号,则用户打开小程序时,开发者可以直接通过获取到该用户UnionID,无须用户再次授权。(解读:用户如果没有登录过app,也没有登录过公众号,也没有关注过公众号的情况下,小程序中通过wx.login是获取不到unionid的)简而言之,微信针对不同的用户在不同的应用下都有唯一的一个openId,但是要想确定用户是不是同一个用户,就需要靠unionid来区分。通常自己的后台都会有自己的一个用户表,每个用户有不同的userid。也就是说同一个用户在同一个微信开放平台下的相同主体的应用对应着相同的userid,unionid以及不同的openid。所以在用户登录进来的时候,我们只能靠微信返回给我们的unionid去判断是不是同一个用户,再去关联我们的用户表,拿到对应的user_id。一般情况下(即在登录小程序之前,已经关注过公众号或已经登录过公众号或已经使用微信登录的方式登录过app),用户通过以下两步就正常成功登录网站。1.获取code(登录凭证,用来换取openid及session_key等)wx.login({success:function(res){if(res.code){that.getNeededUserInfo(res.code);}else{console.log('获取用户登录态失败!'+res.errMsg);}}})2.获取用户信息(利用wx.login返回的code获取用户的信息)getNeededUserInfo:function(code){wx.request({url:'https://my.com/login',method:'POST',data:{code:code//后端通过这个code去调用微信的接口(https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code),传入参数code、appid、appsecret后获取到微信返回的unionid、openid及session_key等。(然后后端可以直接利用微信返回的信息去关联用户在自己网站的user_id)},success:function(res){//可以返回前端需要的用户信息(包括unionid、openid、user_id等)}})}二般情况下(即在登录小程序之前,既没有关注过公众号,也没有登录过公众号,更没有使用微信登录的方式登录过app),通过wx.login的到的code换不回unionid及openid等信息。解决思路:通过带登录态的获取到用户的加密数据encryptedData和加密算法的初始向量iv,然后将encryptdata、iv以及code传给后端,后端再去通过接收到的encryptedData、iv以、code以及之前的session_key解密出用户的openid、unionid等。以下是具体实现步骤:1.获取code(登录凭证,用来换取openid及session_key等)wx.login({success:function(res){if(res.code){that.getNeededUserInfo(res.code);}else{console.log('获取用户登录态失败!'+res.errMsg);}}})2.获取加密数据和加密算法初始向量旧版本基础库调取wx.getUserInfo()可以直接获取到微信返回的encryptdata等完整数据,基础库更新之后,需要增加withCredentials属性,并将属性值设置为true时才可以获取到除用户基本信息之外的encryptedData以及iv等数据。需要注意的是:当withCredentials值为true时,要求此前有调用过wx.login且登录态尚未过期。getEncData:function(){wx.getUserInfo({withCredentials:true,success:function(res){that.getNeededUserInfo(code,res.encryptedData,res.encryptedData);}})}3.获取用户信息(利用wx.login返回的code获取用户的信息)getNeededUserInfo:function(code,enc,iv){wx.request({url:'https://my.com/login',method:'POST',data:{code:code,encryptedData:enc,iv:iv},success:function(res){//可以返回前端需要的用户信息(包括unionid、openid、user_id等)}})}实际项目中需要将以上两种情况整合以后使用。思路有两种:第一种:(前端判断是否有unionid)在向后端上传code并且后端返回数据以后,前端判断返回值中是否有unionid或者unionid是否为null,null的情况下去调用带有用户登录态的wx.getUserInfo(),然后再将微信返回的encryptedData和iv返回给后端,后端解密出相应的信息后再返回给前端;第二种:(后端判断是否有unionid)前端在调用wx.getUserInfo()时候带着登录态,然后不管后台能不能拿到unionid,都把encryptedData和iv返回给后端,后端在拿到前端code之后去请求微信的接口拿unionid,如果返回的unionid为空,再拿前端传的encryptedData、iv以及之前的session_key解密出unionid。

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎