上次接手一個項目須要整合公衆號、小程序以及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