我们一般都是先获取到微信的 unionid,然后再通过 unionid 去登录自己的网站,就可以关联到用户在自己网站上的 user_id,但是在小程序登录中,有时候可以获取到 unionid,有时候获取不到,在获取不到 unionid 的情况下,用户无法正常登录网站。
UnionID机制说明: 
如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 unionid 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 unionid 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid 是相同的。
同一个微信开放平台下的相同主体的 App、公众号、小程序,如果用户已经关注公众号,或者曾经登录过App或公众号,则用户打开小程序时,开发者可以直接通过 wx.login 获取到该用户UnionID,无须用户再次授权。(解读:用户如果没有登录过app,也没有登录过公众号,也没有关注过公众号的情况下,小程序中通过 wx.login 是获取不到 unionid的)
简而言之,微信针对不同的用户在不同的应用下都有唯一的一个 openId, 但是要想确定用户是不是同一个用户,就需要靠 unionid 来区分。
通常自己的后台都会有自己的一个用户表,每个用户有不同的 userid。也就是说同一个用户在同一个微信开放平台下的相同主体的应用对应着相同的 userid, unionid 以及不同的 openid。所以在用户登录进来的时候,我们只能靠微信返回给我们的 unionid 去判断是不是同一个用户,再去关联我们的用户表,拿到对应的 user_id。
一般情况下(即在登录小程序之前,已经关注过公众号或已经登录过公众号或已经使用微信登录的方式登录过app),用户通过以下两步就正常成功登录网站。
 1 1. 获取code(登录凭证,用来换取openid及session_key等)
 2     wx.login({
 3       success: function(res){
 4          if(res.code){
 5              that.getNeededUserInfo(res.code);
 6           }else{
 7           console.log('获取用户登录态失败!'+res.errMsg);
 8       }
 9     }
10   })
11
12 2. 获取用户信息(利用wx.login返回的code获取用户的信息)
13   getNeededUserInfo: function(code){
14     wx.request({
15       url: 'https://my.com/login',
16       method: 'POST',
17       data: {
18         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)
19       },
20       success: function(res){
21         // 可以返回前端需要的用户信息(包括unionid、openid、user_id等)
22       }
23     })
24   }

二般情况下(即在登录小程序之前,既没有关注过公众号,也没有登录过公众号,更没有使用微信登录的方式登录过app),通过 wx.login 的到的 code 换不回 unionid 及 openid 等信息。
解决思路:通过带登录态的 wx.getUserInfo 获取到用户的加密数据 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。

转载于:https://www.cnblogs.com/yaoyuqian/p/8203792.html

微信小程序登录(包括获取不到unionid的情况)相关推荐

  1. sessionkey 微信小程序获取_微信小程序登录,获取code,获取openid,获取session_key...

    微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ...

  2. java微信小程序接口openid过期_Java微信小程序登录接口获取openid

    根据官方文档,wx.login()的回调函数中,需要我们传递生成的用户登录凭证到code2accessToken的接口中 小程序登录方法 code2accessToken的方法中要求传入如下参数 co ...

  3. uniapp - 新版本微信小程序登录、获取电话号码;后端调用微信API不必自己写调用网址【附有前后端完整代码】

    uniapp文档:文档地址 1.uniapp的登录 (1)登录:通过前端获取到code,可直接调用WxMaService类的方法即可实现微信接口 uni.login({provider: 'weixi ...

  4. 小程序获取sessionkey_微信小程序登录并且获取sessionkey详解

    随着小程序的兴起,越来越多的人都选择制作一款小程序,但是小程序开发的时候会遇到很多问题.下面小编就给大家讲解一下如何登录微信小程序并且获取sessionkey. 一.登录态维护 通过 wx.login ...

  5. 微信小程序登录及获取手机号码

    前端:微信先授权登录后再授权获取手机号码 后端:先微信登录获取openid返回前端,前端再传递手机号码code给后端获取手机号码并在本地数据量注册用户信息,需提供2个接口 第一步:先通过code微信授 ...

  6. 微信小程序登录-PHP后端

    微信小程序登录以及获取openid(用户唯一标识)和session_key 一.前端登录代码: //登录获取codelogin:function(){wx.login({success:functio ...

  7. 微信小程序python token验证_微信小程序登录对接Django后端实现JWT方式验证登录

    点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料. 1.使用微信小程序登录和获取用户信息Api接口 2.把Api获取的用户资料和code发送给django后端 3.通过微信接口把co ...

  8. 微信小程序中如何获取用户手机号授权登录

    随着微信小程序的普及,许多应用程序需要用户登录才能提供更好的服务.而获取用户手机号码是验证用户身份和确保账户安全的重要步骤之一.因此,在本文中,我们将介绍如何在微信小程序中实现手机号授权登录. 步骤一 ...

  9. android微信登录获取微信账号,微信小程序--登录授权,一键获取用户微信手机号并登录...

    一.前言 微信小程序登录流程时序 说明: 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器 开发者服务器以code换取 用户唯一标识openid 和 会话密钥sess ...

  10. Java实现微信小程序登录注册:获取OpenId和手机号

    登录流程时序: 说明 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID . 用户在微信 ...

最新文章

  1. NoSQL(一):NoSQL数据库、redis
  2. js 获取 屏幕 可用高度...
  3. IPC\DVS\DVR与NVR之间的区别
  4. 【Quartz】问题记录注意事项【四】
  5. Mybatis 拦截器
  6. C语言:16进制字符串转int
  7. 修改3389端口为3389端口
  8. linux集群应用实战(更新完毕)
  9. 虚拟环境安装python3
  10. 修改HDFS文件所有者
  11. 我的世界java致命错误_《我的世界》六个“致命错误”,最后一个“不作死就不会死”...
  12. 20145236《网络攻防》 Exp3 免杀原理与实践
  13. SSO单点登录原理详解(从入门到精通)
  14. 实现微信支付宝收款到账语音提醒
  15. 2021包膜机十大品牌排行榜
  16. 计算机导师问读研计划和后续计划,考研面试,问“研究生时期的规划”怎么回答急...
  17. html折叠段落标记,HTML 段落标记“p”与换行标记,标题标记“h”!
  18. matplotlib中添加水平线和垂直线
  19. 【LSTM实战】股票走势预测全流程实战(stock predict)
  20. PowerDesigner 模型生成转化为sql脚本

热门文章

  1. 激光计算机的基本原理和特点,3D激光传感器的原理及特点
  2. 三菱fx2n做从站的modbus通讯_第476期丨关于三菱PLC中除法的问题;请教一个监测电流的小物件或方法...
  3. 十岁陌陌更名“挚文集团”的战略新时代|财报解读
  4. 知到网课教师口语艺术考试题库(含答案)
  5. 改变PDF阅读器、CAJViewer的背景颜色
  6. Android NDK下载链接
  7. java过滤空号了停机号_手机号码空号检测
  8. android Google Advertising ID 如何重置
  9. linux libxml2编译,libxml2 ARM 交叉编译
  10. Junit 4 的使用