1. 程式人生 > >統一微信公眾號、小程式、APP的使用者資訊

統一微信公眾號、小程式、APP的使用者資訊

 上次接手一個專案需要整合公眾號、小程式以及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的解碼,不然解析不了使用者資訊,使用微信的解密方法就可以獲取到使用者基本資訊。