微信小程序登錄授權(quán)筆記

基本功能開發(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ù)到后端

可參考以下文章,整合小程序,公眾號,微信開發(fā)平臺應(yīng)用

設(shè)計(jì)可拓展的賬號系統(tǒng)【二】:支持微信、QQ、 微博第三方登錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容