微信小程序中的用户ID(包括openid和unionid)

最近在做微信小程序的开发,以前小程序这块接触的不多,所以就想把在项目中每一步遇到的问题总结下来。
开始做的时候,这个openId肯定是要打交道的。那下面我们来看一下openId到底是怎么一回事吧。
做过微信开发的同学,多多少少都会涉及到用户的唯一标识的问题。由于微信牢牢把控着用户的信息,因此当你需要在微信平台中获取用户的标示信息,必然要通过微信的平台接口来获取(其实这个openId是来区分用户唯一标识)。

openid
同一个应用(App、公众号、小程序)的同一个用户有唯一的openid

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

那么如何获取openId和UnionID
我们先看一张图:
微信小程序中的用户ID(包括openid和unionid)
过程并不复杂,其实这里需要说一下的是,为什么会多了一步,开发者服务器去访问微信接口呢?其实,微信官方文档说得很清楚,如果appid和secret存在应用本地,应用本身是容易被**和抓包,非常容易泄露的,会导致安全问题;因此,放到开发者的服务器去访问,能够保证一定的安全性,除非服务器被攻破,否则很难知道appid和secret的

因此可以实现如下的功能
同一个微信开放平台下的相同主体的App、公众号、小程序,如果用户已经关注公众号,或者曾经登录过App或公众号,则用户打开小程序时,开发者可以直接通过wx.login获取到该用户UnionID,无须用户再次授权。

1.使用wx.login得到code,之后让后台请求微信服务器,获得的信息包括
openid: 用户唯一标识
session_key: 用来解密微信提供的加密数据
unionid: 可能有,也可能没有

2.用上一步获得的数据进行登录。由于我的公众号与实际应用使用了不同的用户库,所以即使带了unionid,也不一定已经在应用用户库注册过
若用户不存在,则进入注册流程

3.首先通过wx.getUserInfo获取加密的用户信息,然后通过wx.getPhoneNumber来获取加密后的手机号码,之后统一发到后台解密并完成注册。

总结
同一个用户,在你的多个应用中,openid可能都不相同;但是,unionid一定会相同的。所以,如果你有多个小程序或者微信公众号,需要确定是否为同一个用户的时候,就需要unionid来确定。

(站在巨人的肩膀进行的总结,感谢!)