在上一篇中,小豬介紹了微信小程序中獲取用戶的唯一標(biāo)識(shí)的兩種方式。
值得注意的是,小程序框架里沒(méi)有直接將openid和unionid以明文的方式給到前端。而是需要我們的服務(wù)器去通過(guò)微信的API來(lái)得到。
所以,要想小程序能夠基于我們本身的業(yè)務(wù)邏輯正常運(yùn)行,服務(wù)器正確處理用戶數(shù)據(jù)是最基礎(chǔ)的工作,所以今天小豬再花一篇來(lái)介紹上篇文章中說(shuō)到的第二種方式來(lái)獲取用戶標(biāo)識(shí)。
這種方式不僅相對(duì)安全,更關(guān)鍵的是,如果我們的程序本身不止依賴小程序這一個(gè)平臺(tái),還有本身的安卓APP,蘋(píng)果APP,或者微信公眾號(hào),想要這些平臺(tái)之間的用戶統(tǒng)一,那么我們的小程序的用戶標(biāo)識(shí)就不能使用openid而必須使用unionid了。官方介紹是openid是對(duì)公眾號(hào)與用戶唯一對(duì)應(yīng)的。也就是說(shuō)同一個(gè)用戶,在不同的公眾號(hào)、小程序之間的openid是不同的。而如果多個(gè)公眾號(hào)或者小程序都關(guān)聯(lián)到微信開(kāi)發(fā)者平臺(tái)的話,那么相同的微信用戶對(duì)應(yīng)這些公眾號(hào)、小程序、APP的unionID是相同的。只有使用unionID作為用戶標(biāo)識(shí),在使用微信登錄我們的本身程序時(shí)才可能將相同的微信用戶識(shí)別成同一用戶,達(dá)到業(yè)務(wù)邏輯跨平臺(tái)的效果。
在上一篇中,我們使用python的flask框架完成了一個(gè)接口,該接口接收小程序POST過(guò)來(lái)的code,利用該code,通過(guò)API向微信請(qǐng)求數(shù)據(jù),微信服務(wù)器向我們返回了類(lèi)似下列格式的數(shù)據(jù):
{
"session_key":"oRCrTPgGwAf7jwdqV0g+Ig==",
"expires_in":7200,
"openid":"oWv370DkivlAs-LPrxKKvQ9KP98w"
}
|
如果我們只想使用openid的話,那到這里已經(jīng)能夠正確得到數(shù)據(jù)了。這一篇我們用到上述數(shù)據(jù)的session_key的值。
根據(jù)微信小程序文檔的說(shuō)明:
通過(guò)上述接口獲得的用戶登錄態(tài)擁有一定的時(shí)效性。用戶越久未使用小程序,用戶登錄態(tài)越有可能失效。反之如果用戶一直在使用小程序,則用戶登錄態(tài)一直保持有效。具體時(shí)效邏輯由微信維護(hù),對(duì)開(kāi)發(fā)者透明。開(kāi)發(fā)者只需要調(diào)用wx.checkSession接口檢測(cè)當(dāng)前用戶登錄態(tài)是否有效。登錄態(tài)過(guò)期后開(kāi)發(fā)者可以再調(diào)用wx.login獲取新的用戶登錄態(tài)。
小豬做了下測(cè)試,在昨天使用的代碼上再次請(qǐng)求,請(qǐng)求到的session_key沒(méi)有變化,也就是說(shuō)這個(gè)session_key的有效時(shí)間是挺長(zhǎng)的,具體長(zhǎng)到什么時(shí)間,官方并沒(méi)有給出一個(gè)明確的值,只是做了說(shuō)明,這個(gè)值由微信服務(wù)器自己維護(hù)。不過(guò)我們?yōu)榱舜_保程序的邏輯正常,需要在使用session_key之前先檢查該session_key還是否繼續(xù)可用。
NOTE: 小豬寫(xiě)這里的代碼時(shí)遇到過(guò)一個(gè)問(wèn)題,就是本來(lái)想通過(guò)flask框架的session來(lái)保存session_key,但這里的問(wèn)題是雖然是同一個(gè)開(kāi)發(fā)工具的ajax請(qǐng)求,請(qǐng)求中卻不會(huì)自動(dòng)帶上cookies,所以這里我們不能使用session來(lái)保存session_key。
簡(jiǎn)單的示例程序
wx.checkSession({
success: function(){
//session 未過(guò)期,并且在本生命周期一直有效
},
fail: function(){
//登錄態(tài)過(guò)期
wx.login() //重新登錄
....
}
})
|
另外可參考官方文檔對(duì)這一段的說(shuō)明:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxchecksessionobject
官方文檔
在拿到session_key之后,我們還要繼續(xù)使用這個(gè)值。來(lái)獲取用戶加密的數(shù)據(jù)。 正如上一篇文章中代碼所示:
wx.getUserInfo({
success: function (res) {
that.globalData.userInfo = res.userInfo
console.log(res)
typeof cb == "function" && cb(that.globalData.userInfo)
}
|
上述代碼的res參數(shù),里面的encryptedData和iv字段是我們需要用到的。當(dāng)然,res里面的userInfo字段里面已經(jīng)有一些基礎(chǔ)信息的數(shù)據(jù)了。 根據(jù)小程序官方文檔解析數(shù)據(jù),我們可以得到下列數(shù)據(jù):