上次接手一个项目需要整合公众号、小程序以及app的用户,查阅了微信文档以及一些作者的文章,中间踩了不少坑,在此记录一下解决的流程。

要点

实现统一信息的有以下几点:

1. 在微信开放平台绑定需要统一信息的应用;

2. 公众号采用以snsapi_userinfo为scope发起的网页授权,小程序使用wx.getuserinfo(object object)授权,什么时候授权后面会解释;

3. 数据库保存unionid。

具体实现

解释下上面的第二点为什么一定要采用scope=snsapi_userinfo的方式,根据微信文档:使用这种方式可以跳过关注公众号获取该用户的基本信息,前提是用户同意授权,这里的授权只会授权一次,以后就不需要授权了。使用这种方式获取用户信息的时候,必须使用接口,使用获取用户基本信息(unionid机制)接口虽然可以拿到用户信息,但是用户未关注是拿不到任何信息的。

微信code获取

这一步由对应的应用调用微信api获取微信的临时code。注意公众号不同于移动应用,公众号获取code的方式必须采用要点中的第二点方式;因为获取code的接口中包含appid,一般由后台处理加密之后给h5使用,后台处理的时候scope一定要为snsapi_userinfo。

通过code获取用户基本信息

不同应用调用不同的微信api获取用户信息就行了,所有应用都保证可以获取到unionid,上次就在公众号获取uniond为空踩坑。

公众号、app处理:

1. 通过unionid查询数据库;

2. 如果数据为空,则通过openid查询用户信息(这里是兼容以前没有unionid的用户);

3. 如果数据仍为空,则新增用户数据,不为空就返回。

小程序处理:

为什么要单独提出小程序的处理,因为小程序登录时分为两部进行:

1. 前端:使用wx.login()调用后台登录方法,如果存在用户数据就返回前端;

2. 后台:不存在用户则保存临时生成的信息到redis,这里我使用uuid生成的用户code,保存的信息为微信返回的sessionkey,这个是不能给前端的;

3. 前端:使用wx.getuserinfo(object object)授权,调用后台绑定用户信息的接口(另一个接口),这里注意要对encrypteddata进行utf-8的解码,不然解析不了用户信息,使用微信的解密方法就可以获取到用户基本信息。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!