關於小程序登錄時獲取openId和unionId走過的坑


目前的項目是在做小程序這方面的,接觸過的人應該都知道,同一個微信開放平台下的相同主體的App、公眾號、小程序的unionid是相同的,這樣就可以鎖定是不是同一個用戶。微信針對不同的用戶在不同的應用下都有唯一的一個openId, 但是要想確定用戶是不是同一個用戶,就需要靠unionid來區分。一般自己的后台都會有自己的一個用戶表,每個用戶有不同的userid。也就是說同一個用戶在同一個微信開放平台下的相同主體的應用對應着相同的userid,unionid以及不同的openid。所以在用戶登錄進來的時候,我們只能靠微信返回給我們的unionid去判斷是不是同一個用戶,在去關聯我們的用戶表,拿到對應的userid。

接下來就是在獲取unionid時的一些小問題分享一下:

首先,前端調用wx.login的時候會返回一個code,這個code傳到后台的時候,就需要去調用微信的接口(https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code)傳入 code,appid,secret去換取到openid,session_key以及unionid等信息。這里就需要注意了。官方文檔上說的是

如果用戶已經關注公眾號,或者曾經登錄過App或公眾號,則用戶打開小程序時,開發者可以直接通過wx.login獲取到該用戶UnionID,無須用戶再次授權。

就是因為沒有注意到這句話,所以后來改了好多東西,這里分為兩種情況,

(1)用code換取的時候,返回了unionid,這樣就皆大歡喜了,你可以根據unionid以及openid去判斷該用戶有沒有用戶信息,從而獲取userid或者生產userid返回給前端

(2)悲劇的情況,unionid返回為null,這時候你沒法兒關聯出用戶的userid。后來再去看官方文檔的時候,發現有針對這種情況的方法。就是需要前端再去調wx.getUserInfo()這個接口。這時候微信會返回很多數據(詳情見微信官方文檔:https://mp.weixin.qq.com/debug/wxadoc/dev/api/open.html),這些數據里面有一個encryptedData,這個數據中就包含你需要的unionid以及其他的很多用戶信息啦。獲取到以后將encryptedData、加密算法的初始向量iv返回給后端,后端根據這兩個數據以及之前的session_key就可以解密出你需要的數據了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM