问题背景:做了微信小程序,一切都还正常,但是最后体验版放出去时,却发现很多用户无法绑定用户,后台返回:参数非法。经过多方排查,发现是微信拿到的code请求返回的数据里没有UnionId,也就是接口返回的参数中不包含UnionId参数。

1、UnionID机制说明
  简而言之,微信针对不同的用户在不同的应用下都有唯一的一个 openId,但是要想确定用户是不是同一个用户,就需要靠 unionid 来区分。通常自己的后台都会有自己的一个用户表,每个用户有不同的 userid。也就是说同一个用户在同一个微信开放平台下的相同主体的应用对应着相同的 userid, unionid 以及不同的 openid。所以在用户登录进来的时候,我们只能靠微信返回给我们的 unionid 去判断是不是同一个用户,再去关联我们的用户表,拿到对应的 user_id。

  注意: 后边这句话的描述:用户关注过公众号,或者曾经登录过App或公众号,则用户打开小程序时,开发者可以直接通过wx.login获取到该用户UnionID。即:如果用户没有关注过公众号,或者没有登陆过App,通过wx.login是无法获取到该用户UnionID,只能通过wx.getUserInfo来获取UnionId。经验证,系统不存在UnionId的小程序用户都是没有关注公众号或未在App中使用微信授权的用户

2、问题背景

  一般情况下(即在登录小程序之前,已经关注过公众号或已经登录过公众号或已经使用微信登录的方式登录过app),用户通过以下两步就正常成功登录网站:(1)wx.login获取code;(2)通过code请求后台,后台转发微信api用来换取openid及session_key等信息,此可以得到Unionid

  另一种情况(即在登录小程序之前,既没有关注过公众号,也没有登录过公众号,更没有使用微信登录的方式登录过app),通过 wx.login 的到的 code 换不回 unionid 及 openid 等信息。

3、解决方案:

  获取小程序UnionId应该以wx.getUserInfo的UnionId为主。wx.getUserInfo需要用户授权,产品方面,需要考虑用户拒绝授权的处理流程。

  wx.getUserInfo获取数据之后解密的方法,可以看官方文档。

  解决思路:通过带登录态的 wx.getUserInfo 获取到用户的加密数据 encryptedData 和加密算法的初始向量iv,然后将 encryptdata、iv 以及 code传给后端,后端再去通过接收到的encryptedData、iv以、code 以及之前的 session_key 解密出用户的 openid、unionid 等。加密数据解密算法

转载于:https://www.cnblogs.com/goloving/p/10532716.html

微信小程序无法获取UnionId的情况及处理相关推荐

  1. 微信小程序中获取用户微信公众号授权(openid)用来发送模板消息

    需求: 由于小程序不能直接向用户发送模板消息,所以需要用公众号向用户发送模板消息. 于是需要将小程序的openid和公众号的openid绑定在一起.提供两种思路: 方法一: 1.微信小程序和公众号都绑 ...

  2. 微信小程序之获取用户基本信息

    微信小程序之获取用户基本信息 一.使用Redis存储access-token package com.qfjy.project.weixin.api.accessToken;import com.qf ...

  3. 微信小程序缓存获取数据教程

    微信小程序缓存获取数据教程 每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStorageSync).wx.getStorage(wx.getStorageSy ...

  4. 微信小程序——最新获取用户昵称和头像的方法总结

    前段时间微信小程序对获取用户昵称和头像方法进行了更新,网上很多的文章都已经不适用了,这里简单总结一下 首先,传统接口wx.getUserInfo的效果会弹出一个给用户的弹窗,需要用户授权,经过测试传统 ...

  5. 微信小程序授权 获取用户信息

    微信小程序授权 获取用户信息 小程序昵称突然变成了"微信用户",头像也不显示, <!-- 近期很多小伙伴通过该方法获取头像和昵称,代码也没有做改变,突然就变成了下面这样子 - ...

  6. 微信小程序之获取后台动态数据表格布局display:table

    微信小程序之获取后台动态数据表格布局display:table 猿来独往 2018-09-02 本文没有采用flex布局和grid布局来设置表格的,而是通过 display: table;来设置. 一 ...

  7. 微信小程序批量获取input的输入值,监听输入框,数据同步

    微信小程序批量获取input的输入值,监听输入框,数据同步 在使用小程序时,跟vue的数据绑定不一样,没有v-model这个属性了,官网也只是给了一些事件监听. 但是我们如果有多个表单时,需要写多个事 ...

  8. 微信小程序之获取用户地址

    在微信小程序中获取定位信息 今天一整天基本上都在处理在微信小程序中获取准确地址,给出定位并给出所在城市的问题.经过走了半天弯路,现在总结一下所需要的步骤. 一. 先到腾讯位置服务中心获取KEY 通过小 ...

  9. 微信小程序制作——获取用户信息

    微信小程序制作--获取用户信息 1.获取用户信息 方式一 wxml <view bindtap="getUserName">获取当前用户名</view> j ...

最新文章

  1. [转]ArcGIS.Server.9.3和ArcGIS API for Flex实现Query查询定位中心功能(七)
  2. python3.8自带matlop和numpy吗_Python enlop包_程序模块 - PyPI - Python中文网
  3. 有一种爱,永远也无法逾越
  4. 医学科研中的作用_医学论文中参考文献的作用及常见类型
  5. 详解JavaScript中ES5和ES6的类、继承之间区别和联系
  6. 网址被微信拦截怎么办 微信屏蔽的域名如何正常访问
  7. Quest Recovery Manager for Active Directory的使用(一)
  8. linux如何关掉正在启动的服务器,Linux服务管理(如何关闭或禁用不需要的服务)?...
  9. 苹果谷歌微软薪酬大揭秘,最高320万元!
  10. python3+pip安装教程--centos6
  11. 华为路由器配置网络地址转换NAT/静态NAT/动态NAT/Easy-ip/NAPT代理上网
  12. 亚马逊测评技术一定要懂得以下几点
  13. 被空降到一个团队当领导,你会如何烧自己的三把火?
  14. error: You must be logged in to the server (Unauthorized)报错处理
  15. 小熊学Java第六天
  16. PHP+Wampserver(其中的MariaDB数据库)制作留言板
  17. iOS应用崩溃日志揭秘
  18. long(Long)与int(Integer)之间的转换
  19. 在eclipse中将一个PNG图片转换成十六进制字节数组输出
  20. 红米k40游戏加速开启方法分享

热门文章

  1. Cassandra 数据分区
  2. 修炼九阴真经Windows Phone开发 (11):计划任务PeriodicTask和ResourceIntensiveTask概述和示例...
  3. 项目管理-时间冲突带来的问题
  4. .NET,你忘记了么?(二)——使用using清理非托管资源
  5. java jar包和war包_java中jar包和war包之间有什么区别
  6. node.js java web_Node.js 做 Web 后端优势为什么这么大?
  7. PHP无限分类-PHP100代码篇
  8. 玩转springboot入门配置yml单元测试文件获取值
  9. spring 基本配置学习
  10. 阿里云域名注册和虚拟云主机