微信小程序无法获取UnionId的情况及处理
問(wèn)題背景:做了微信小程序,一切都還正常,但是最后體驗(yàn)版放出去時(shí),卻發(fā)現(xiàn)很多用戶無(wú)法綁定用戶,后臺(tái)返回:參數(shù)非法。經(jīng)過(guò)多方排查,發(fā)現(xiàn)是微信拿到的code請(qǐng)求返回的數(shù)據(jù)里沒(méi)有UnionId,也就是接口返回的參數(shù)中不包含UnionId參數(shù)。
1、UnionID機(jī)制說(shuō)明 簡(jiǎn)而言之,微信針對(duì)不同的用戶在不同的應(yīng)用下都有唯一的一個(gè) openId,但是要想確定用戶是不是同一個(gè)用戶,就需要靠 unionid 來(lái)區(qū)分。通常自己的后臺(tái)都會(huì)有自己的一個(gè)用戶表,每個(gè)用戶有不同的 userid。也就是說(shuō)同一個(gè)用戶在同一個(gè)微信開(kāi)放平臺(tái)下的相同主體的應(yīng)用對(duì)應(yīng)著相同的 userid, unionid 以及不同的 openid。所以在用戶登錄進(jìn)來(lái)的時(shí)候,我們只能靠微信返回給我們的 unionid 去判斷是不是同一個(gè)用戶,再去關(guān)聯(lián)我們的用戶表,拿到對(duì)應(yīng)的 user_id。注意: 后邊這句話的描述:用戶關(guān)注過(guò)公眾號(hào),或者曾經(jīng)登錄過(guò)App或公眾號(hào),則用戶打開(kāi)小程序時(shí),開(kāi)發(fā)者可以直接通過(guò)wx.login獲取到該用戶UnionID。即:如果用戶沒(méi)有關(guān)注過(guò)公眾號(hào),或者沒(méi)有登陸過(guò)App,通過(guò)wx.login是無(wú)法獲取到該用戶UnionID,只能通過(guò)wx.getUserInfo來(lái)獲取UnionId。經(jīng)驗(yàn)證,系統(tǒng)不存在UnionId的小程序用戶都是沒(méi)有關(guān)注公眾號(hào)或未在App中使用微信授權(quán)的用戶
2、問(wèn)題背景
一般情況下(即在登錄小程序之前,已經(jīng)關(guān)注過(guò)公眾號(hào)或已經(jīng)登錄過(guò)公眾號(hào)或已經(jīng)使用微信登錄的方式登錄過(guò)app),用戶通過(guò)以下兩步就正常成功登錄網(wǎng)站:(1)wx.login獲取code;(2)通過(guò)code請(qǐng)求后臺(tái),后臺(tái)轉(zhuǎn)發(fā)微信api用來(lái)?yè)Q取openid及session_key等信息,此可以得到Unionid
另一種情況(即在登錄小程序之前,既沒(méi)有關(guān)注過(guò)公眾號(hào),也沒(méi)有登錄過(guò)公眾號(hào),更沒(méi)有使用微信登錄的方式登錄過(guò)app),通過(guò) wx.login 的到的 code 換不回 unionid 及 openid 等信息。
3、解決方案:
獲取小程序UnionId應(yīng)該以wx.getUserInfo的UnionId為主。wx.getUserInfo需要用戶授權(quán),產(chǎn)品方面,需要考慮用戶拒絕授權(quán)的處理流程。
wx.getUserInfo獲取數(shù)據(jù)之后解密的方法,可以看官方文檔。
解決思路:通過(guò)帶登錄態(tài)的 wx.getUserInfo 獲取到用戶的加密數(shù)據(jù) encryptedData 和加密算法的初始向量iv,然后將 encryptdata、iv 以及 code傳給后端,后端再去通過(guò)接收到的encryptedData、iv以、code 以及之前的 session_key 解密出用戶的 openid、unionid 等。加密數(shù)據(jù)解密算法
轉(zhuǎn)載于:https://www.cnblogs.com/goloving/p/10532716.html
總結(jié)
以上是生活随笔為你收集整理的微信小程序无法获取UnionId的情况及处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Django 07模型层—单表操作(增删
- 下一篇: js中时间戳与日期时间之间的相互转换