基本功能開發(fā)
官方推薦小程序登錄時序圖
了解這個流程對后續(xù)的開發(fā)很有必要

image
Unionid 機(jī)制
如果開發(fā)者擁有多個移動應(yīng)用、網(wǎng)站應(yīng)用、和公眾帳號(包括小程序),可通過 UnionID 來區(qū)分用戶的唯一性,因?yàn)橹灰峭粋€微信開放平臺帳號下的移動應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(包括小程序),用戶的 UnionID 是唯一的。換句話說,同一用戶,對同一個微信開放平臺下的不同應(yīng)用,unionid是相同的。
基于這個機(jī)制,在設(shè)計(jì)賬號登錄的時候,就可以考慮將 unionid 作為第三方登錄的唯一標(biāo)示,即使當(dāng)前只有一個小程序或者一個公眾號, 也應(yīng)該用unionid 而不是 openid
授權(quán)登錄
獲取 authorization code
api : wx.login
wx.login({
success: res => {
const { code } = res;
// 請求后端服務(wù)器, 后端完成驗(yàn)證后,設(shè)置自定義登錄態(tài),
// 如果希望在設(shè)定自定義登錄態(tài)時同時保存用戶基本信息,
// 可通過 wx.getUserInfo 獲取基本信息后,一起提交到后端
}
})
獲取 用戶基本信息
api: wx.getUserInfo
wx.getUserInfo({
success: res => {
const { encryptedData, iv, userInfo } = res;
// encryptedData, iv 等可用于解密得到目標(biāo)數(shù)據(jù)
}
})
獲取手機(jī)號
api: getPhoneNumber
需要按鈕觸發(fā), 后端需要用 sessionKey 解密加密過的數(shù)據(jù)
- 按鈕觸發(fā)
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">獲取手機(jī)號</button>
- js code
getPhoneNumber (e) {
console.log(e.detail.encryptedData)
console.log(e.detail.iv)
}
關(guān)于 解密數(shù)據(jù)
鏈接含 sessionKey 的解釋
解密數(shù)據(jù)鏈接
開發(fā)中遇到的坑
- 加密數(shù)據(jù) encryptedData 字符串中
+在傳輸?shù)胶蠖撕螅? 被轉(zhuǎn)化成空格, 解密提示Illegal Buffer
解決方式:- 方法1:對數(shù)據(jù)進(jìn)行編碼,保證 + 不轉(zhuǎn)化為空格
- 方法2: 對 encryptedData 的空格,全局替換為+ 后再解密
關(guān)于 getUserInfo 返回的 encryptedData
encryptedData: 解密后其實(shí)可以得到基本信息及 unionid, openid 等信息,接口設(shè)計(jì)的時候,可以不用前端傳 userInfo 等數(shù)據(jù)到后端