目前的項目是在做小程序這方面的,接觸過的人應(yīng)該都知道,同一個微信開放平臺下的相同主體的App、公眾號、小程序的unionid是相同的,這樣就可以鎖定是不是同一個用戶。微信針對不同的用戶在不同的應(yīng)用下都有唯一的一個openId, 但是要想確定用戶是不是同一個用戶,就需要靠unionid來區(qū)分。一般自己的后臺都會有自己的一個用戶表,每個用戶有不同的userid。也就是說同一個用戶在同一個微信開放平臺下的相同主體的應(yīng)用對應(yīng)著相同的userid,unionid以及不同的openid。所以在用戶登錄進(jìn)來的時候,我們只能靠微信返回給我們的unionid去判斷是不是同一個用戶,在去關(guān)聯(lián)我們的用戶表,拿到對應(yīng)的userid。 接下來就是在獲取unionid時的一些小問題分享一下: 首先,前端調(diào)用wx.login的時候會返回一個code,這個code傳到后臺的時候,就需要去調(diào)用微信的接口(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等信息。這里就需要注意了。官方文檔上說的是 如果用戶已經(jīng)關(guān)注公眾號,或者曾經(jīng)登錄過App或公眾號,則用戶打開小程序時,開發(fā)者可以直接通過wx.login獲取到該用戶UnionID,無須用戶再次授權(quán)。 就是因為沒有注意到這句話,所以后來改了好多東西,這里分為兩種情況, (1)用code換取的時候,返回了unionid,這樣就皆大歡喜了,你可以根據(jù)unionid以及openid去判斷該用戶有沒有用戶信息,從而獲取userid或者生產(chǎn)userid返回給前端 (2)悲劇的情況,unionid返回為null,這時候你沒法兒關(guān)聯(lián)出用戶的userid。后來再去看官方文檔的時候,發(fā)現(xiàn)有針對這種情況的方法。就是需要前端再去調(diào)wx.getUserInfo()這個接口。這時候微信會返回很多數(shù)據(jù)(詳情見微信官方文檔:https://mp.weixin.qq.com/debug/wxadoc/dev/api/open.html),這些數(shù)據(jù)里面有一個encryptedData,這個數(shù)據(jù)中就包含你需要的unionid以及其他的很多用戶信息啦。獲取到以后將encryptedData、加密算法的初始向量iv返回給后端,后端根據(jù)這兩個數(shù)據(jù)以及之前的session_key就可以解密出你需要的數(shù)據(jù)了。 https://developers.weixin.qq.com/miniprogram/dev/api/api-login.html#wxloginobject
|
|