UnionID机制,官方的解释是:

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

重点是只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的。

之前很多人问过我,え~我有个服务号、订阅号还有小程序呢,我想实现他们之间的用户数据互通,该怎么整?每个号所获取的用户的openid都是不一样的呀。

很好,UnionID的出现就是解决这个问题的。

所需材料:微信open平台,需要做数据互通的任何类型公众号。

在将公众号绑定到开放平台之前,我们先来试试获取一个未关注用户的基本信息,看看微信侧会给我们返回什么参数。

{
    "subscribe": 0,
    "openid": "xxx"
}

上图所示,我们只能获取到用户的关注状态。其他信息我们都获取不了。

我们把公众号和小程序都绑定上,看看调用接口后,微信会给我们返回什么。

绑定后,我们分别请求公众号和小程序的userinfo接口。

小程序:

{
    "subscribe": 0,
    "openid": "xxx",
    "unionid": "xxx"
}

公众号:

{
    "subscribe": 1,
    "openid": "xxx",
    "nickname": "Zixu Liao",
    "unionid": "xxx"
    ...
}

多了一个unionID字段,无论用户有没有关注,都会有返回的一个字段,这个unionid数据在小程序和公众号接口返回中都是一致的。

在小程序端,我们调用wx.login获得code后,向微信服务器索取openid,看看会获取到什么

{
    "session_key": "xxx",
    "openid": "xxx",
    "unionid": "xxx"
}

针对老系统的升级方案其实比较简单,如果要新增小程序的话,可以沿用原来的数据库,一般都有一个user表的吧?新增两个字段,一个用来存储unionid,则另一个用来存储小程序的openid。

在登陆入口,如果有返unionid,就可以通过unionid查openid。「微信官方没有提供unionid to openid 的反查接口」