登入官方說明
小程序可以通過微信官方提供的登錄能力方便地獲取微信提供的用戶身份標(biāo)識,快速建立小程序內(nèi)的用戶體系。
之后開發(fā)者服務(wù)器可以根據(jù)用戶標(biāo)識來生成自定義登錄態(tài),用于后續(xù)業(yè)務(wù)邏輯中前后端交互時識別用戶身份。

調(diào)用接口獲取登錄憑證(code)。通過憑證進(jìn)而換取用戶登錄態(tài)信息,包括用戶的唯一標(biāo)識(openid)及本次登錄的會話密鑰(session_key)等。用戶數(shù)據(jù)的加解密通訊需要依賴會話密鑰完成。更多使用方法詳見 小程序登錄 。
| 屬性 | 類型 | 默認(rèn)值 | 必填 | 說明 | 最低版本 |
|---|---|---|---|---|---|
| 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í)行) |
| 屬性 | 類型 | 說明 |
|---|---|---|
| code | string | 用戶登錄憑證(有效期五分鐘)。開發(fā)者需要在開發(fā)者服務(wù)器后臺調(diào)用 code2Session ,使用 code 換取 openid 和 session_key 等信息 |
wx.login({
success(res) {
if (res.code) {
// 發(fā)起網(wǎng)絡(luò)請求
wx.request({
url: 'https://test.com/onLogin',
data: {
code: res.code
},
success: function (res) {
wx.setStorageSync('login_key', res.data.data.login_key);
}
})
} else {
console.log('登錄失??!' + res.errMsg)
}
}
})
本接口應(yīng)在服務(wù)器端調(diào)用,詳細(xì)說明參見 服務(wù)端API 。
登錄憑證校驗。通過 wx.login() 接口獲得臨時登錄憑證 code 后傳到開發(fā)者服務(wù)器調(diào)用此接口完成登錄流程。更多使用方法詳見 小程序登錄 。
GET https://api.weixin.qq.com/sns/jscode2sessionappid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
| 屬性 | 類型 | 默認(rèn)值 | 必填 | 說明 |
|---|---|---|---|---|
| appid | string | 是 | 小程序 appId | |
| secret | string | 是 | 小程序 appSecret | |
| js_code | string | 是 | 登錄時獲取的 code | |
| grant_type | string | 是 | 授權(quán)類型,此處只需填寫 authorization_code |
返回的 JSON 數(shù)據(jù)包
| 屬性 | 類型 | 說明 |
|---|---|---|
| openid | string | 用戶唯一標(biāo)識 |
| session_key | string | 會話密鑰 |
| unionid | string | 用戶在開放平臺的唯一標(biāo)識符,在滿足 UnionID 下發(fā)條件的情況下會返回,詳見 UnionID 機(jī)制說明 。 |
| errcode | number | 錯誤碼 |
| errmsg | string | 錯誤信息 |
| 值 | 說明 |
|---|---|
| -1 | 系統(tǒng)繁忙,此時請開發(fā)者稍候再試 |
| 0 | 請求成功 |
| 40029 | code 無效 |
| 45011 | 頻率限制,每個用戶每分鐘100次 |

判斷session_key有沒有過期
檢查登錄態(tài)是否過期。
通過 wx.login 接口獲得的用戶登錄態(tài)擁有一定的時效性。用戶越久未使用小程序,用戶登錄態(tài)越有可能失效。反之如果用戶一直在使用小程序,則用戶登錄態(tài)一直保持有效。具體時效邏輯由微信維護(hù),對開發(fā)者透明。開發(fā)者只需要調(diào)用 wx.checkSession 接口檢測當(dāng)前用戶登錄態(tài)是否有效。
登錄態(tài)過期后開發(fā)者可以再調(diào)用 wx.login 獲取新的用戶登錄態(tài)。調(diào)用成功說明當(dāng)前 session_key 未過期,調(diào)用失敗說明 session_key 已過期。更多使用方法詳見 小程序登錄 。
| 屬性 | 類型 | 默認(rèn)值 | 必填 | 說明 |
|---|---|---|---|---|
| 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í)行) |
wx.checkSession({
success() {
// session_key 未過期,并且在本生命周期一直有效
},
fail() {
// session_key 已經(jīng)失效,需要重新執(zhí)行登錄流程
wx.login() // 重新登錄
}
})
**微信官方:你好,你可以調(diào)用wx.getSetting來判斷,用戶是否授權(quán),如果沒有授權(quán),你要讓他點(diǎn)擊按鈕,調(diào)起授權(quán)頁面。用戶點(diǎn)擊同意授權(quán)以后*,你就可以調(diào)用wx.getUserInfo接口獲取數(shù)據(jù)了**

