上次接手一个项目须要整合公众号、小程序以及APP的用户,查阅了微信文档以及一些做者的文章,中间踩了很多坑,在此记录一下解决的流程。前端
实现统一信息的有如下几点:
1. 在微信开放平台绑定须要统一信息的应用;
2. 公众号采用以snsapi_userinfo为scope发起的网页受权,小程序使用wx.getUserInfo(Object object)受权,何时受权后面会解释;
3. 数据库保存unionid。redis
解释下上面的第二点为何必定要采用scope=snsapi_userinfo的方式,根据微信文档:微信网页受权使用这种方式能够跳过关注公众号获取该用户的基本信息,前提是用户赞成受权,这里的受权只会受权一次,之后就不须要受权了。使用这种方式获取用户信息的时候,必须使用拉取用户信息接口,使用获取用户基本信息(UnionID机制)接口虽然能够拿到用户信息,可是用户未关注是拿不到任何信息的。数据库
这一步由对应的应用调用微信api获取微信的临时code。注意公众号不一样于移动应用,公众号获取code的方式必须采用要点中的第二点方式;由于获取code的接口中包含appid,通常由后台处理加密以后给h5使用,后台处理的时候scope必定要为snsapi_userinfo。小程序
不一样应用调用不一样的微信api获取用户信息就好了,全部应用都保证能够获取到unionid,上次就在公众号获取uniond为空踩坑。api
1. 经过unionid查询数据库;
2. 若是数据为空,则经过openid查询用户信息(这里是兼容之前没有unionid的用户);
3. 若是数据仍为空,则新增用户数据,不为空就返回。微信
为何要单独提出小程序的处理,由于小程序登陆时分为两部进行:
1. 前端:使用wx.login()调用后台登陆方法,若是存在用户数据就返回前端;
2. 后台:不存在用户则保存临时生成的信息到redis,这里我使用uuid生成的用户code,保存的信息为微信返回的sessionKey,这个是不能给前端的;
3. 前端:使用wx.getUserInfo(Object object)受权,调用后台绑定用户信息的接口(另外一个接口),这里注意要对encryptedData进行UTF-8的解码,否则解析不了用户信息,使用微信的解密方法就能够获取到用户基本信息。session