微信小程序API登錄憑證(code),獲得的用戶(hù)登錄態(tài)擁有一定的時(shí)效性
wx.login(OBJECT)
調(diào)用接口獲取登錄憑證(code)進(jìn)而換取用戶(hù)登錄態(tài)信息,包括用戶(hù)的唯一標(biāo)識(shí)(openid) 及本次登錄的 會(huì)話密鑰(session_key)。用戶(hù)數(shù)據(jù)的加解密通訊需要依賴(lài)會(huì)話密鑰完成。
OBJECT參數(shù)說(shuō)明:
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
success | Function | 否 | 接口調(diào)用成功的回調(diào)函數(shù) |
fail | Function | 否 | 接口調(diào)用失敗的回調(diào)函數(shù) |
complete | Function | 否 | 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
success返回參數(shù)說(shuō)明:
參數(shù)名 | 類(lèi)型 | 說(shuō)明 |
---|---|---|
errMsg | String | 調(diào)用結(jié)果 |
code | String |
用戶(hù)允許登錄后,回調(diào)內(nèi)容會(huì)帶上 code(有效期五分鐘),開(kāi)發(fā)者需要將 code 發(fā)送到開(kāi)發(fā)者服務(wù)器后臺(tái),使用code 換取 session_key api,將 code 換成 openid 和 session_key |
示例代碼:
//app.js
App({
onLaunch: function() {
wx.login({
success: function(res) {
if (res.code) {
//發(fā)起網(wǎng)絡(luò)請(qǐng)求
wx.request({
url: 'https://test.com/onLogin',
data: {
code: res.code
}
})
} else {
console.log('獲取用戶(hù)登錄態(tài)失?。?#39; + res.errMsg)
}
}
});
}
})
code 換取 session_key
?這是一個(gè) HTTPS 接口,開(kāi)發(fā)者服務(wù)器使用登錄憑證 code 獲取 session_key 和 openid。其中 session_key 是對(duì)用戶(hù)數(shù)據(jù)進(jìn)行加密簽名的密鑰。為了自身應(yīng)用安全,session_key 不應(yīng)該在網(wǎng)絡(luò)上傳輸。
接口地址:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
請(qǐng)求參數(shù):
參數(shù) | 必填 | 說(shuō)明 |
---|---|---|
appid | 是 | 小程序唯一標(biāo)識(shí) |
secret | 是 | 小程序的 app secret |
js_code | 是 | 登錄時(shí)獲取的 code |
grant_type | 是 | 填寫(xiě)為 authorization_code |
返回參數(shù):
參數(shù) | 說(shuō)明 |
---|---|
openid | 用戶(hù)唯一標(biāo)識(shí) |
session_key | 會(huì)話密鑰 |
unionid | 用戶(hù)在開(kāi)放平臺(tái)的唯一標(biāo)識(shí)符。本字段在滿足一定條件的情況下才返回。具體參看UnionID機(jī)制說(shuō)明 |
返回說(shuō)明:
//正常返回的JSON數(shù)據(jù)包
{
"openid": "OPENID",
"session_key": "SESSIONKEY"
"unionid": "UNIONID"
}
//錯(cuò)誤時(shí)返回JSON數(shù)據(jù)包(示例為Code無(wú)效)
{
"errcode": 40029,
"errmsg": "invalid code"
}
wx.checkSession(OBJECT)
通過(guò)上述接口獲得的用戶(hù)登錄態(tài)擁有一定的時(shí)效性。用戶(hù)越久未使用小程序,用戶(hù)登錄態(tài)越有可能失效。反之如果用戶(hù)一直在使用小程序,則用戶(hù)登錄態(tài)一直保持有效。具體時(shí)效邏輯由微信維護(hù),對(duì)開(kāi)發(fā)者透明。開(kāi)發(fā)者只需要調(diào)用wx.checkSession接口檢測(cè)當(dāng)前用戶(hù)登錄態(tài)是否有效。登錄態(tài)過(guò)期后開(kāi)發(fā)者可以再調(diào)用wx.login獲取新的用戶(hù)登錄態(tài)。
OBJECT參數(shù)說(shuō)明:
參數(shù)名 | 類(lèi)型 | 必填 | 說(shuō)明 |
---|---|---|---|
success | Function | 否 | 接口調(diào)用成功的回調(diào)函數(shù),登陸態(tài)未過(guò)期 |
fail | Function | 否 | 接口調(diào)用失敗的回調(diào)函數(shù),登陸態(tài)已過(guò)期 |
complete | Function | 否 | 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會(huì)執(zhí)行) |
示例代碼:
wx.checkSession({
success: function(){
//session 未過(guò)期,并且在本生命周期一直有效
},
fail: function(){
//登錄態(tài)過(guò)期
wx.login() //重新登錄
....
}
})
登錄態(tài)維護(hù)
通過(guò)wx.login()
獲取到用戶(hù)登錄態(tài)之后,需要維護(hù)登錄態(tài)。開(kāi)發(fā)者要注意不應(yīng)該直接把 session_key、openid 等字段作為用戶(hù)的標(biāo)識(shí)或者 session 的標(biāo)識(shí),而應(yīng)該自己派發(fā)一個(gè) session 登錄態(tài)(請(qǐng)參考登錄時(shí)序圖)。對(duì)于開(kāi)發(fā)者自己生成的 session,應(yīng)該保證其安全性且不應(yīng)該設(shè)置較長(zhǎng)的過(guò)期時(shí)間。session 派發(fā)到小程序客戶(hù)端之后,可將其存儲(chǔ)在 storage ,用于后續(xù)通信使用。
通過(guò)wx.checkSession()
檢測(cè)用戶(hù)登錄態(tài)是否失效。并決定是否調(diào)用wx.login() 重新獲取登錄態(tài)
登錄時(shí)序圖
Bug & Tip
-
bug
:iOS/Android
6.3.30
,在 App.onLaunch 調(diào)用 wx.login 會(huì)出現(xiàn)異常;
第二部分:如何開(kāi)通一個(gè)小商店