微信小程序:一文彻底搞懂openid和unionid
微信开发过程中,经常会遇到,一个企业有多个小程序和公众号,在不同的小程序和公众号中,会有不同的openid。如果想要确定是同一个人,就需要用到unionid机制。
1
官方关于unionid的说明是这样的
公众号文档的描述
开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
小程序文档的描述
如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。
2
微信开放平台
提到unionid就不得不提微信开放平台了
open.weixin.qq.com 微信开放平台,刚开始是为了让开发商,可以支持很多的公众号,而产生的。原因是使用appid和appsecret的方式对于。小程序或公众号的所有者来说太危险,相当于暴露了用户名和秘密。为了安全,出现了开放平台,授权时可以灵活的控制授予哪些权限。开放平台相比appid和appsecret方式还有很多特权。对于开发者是很好的。
注意事项
官方的说明比较简单,开发过程中会遇到不少的坑。下面说一下注意事项
- 公众号开发时只有用户关注了公众号,才可以获取到unionid。如果用户不关注或取消关注公众号,是无法获取unionid的。
- 必须将公众号或小程序绑定到开放平台才可以获取unionid
进入开放平台,点管理中心。可以看到移动应用、网站应用、公众账号、小程序、第三方平台这些菜单。
如果要绑定公众号就,点击公众账号
菜单,然后点击绑定公众号
,填写公众账号、密码、验证码,点下一步,然后需要管理员扫码。之后就绑定了。
小程序的流程也差不多。
- 一个公众号或小程序只能绑定一个开放平台
这与unionid的生成机制有关,unionid是用户与开放平台之间的对应关系,如果绑定多个会造成混乱。
3
unionid的值不同
第三方开放平台,开发过程中会遇到,同一个用户,在两个公众号下,获取到的unionid不同的情况。这种情况发送的原因是,两个公众号绑定到了不同的开放平台账号造成的。
不管是小程序还是公众号,一个开放平台的是有绑定限制的。比如小程序相同主体:上限50个,绑定次数不限。不同主体:上限5个,本月还可以绑定5次。
公众号相同主体:上限50个,绑定次数不限。不同主体:上限5个,本月还可以绑定5次。
所以一般情况下,会让客户自己注册一个开放平台,然后把客户的公众号和小程序绑定上去。
比如客户A
注册开放平台是平台A
,注册小程序是小程序A
,注册公众号是公众号A
;客户B
注册开放平台是平台B
,注册小程序是小程序B
,注册公众号是公众号B
。
他们各自绑定各自的开放平台。小程序A
和公众号A
绑定平台A
,小程序B
和公众号B
绑定平台B
。
开发过程中会出现同一个微信用户,在公众号A
和小程序A
获取到的unionid是一样的比如都是;公众号B
和小程序B
中获取的unionid也是一样的。但是公众号A
和公众号B
获取的unionid不一样。
造成这样的原因是因为绑定的开放平台不用,每个unionid的产生,其实是用户跟开放平台的唯一对应关系。小程序A
和公众号A
绑定平台A
因此他们的unionid一样,公众号A
和公众号B
绑定在不同的开放平台所以取到的unionid不一样。
还有一点要注意,开发公司A的开放平台公司A平台
,同一个平台下创建多个第三方平台
用于开发,这些第三方平台
也会取到相同的unionid。
重要的事情说三遍unionid与绑定的平台有关,unionid与绑定的平台有关,unionid与绑定的平台有关
,unionid其实是用户和开放平台账户的对应关系。
有一点值得注意:如果有个开发公司B,在开放平台
公司B平台
,有公众号A授权的情况下,取到的unionid与公司A平台
获取的公众号A的unionid也会一样。这其实也是为了便于微信做大数据 分析,知道一个用户所有行为。
4
为什么需要openid
在微信小程序的开发过程中,往往需要将用户信息录入自己的数据库中,就得有一个唯一标记区分用户,这个标记就是openid。当一个用户使用了某个微信小程序,微信后台会产生一个openid,并且是唯一的,所以可以通过这个来区分用户。
另一方面,我们通过微信小程序API并不能获取到更多用户私密信息,只能获取到昵称,性别,居住地等公开的信息,微信号这种私密信息是获取到的,而通过这些昵称或者居住地,是没办法保证用户表里的用户数据是唯一的。
所以综合而言,如果不需要建立自己的用户数据库,就没必要使用openid;如果需要,就得获取openid。
顺便说一下,还有一个unionid的东西存在。现在同一家开发公司甲,既有微信小程序A,又有微信公众号B,都是用同一个开发平台账号开发的。
同时微信小程序A有个用户的openid是X,微信公众号B有个用户的openid是Y,那么我们怎么判断这两个用户是不是同一个人呢?所以引入了unionid的概念。
同一用户,对同一个微信开放平台下的不同应用,unionid是相同的 。什么意思呢?假如用户乙关注了这两个程序,那么乙在小程序A的应用中opendi是X,unionid是Z;同时乙在公众号B应用中的openid是Y,unionid是Z。
5
如何获取openid
获取openid主要是两个步骤:
- wx.login()得到code
- 通过code以及appid,secret 得到openid
6
获取用户信息
既然要获取openid,那肯定就是要将用户录入数据库,那肯定也要获取用户信息。目前能通过wx.getUserInfo获取到的用户信息是例如昵称、性别这一类的公开信息。
1、用户授权
获取用户信息需要用户授权,那怎么授权呢?以前可以一进入页面就弹出授权框,现在不提倡了,文档建议使用button,设置open-type来授权。
如下代码,点击button,如果没有授权会弹出授权框,如果拒绝了,那个e.detail.userInfo就是false,会执行else里代码块,如果接受,则执行if为true的操作;如果之前就已经有授权了,就不会弹出授权框,直接执行if为true的操作。
在开发时候,可以在开发者工具上方,点击“清缓存”按钮,这样就可以清除以前的授权信息,得重新授权。
2、获取用户信息
获取用户信息比较简单,调用wx.getUserInfo即可,这一块应该没什么好说的。
- mongoDB初探第一篇(r4笔记第75天)
- 重温快速排序(r4笔记第73天)
- Java基础-17(01)总结,TreeSet,LinkHashSet
- 海量数据迁移之数据抽取流程 (r4笔记第72天)
- CSS Selectors Level 4新特性全面解析
- 巧用外部表避免大量的insert (r4笔记第71天)
- 如何用java语言实现C#中的ref关键字(按引用传递参数)的效果
- 16(01)总结List的子类,ArrayList,Vector,LinkedList
- 16(02)总结泛型
- 基于 React + Webpack 的音乐相册项目(上)
- 16(03)总结增强for循环,静态导入,可变参数
- 基于 React + Webpack 的音乐相册项目(下)
- 通过图表简化sql语句的表关联(r4笔记第70天)
- 通过编程控制CPU利用率(r4笔记第69天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微信小程序支付服务端.net core实现,简单直接
- PBE加密 .net 实现
- .net Core 图片验证码 基于SkiaSharp实现
- 解决git/github下载速度缓慢的问题总汇------转
- C语言程序框架注释的一种模板
- Kryo 入门指南
- C# 通过T4自动生成代码
- Netty 主从多线程
- 斐波那契数组-递归和循环实现
- KMP算法 C#实现 字符串查找简单实现
- elasticsearch压力测试工具之ESrally使用说明
- BitMap算法 .net实现 用于去重并且排序,适用于大型权限管理 ,大数据去重排序
- 5.FFMPEG-Qt移植ffmpeg、ffmpeg结构体介绍
- winform总结6=>线程和委托的关系
- winform总结3> 有趣的bat/winform程序完成自己的任务,然后把自己删除