什么是openid、unionid?
同一个微信用户在不同的应用中存在不同的唯一ID,就是openid,但是当两个应用绑定在同一个微信开发者平台账号下的时候,可以判断出两个openid关联的是同一个unionid,这样,开发者就知道两个应用中的两个用户其实是同一个用户。需要注意,假如两个应用没有绑定在同一个开发者账号下,那意味着无法获取到unionid。
如果开发者拥有多个移动应用、网站应用、公众帐号及小程序,可通过 UnionID 来区分用户的唯一性。因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。 官网:developers.weixin.qq.com/community/b…
什么是微信微信开放平台,怎么绑定多个应用(app,网页,公众号,小程序等)?
登录微信开放平台 open.weixin.qq.com/— 管理中心 — 小程序 — 绑定小程序
来源:developers.weixin.qq.com/miniprogram…
微信开放平台、第三方平台是什么?他和微信开放平台是什么关系?
定义:
- 微信开放平台:open.weixin.qq.com/ (问题:微信有了公众号账号,小程序账号,怎么还要注册一个开放平台账号呢?这不是多此一举吗?)我的理解是:
- 用来打通相同主体或不同主体的小程序/公众号/移动应用/网站应用的用户体系(unionid)的,只需要将他们绑定在一个开放平台上即可,但绑定个数有限制。即,作为主体第三方。
- 对于一些集团型的企业,申请第三方平台是为了服务集团内的公众号和小程序。对于同一公司的公众号和小程序有身份打通的需求,即需要将公众号和小程序挂到同一个开放平台帐号下。
来源:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/getting_started/terminology_introduce.html
- 用来注册为服务商,作为第三方来提供开发服务。即,作为供应第三方。
- 用来提供给非微信生态圈产品(公众号,小程序)的其他app来服务,比如提供0Auth微信登录等。
- 第三方平台:开放给所有通过开发者资质认证的开发者使用。在得到公众号或小程序运营者(简称运营者)授权后,第三方平台开发者可以通过调用微信开放平台的接口能力,为公众号或小程序的运营者提供账号申请、小程序创建、技术开发、行业方案、活动营销、插件能力等全方位服务。简单来说第三方平台就是用来代注册/开发/运营小程序或公众号的。
关系:第三方平台是开放平台下的一种能力,从用户体系的角度来说,两者没有从属关系,也就是说绑定在开放平台下的公众号/小程序/移动应用/网站应用内的用户unionid 和第三方平台下的小程序/公众号的用户unionid不是一致的。
⚠️注意:开放平台账号跟公众号账号不是一个东西,如果你的企业注册了公众号,如果需要开放平台,需要单独注册并再次认证。
H5如何获取用户的openid和unionid
这里说的H5,是指网页应用,也就是说用户在微信客户端访问网页应用,可以通过授权机制获取到用户的信息,进而实现业务逻辑。
网页授权回调域名的说明:
1)在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
2) 授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面www.qq.com/music.html 、 www.qq.com/login.html 都可以进行OAuth2.0鉴权。但pay.qq.com 、 music.qq.com 、 qq.com 无法进行OAuth2.0鉴权;
3)如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可。
来源:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
即,网页的获取openID和unionID的方式其实就是oAuth,就是通常说的网页app(web app)如果要获取第三方登录的信息,需要做oAuth,比如上面提到的注册app和回调页面,获取的权限scope设置等。
Scope的方式有两种:
1)静默(implicit)授权获取openid
以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2)非静默(显式explicit)授权获取openid
以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。 (翻译:就是说,用户可以通过授权框确认授权,获取用户的基本信息,这里的基本信息是包含unionid的,但是前提是应用已经绑定了微信开放平台的开发者账号)
到这里两种方式并没有完,微信官方文档中又增加了一条奇怪的限制: “用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。”
这是因为聪明的开发者想到了规避用户授权就能获取到包括unionid在内的用户基本信息的方法,所以在后续的迭代中,微信屏蔽了这个接口。什么方法呢,就是用静默的方式获取到用户的openid,然后在“用户管理的接口中用openid去查用户信息”,如图:
那么微信为了规避这种情况的发生,所以给出了限制,使用用户管理类接口中的获取用户基本信息的接口时,必须要先关注公众号,否则返回的信息只有openid,也就是说,你只能用openid换回来openid,等于啥都没有~~~
结论:
1) 其实关注公众号也相当于用户已经显式授权了。所以合理。
2) 网页应用可以静默获取openid,可以授权获取用户基本信息(包括unionid)
实现细节:
参考链接(请在微信客户端中打开此链接体验):
1) scope为snsapi_base
open.weixin.qq.com/connect/oau…
2) scope为snsapi_userinfo
open.weixin.qq.com/connect/oau…
⚠️注意:调用的url链接是open.weixin.qq.com/connect/oau… 区别于下面的小程序。
小程序如何获取用户的openid和unionid?
整个过程中,其实是静默获取到用户的openid和unionID(如果有),这一点和早期的小程序不一样,早期的小程序是通过用户授权才能获取。
step 1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
step 2. 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key。
来源:developers.weixin.qq.com/miniprogram…
⚠️注意1,除此之外还有其他方式获取unionID见下面文档👇:
绑定了开发者帐号的小程序,可以通过以下途径获取 UnionID。
1. 开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户授权。
2. 小程序端调用云函数时,可在云函数中通过 Cloud.getWXContext 获取 UnionID。
3. 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。
来源:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
⚠️注意2,反复提到,一定要在开放平台绑定小程序哦!!
⚠️注意3:服务器端code2Session调用的url链接是 api.weixin.qq.com/sns/jscode2… 区别于公众号。
公众号如何获取用户的openid和unionid?
整个过程其实也是静默,而且是被动获取,因为是基于webhook的方式。过程如下:
1)先配置webhook
登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。
来源:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
2)监听webhook
成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。
3)被动获取openID
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括语言和关注时间。
4)主动获取unionID
开发者可通过OpenID来获取用户基本信息,包括unionID,请求url如下。
来源:https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId
⚠️注意1,如果有多个公众号OA也可以获取unionID,需要在开放平台绑定多个OA:
请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
**⚠️注意2,请求URL是api.weixin.qq.com/cgi-bin/use… **
**⚠️注意3,也可以批量获取多个用户的openID和unionID,参考文档developers.weixin.qq.com/doc/offiacc… **
如何排查是否获取unionID成功呢?
同一个开放平台下用户的unionid字符串的前面6个字符是一样的(同一个app/appID下的openid的前6个字符也是一样的)
-
绑定到同一个微信开放平台,为什么获得的unionid不同?
-
当你拿到你‘同一用户’的不同unionid的时候,你比较一下
·如果unionid前面的6个字符不一样,说明你的两个appid没绑定到同一个开放平台下。
·如果前面6个字符一样,说明这个unionid不是同一个用户的。
·如果unionid全部一样,说明完问题解决了。
扩展阅读
讲到这里,你是不是已经懵了。各种openID,各种unionID,各种accessToken,各种登录账号,都是些什么鬼?为了验证你的理解,请回答问题:
已知: 上面讲到,我们可以在公众账号(英文简称OA official account)绑定网页回调页面,然后我们可以在H5开发中,静默获取到用户的openID(简称H5 openID),如果要获取unionID有两个方法:用户手动授权或者你拿着openID去公众号平台接口获取已经关注的用户的unionID(如果没有关注则没有用户unionID)。即,原则是:用户需要同意,授权。
问题1: 我们知道每个不同的应用对应不同的openID,请问同一个用户对于这个H5 openID和绑定的公众号OA openID一样吗?
回答:一样的。
理由1:如果不一样,就不存在上面提到的聪明的程序员先获取H5 openID再去拿这个openID去调用公众号接口获取unionID的情况了。
理由2: 对于用户手动授权的请求传入的appID恰恰是公众号OA的appID,不是什么H5的appID。即,H5用的是OA的接口,是一个东西。链接https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
问题2:接着上面讲,既然H5和OA公用一个openID,但是不是说开放平台可以绑定H5和OA还有小程序啥的吗?如果绑定了H5和OA,那么二者不是应该是单独的openID吗?这是怎么回事?官网图:
回答:如果是在开放平台绑定则确实是不同openID。
理由1:开放平台可以单独绑定H5,从来没有要求这个H5一定要有一个OA关联哦。既然这个单独的H5是跟OA和APP和小程序MP是平级的,则说明其一定有个单独的openID。
理由2: 看H5获取unionID的方法,url虽然跟问题1一样的,但是appID居然是单独的H5的web appID,跟问题1中共用OA的appID是不同的。获取unionID时候提供的appID不同,则说明。。。你懂的。
来源:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Authorized_Interface_Calling_UnionID.html