UnionID机制,官方的解释是:
通过获取用户基本信息接口,开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个公众号,可使用以下办法通过UnionID机制来在多公众号之间进行用户帐号互通。只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的。换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。
此前的OpenID机制,每个微信号对应每个公众号只有唯一的OpenID,所以不同微信公众号之间是不能共享用户的,现在有了UnionID就可以了。
开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
OpenID机制
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)
OpenId是根据appId生成的,在一个app中openId是唯一的,也就是说同一用户在不同的APP中openId是不一样的。
同一个应用(App、公众号、小程序)的同一个用户有唯一的openid
openid 是针对应用唯一的,unionid 是针对企业唯一的
可以经常看到网络上有这样的问题:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=&openid=
我利用这个接口有时候可以获取到用户信息,有时候又获取不到,请问这是哪里的问题?
或者说有没有其他方法可以获取到用户的unionid?
原因在于
没有关注公众号 这个接口是获取不了用户的信息的;Unionid这个信息,是要把公众号绑定在微信开放平台上之后才有的。没有绑定,即使用户关注了公众号也没用。
请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
unionid 是微信开放平台的——
对于绑定了同一个开放平台的两个服务号 A 和服务号 B,用户 1 关注 A 和 B 会有不同的 openid,但他们的 unionid 的相同的。
也就是说可以用它来确定多个公众号的用户是否是同一个人。当然可以通过公开信息判断,但并不严谨,因为资料都是可以修改的,雷同也是完全可能的。
当然,其实不用 unionid 也是可以实现这个需求的。方法是,每次用户第一次访问公众号页面,让他自动跳转一个固定的公众号(静默授权,记录 openid ),再跳回来。这样的话不需要通过 unionid 也能知道用户在多个公众号是否为同一人。唯一的缺点就是用户的第一次访问页面需要跳转多次。
这里有一篇详细的参考,介绍如何在TP5本地环境下获取微信用户openId与用户信息:https://blog.csdn.net/Especial_/article/details/82382041
微信开放平台
open.weixin.qq.com 微信开放平台,刚开始是为了让开发商,可以支持很多的公众号,而产生的。原因是使用appid和appsecret的方式对于。小程序或公众号的所有者来说太危险,相当于暴露了用户名和秘密。为了安全,出现了开放平台,授权时可以灵活的控制授予哪些权限。开放平台相比appid和appsecret方式还有很多特权。对于开发者是很好的。
官方的说明比较简单,开发过程中会遇到不少的坑。下面说一下注意事项
-
公众号开发时只有用户关注了公众号,才可以获取到unionid。如果用户不关注或取消关注公众号,是无法获取unionid的。
-
必须将公众号或小程序绑定到开放平台才可以获取unionid
进入开放平台,点管理中心。可以看到移动应用、网站应用、公众账号、小程序、第三方平台这些菜单。
如果要绑定公众号就,点击公众账号
菜单,然后点击绑定公众号
,填写公众账号、密码、验证码,点下一步,然后需要管理员扫码。之后就绑定了。
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也会一样。这其实也是为了便于微信做大数据 分析,知道一个用户所有行为。
获取openid主要是两个步骤:
-
wx.login()得到code
-
通过code以及appid,secret 得到openid