基礎(chǔ)庫 1.2.0 開始支持,低版本需做 兼容處理 。
獲取用戶的當(dāng)前設(shè)置。 返回值中只會出現(xiàn)小程序已經(jīng)向用戶請求過的權(quán)限 。
| 屬性 | 類型 | 默認(rèn)值 | 必填 | 說明 |
|---|---|---|---|---|
| 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í)行) |
| 屬性 | 類型 | 說明 |
|---|---|---|
| authSetting | AuthSetting | 用戶授權(quán)結(jié)果 |
wx.getSetting({
success(res) {
console.log(res.authSetting)
//部分結(jié)果,如果為true,則表示該用戶對這項權(quán)限以及授權(quán),如果沒有授權(quán),我們這需要通過button按鈕讓用戶授權(quán)
// res.authSetting = {
// "scope.userInfo": true,
// "scope.userLocation": true
// }
}
})
獲取用戶信息
調(diào)用前需要 用戶授權(quán) scope.userInfo。
獲取用戶信息。
| 屬性 | 類型 | 默認(rèn)值 | 必填 | 說明 |
|---|---|---|---|---|
| withCredentials | boolean | 否 | 是否帶上登錄態(tài)信息。當(dāng) withCredentials 為 true 時,要求此前有調(diào)用過 wx.login 且登錄態(tài)尚未過期,此時返回的數(shù)據(jù)會包含 encryptedData, iv 等敏感信息;當(dāng) withCredentials 為 false 時,不要求有登錄態(tài),返回的數(shù)據(jù)不包含 encryptedData, iv 等敏感信息。 | |
| lang | string | en | 否 | 顯示用戶信息的語言 |
| 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í)行) |
| 值 | 說明 |
|---|---|
| en | 英文 |
| zh_CN | 簡體中文 |
| zh_TW | 繁體中文 |
| 屬性 | 類型 | 說明 |
|---|---|---|
| userInfo | UserInfo | 用戶信息對象,不包含 openid 等敏感信息 |
| rawData | string | 不包括敏感信息的原始數(shù)據(jù)字符串,用于計算簽名 |
| signature | string | 使用 sha1( rawData + sessionkey ) 得到字符串,用于校驗用戶信息,詳見 用戶數(shù)據(jù)的簽名驗證和加解密 |
| encryptedData | string | 包括敏感數(shù)據(jù)在內(nèi)的完整用戶信息的加密數(shù)據(jù),詳見 用戶數(shù)據(jù)的簽名驗證和加解密 |
| iv | string | 加密算法的初始向量,詳見 用戶數(shù)據(jù)的簽名驗證和加解密 |
在用戶未授權(quán)過的情況下調(diào)用此接口,將不再出現(xiàn)授權(quán)彈窗,會直接進(jìn)入 fail 回調(diào)(詳見 《公告》 )。在用戶已授權(quán)的情況下調(diào)用此接口,可成功獲取用戶信息。
// 必須是在用戶已經(jīng)授權(quán)的情況下調(diào)用
wx.getUserInfo({
success(res) {
const userInfo = res.userInfo
const nickName = userInfo.nickName
const avatarUrl = userInfo.avatarUrl
const gender = userInfo.gender // 性別 0:未知、1:男、2:女
const province = userInfo.province
const city = userInfo.city
const country = userInfo.country
}
})
encryptedData 解密后為以下 json 結(jié)構(gòu),詳見 加密數(shù)據(jù)解密算法
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark": {
"appid": "APPID",
"timestamp": TIMESTAMP
}
}
<!-- 如果只是展示用戶頭像昵稱,可以使用 <open-data /> 組件 -->
<open-data type="userAvatarUrl"></open-data>
<open-data type="userNickName"></open-data>
<!-- 需要使用 button 來授權(quán)登錄 -->
<button
wx:if="{{canIUse}}"
open-type="getUserInfo"
bindgetuserinfo="bindGetUserInfo"
>
授權(quán)登錄
</button>
<view wx:else>請升級微信版本</view>
Page({
data: {
canIUse: wx.canIUse('button.open-type.getUserInfo')
},
onLoad() {
// 查看是否授權(quán)
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
// 已經(jīng)授權(quán),可以直接調(diào)用 getUserInfo 獲取頭像昵稱
wx.getUserInfo({
success(res) {
console.log(res.userInfo)
wx.request({
url: url,
data: {
'iv': res.iv,
'encryptedData': res.encryptedData,
'login_key':登入標(biāo)識
},
method: "POST",
header: {
'content-type': 'application/json' // 默認(rèn)值
},
success: function (res) {
//解密后數(shù)據(jù)
console.log(res);
}
});
}
})
}
}
})
},
bindGetUserInfo(e) {
console.log(e.detail.userInfo)
}
})

