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