上次接手一個項目需要整合公眾號、小程式以及APP的用戶,查閱了微信文檔以及一些作者的文章,中間踩了不少坑,在此記錄一下解決的流程。 要點 實現統一信息的有以下幾點: 1. 在微信開放平臺綁定需要統一信息的應用; 2. 公眾號採用以snsapi_user ...
上次接手一個項目需要整合公眾號、小程式以及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的解碼,不然解析不了用戶信息,使用微信的解密方法就可以獲取到用戶基本信息。