關(guān)鍵詞
小程序 抬虽、wafer2-client-sdk、vendor刑峡、小程序登錄會話洋闽、Session玄柠、帶登錄態(tài)的請求
摘要
由于項目開發(fā)需要,涉及到 小程序诫舅,本文以學(xué)習(xí)過程為線索羽利,進行記錄。
目錄
一刊懈、Session(會話控制)概述
二这弧、小程序登錄
—— 1、微信臨時登錄接口 wx.login(OBJECT)
—— 2虚汛、會話校驗 wx.checkSession(OBJECT)
三匾浪、wafer2-client-sdk(vendor)
—— 1、整體分析
—— 2卷哩、login
—— 3蛋辈、request
正文
一、Session(會話控制)概述
Session 直接翻譯成中文的意思為會話殉疼,但一般都譯成時域梯浪。在計算機專業(yè)術(shù)語中,Session 是指一個終端用戶與交互系統(tǒng)進行通信的時間間隔瓢娜,通常指從注冊進入系統(tǒng)到注銷退出系統(tǒng)之間所經(jīng)過的時間挂洛。其本來的含義是指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個 session眠砾。
作用:HTTP 協(xié)議本身是無狀態(tài)的虏劲,這與 HTTP 協(xié)議本來的目的是相符的,客戶端只需要簡單的向服務(wù)器請求下載某些文件褒颈,無論是客戶端還是服務(wù)器都沒有必要紀錄彼此過去的行為柒巫,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關(guān)系一樣谷丸。 Session 一般用于保持會話狀態(tài)的基于 Web [服務(wù)器]的方法堡掏。Session 允許通過將對象存儲在 Web 服務(wù)器的內(nèi)存中在整個用戶會話過程中保持任何對象。
關(guān)鍵點:保持會話狀態(tài)刨疼,時效性
更詳細的可閱讀: Session 機制詳解
二泉唁、小程序登錄
1、微信臨時登錄接口 wx.login(OBJECT)
a. 接口定義
OBJECT 參數(shù)說明
參數(shù)名 | 類型 | 必填 | 說明 | 最低版本 |
---|---|---|---|---|
timeout | Number | 否 | 超時時間揩慕,單位 ms | 1.9.90 |
success | Function | 否 | 接口調(diào)用成功的回調(diào)函數(shù) | |
fail | Function | 否 | 接口調(diào)用失敗的回調(diào)函數(shù) | |
complete | Function | 否 | 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功亭畜、失敗都會執(zhí)行) |
success 返回參數(shù)說明
參數(shù)名 | 類型 | 說明 |
---|---|---|
errMsg | String | 調(diào)用結(jié)果 |
code | String | 用戶登錄憑證(有效期五分鐘)。開發(fā)者需要在開發(fā)者服務(wù)器后臺調(diào)用 api迎卤,使用 code換取 openid 和 session_key 等信息 |
b. 登錄過程
- 通過調(diào)用該接口 wx.login(OBJECT)拴鸵,獲取用戶登錄憑證 code(有效期五分鐘);
- 使用 code, 請求項目的小程序服務(wù)器;
- 項目的小程序服務(wù)器會使用 code劲藐,appid, appsecret 訪問微信小程序接口八堡,獲取以下信息:
微信用戶唯一標識 openid,
會話密鑰 session_key - 返回 會話密鑰 session_key 到小程序客戶端聘芜,完成登錄秕重。
- 登錄完成后,將session_key保存至本地厉膀,通過wx.getUserInfo( )獲取用戶信息(昵稱,頭像等)
2二拐、會話校驗 wx.checkSession(OBJECT)
a. 接口定義:校驗用戶當(dāng)前session_key是否有效服鹅。
OBJECT參數(shù)說明:
參數(shù)名 | 類型 | 必填 | 說明 |
---|---|---|---|
success | Function | 否 | 接口調(diào)用成功的回調(diào)函數(shù),session_key未過期 |
fail | Function | 否 | 接口調(diào)用失敗的回調(diào)函數(shù)百新,session_key已過期 |
complete | Function | 否 | 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功企软、失敗都會執(zhí)行) |
b. 會話密鑰(session_keyd)的有效性
開發(fā)時,如果遇到因為session_key不正確而校驗簽名失敗或解密失敗饭望,請關(guān)注下面幾個與session_key有關(guān)的注意事項仗哨。
重新登錄后session_key 失效
- 每次調(diào)用wx.login()時,用戶的session_key會被更新铅辞,使舊的session_key失效厌漂。所以在每次調(diào)用wx.login()前,需通過wx.checkSession(OBJECT)接口校驗是否需要重新登錄斟珊,從而避免小程序反復(fù)執(zhí)行登錄流程苇倡。
超過有效期session_key 失效
微信后臺不會把session_key的有效期告知開發(fā)者。微信后臺會根據(jù)用戶使用小程序的行為對session_key進行續(xù)期囤踩。用戶使用小程序越頻繁旨椒,session_key有效期越長。
當(dāng)開發(fā)者在實現(xiàn)自定義登錄態(tài)時堵漱,可以考慮以session_key有效期作為自身登錄態(tài)有效期综慎,也可以實現(xiàn)自定義的時效性策略。
三勤庐、wafer2-client-sdk(vendor)
1示惊、sdk文件分析
2、login.js解析
請對照源碼閱讀
* 進行服務(wù)器登錄埃元,以獲得登錄會話
*
* ->Session.get() 獲取用戶信息 session.userInfo
* ---> 無用戶信息 ----------------------------》doLogin()
* ---> 有用戶信息 wx.checkSession()
* ------->success 未過期--------------------------------------------------------》options.success(userInfo)(session.userInfo)
* ------->fail 已過期 doLogin()
* ---------->getWxLoginResult()
* --------------->wx.login() 登錄
* --------------------> fail --------------------------------------------------》options.fail(LoginError)
* --------------------> success
* ------------------------> 得到用戶登錄憑證 code
* ------------------------> wx.getUserInfo() 獲取用戶信息
* ----------------------------> fail-------------------------------------------》options.fail(LoginError)
* ----------------------------> success wx.getUserInfo()
* -------------------------------->fail----------------------------------------》options.fail(LoginError)
* -------------------------------->success userResult{頭像iv涝涤,用戶信息userInfo,加密數(shù)據(jù)encryptedData}
* ----------------------------------->wx.request() //請求服務(wù)器登錄地址岛杀,獲得會話信息session
* -------------------------------------->url: options.loginUrl
* -------------------------------------->method: options.method
* -------------------------------------->data: options.data
* -------------------------------------->header: {code, encryptedData, data}
* -------------------------------------->fail-----------------------------------》options.fail(LoginError)
* -------------------------------------->success res
* ------------------------------------------>Session.set(res.skey) 保存session
* ------------------------------------------->options.success(userInfo)
3阔拳、request.js
待續(xù)