小程序可以通過各種前端接口獲取微信提供的開放數(shù)據(jù)??紤]到開發(fā)者服務(wù)器也需要獲取這些開放數(shù)據(jù),微信會對這些數(shù)據(jù)做簽名和加密處理。開發(fā)者后臺拿到開放數(shù)據(jù)后可以對數(shù)據(jù)進(jìn)行校驗簽名和解密,來保證數(shù)據(jù)不被篡改。

簽名校驗以及數(shù)據(jù)加解密涉及用戶的會話密鑰 session_key。 開發(fā)者應(yīng)該事先通過 wx.login 登錄流程獲取會話密鑰 session_key 并保存在服務(wù)器。為了數(shù)據(jù)不被篡改,開發(fā)者不應(yīng)該把 session_key 傳到小程序客戶端等服務(wù)器外的環(huán)境。
為了確保開放接口返回用戶數(shù)據(jù)的安全性,微信會對明文數(shù)據(jù)進(jìn)行簽名。開發(fā)者可以根據(jù)業(yè)務(wù)需要對數(shù)據(jù)包進(jìn)行簽名校驗,確保數(shù)據(jù)的完整性。
接口返回的rawData:
{
"nickName": "Band",
"gender": 1,
"language": "zh_CN",
"city": "Guangzhou",
"province": "Guangdong",
"country": "CN",
"avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}
用戶的 session-key:
HyVFkGl5F5OQWJZZaNzBBg==
用于簽名的字符串為:
{"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==
使用sha1得到的結(jié)果為
75e81ceda165f4ffa64f4068af58c64b8f54b88c
接口如果涉及敏感數(shù)據(jù)(如 wx.getUserInfo 當(dāng)中的 openId 和 unionId),接口的明文內(nèi)容將不包含這些敏感數(shù)據(jù)。開發(fā)者如需要獲取敏感數(shù)據(jù),需要對接口返回的 加密數(shù)據(jù)(encryptedData) 進(jìn)行對稱解密。 解密算法如下:
微信官方提供了多種編程語言的示例代碼( 點(diǎn)擊下載 )。每種語言類型的接口名字均一致。調(diào)用方式可以參照示例。
另外,為了應(yīng)用能校驗數(shù)據(jù)的有效性,會在敏感數(shù)據(jù)加上數(shù)據(jù)水印( watermark )
| 參數(shù) | 類型 | 說明 |
|---|---|---|
| appid | String | 敏感數(shù)據(jù)歸屬 appId,開發(fā)者可校驗此參數(shù)與自身 appId 是否一致 |
| timestamp | Int | 敏感數(shù)據(jù)獲取的時間戳, 開發(fā)者可以用于數(shù)據(jù)時效性校驗 |
如接口 wx.getUserInfo 敏感數(shù)據(jù)當(dāng)中的 watermark:
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark": {
"appid": "APPID",
"timestamp": TIMESTAMP
}
}
注:
開發(fā)者如果遇到因為 session_key 不正確而校驗簽名失敗或解密失敗,請關(guān)注下面幾個與 session_key 有關(guān)的注意事項。