OpenID和UnionID是什么

某一天在微信群里畅游的时候,看到一个群友发出这样的一个问题:image.png
OpenID和UnionID到底是个啥?OpenID 是微信提供给开发者的用户唯一标识。然而当开发者拥有多个移动应用、网站应用、和公众账号(包括小程序)时,同一用户、不同应用下的 OpenID 是不一样的。而同一个微信开放平台账号下的不同应用,用户的 UnionID 是唯一的。
因此,对有多个应用的开发者来讲,只有通过 UnionID 来区分用户的唯一性,才能实现多个应用间的账号打通。

打个比方:你在高三(1)班里的学号是47号(OpenID),只要进入1班(应用),喊:“47号出来,老师喊你去办公室补作业了了。”这时你就得很尴尬站起来走去办公室。而如果当年级主任在广播中高喊:“47号,来趟校长办公室”时候,这时你和其他班级里面的47号同学肯定面面相觑,到底是哪个47号。而如果广播中喊得是:201xxxxxx0147(UnionID)的时候,大伙就能准确定位到你身上,因为你的校园ID只有唯一一个。

应该使用哪个ID登录

理论上认为,当产品有小程序,公众号,网页H5等多种形式的时候,UnionID是最好的选择,否则会认为同一用户在不同的应用下的OpenID不一样导致产生多个账号,这对于获取用户的第一步来说,是非常不友好的。但是unionID并不是那么容易获取的,所以有的开发者会使用OpenID,以最大程度的降低用户获取的成本,从而推动注册用户数的快速增长。

小程序OpenID和UnionID获取机制

在小程序的官方文档里有张图解释了小程序调用wx.login接口的登录流程。如下:

关于微信小程序的OpenID和UnionID - 图2

不过,可能只有开发的同学才能快速明白图内特容的含义。翻译一下:可以理解成这几步:

  • 首先,开发者可以在小程序中静默调用登录接口,拿到一个凭证
  • 小程序把凭证发送到开发者的服务器上
  • 服务器拿着这个凭证以及小程序密钥向微信接口请求换取 OpenID
  • 微信接口返回 OpenID 给开发者服务器,满足特殊条件时会一并返回 UnionID
  • 开发者服务器创建登录态并返回给小程序,从而完成登录

官方文档补充:其中第四点,在满足下面任何一个条件时候可以同时获得UnionID

  1. 必须使用一个专门按钮控件让用户去主动点击,然后微信弹出授权弹窗,用户点击同意
  2. 如果开发者账号下存在同主体的公众号或移动应用 ,并且用户已经授权登录过该公众号或移动应用。
  3. 如果开发者账号下存在同主体的公众号,并且该用户已经关注了该公众号
  4. 用户在小程序中完成支付后,可以无需用户授权,五分钟内可以获取有效的UnionID
  5. 小程序端调用云函数时,如果开发者帐号下存在同一主体公众号,并且该用户已经关注了该公众号,可在云函数中通过接口 获取 UnionID。

(插播一条:特别尤其是第一条,发的两步互动操作中,都会一定程度上造成用户的流失,这时候列举一个很巧妙的解决方案:拼多多,当用户登录拼多多小程序的时候,拼多多默默收集了OpenID,然后在个人中心中有个更新数据的按钮,单击即可触发第一条条件。)

对于不同的业务场景,会有各自最适合的选择。深入研究下微信的机制,或许能有一些启发,在某些场景下可以尝试优化用户获取的路径。
**

公开的信息有哪些

最后聊聊用户公开信息(UserInfo)包含哪些信息:

  • 微信昵称
  • 微信头像图片的URL,如果用户没有头像,URL会是空的。如果用户更换了头像,原有头像的URL会失效
  • 用户性别:未知、男性、女性
  • 所在国家
  • 所在省份
  • 所在城市
  • 国家、省份、城市所用的语言:英文、简体中文、繁体中文

补充信息:

  • 同一个微信账号,同一个应用(appid),生成的openid不会改变不分设备
  • 用户在不同的小程序拥有不同的openID