如何取得小程式的unionid?
問題背景:做了微信小程序,一切都還正常,但是最後體驗版放出去時,卻發現很多用戶無法綁定用戶,後台返回:參數非法。經過多方檢查,發現是微信拿到的code請求回傳的資料裡沒有UnionId,也就是介面回傳的參數不包含UnionId參數。
1、UnionID機制說明
簡而言之,微信針對不同的用戶在不同的應用下都有唯一的一個openId,但是要想確定用戶是不是同一個用戶,就需要靠unionid 來區分。通常自己的後台都會有自己的一個使用者表,每個使用者有不同的 userid。也就是說同一個使用者在同一個微信開放平台下的相同主體的應用對應著相同的 userid, unionid 以及不同的 openid。所以當用戶登入進來的時候,我們只能靠微信回傳給我們的 unionid 去判斷是不是同一個用戶,再去關聯我們的用戶表,拿到對應的 user_id。
注意: 後邊這句話的描述:用戶關注過公眾號,或者曾經登入過App或公眾號,則用戶開啟小程式時,開發者可以直接透過wx.login取得到該用戶UnionID 。即:如果使用者沒有追蹤公眾號,或沒有登陸過App,透過wx.login是無法取得到該使用者UnionID,只能透過wx.getUserInfo來取得UnionId。經驗證,系統不存在UnionId的小程式使用者都是沒有關注公眾號或未在App中使用微信授權的使用者
2、問題背景
一般情況下(即在登入小程式之前,已經關注過公眾號或已經登入公眾號或已經使用微信登入的方式登入過app),使用者透過以下兩步驟就正常成功登入網站:(1)wx.login取得code;(2)透過code請求後台,後台轉發微信api用來換取openid及session_key等信息,此可以得到Unionid
另一種情況(即在登入小程式之前,既沒有關注過公眾號,也沒有登入公眾號,更沒有使用微信登入的方式登入app),透過wx.login 的到的code 換不回unionid 及openid 等資訊。
3、解決方案:
取得小程式UnionId應該以wx.getUserInfo的UnionId為主。 wx.getUserInfo需要使用者授權,產品方面,需要考慮使用者拒絕授權的處理流程。
wx.getUserInfo取得資料之後解密的方法,可以看官方文件。
解決想法:透過帶有登錄態的 wx.getUserInfo 取得到使用者的加密資料encryptedData 和加密演算法的初始向量iv,然後將encryptdata、iv 以及code傳給後端,後端再去透過接收到的encryptedData、iv以、code 以及先前的session_key 解密出使用者的openid、unionid 等。加密資料解密演算法
相關推薦:小程式教學
#以上是如何取得小程式的unionid的詳細內容。更多資訊請關注PHP中文網其他相關文章!