登錄和授權
登錄和授權的說明
- 在微信小程序中,登錄和授權是完全兩個獨立的事情。登錄只是通過 wx.login 獲取用戶在此時使用小程序產生的 code ,需要通過 Server 將 code 通過 auth.code2Session 獲取用戶唯一標識。
- 授權是通過 wx.getUserInfo 來獲取用戶的微信信息,同時可以通過返回的 vi 等加密數據傳給 Server 端,用於解密后存儲或校驗業務用戶的微信信息。
- 登錄和授權完全沒有關系
-
說明
- 調用 wx.login() 獲取 臨時登錄憑證code ,並回傳到開發者服務器。
- 調用 auth.code2Session 接口,換取 用戶唯一標識 OpenID 和 會話密鑰 session_key。
- 之后開發者服務器可以根據用戶標識來生成自定義登錄態,用於后續業務邏輯中前后端交互時識別用戶身份。
-
注意
- 會話密鑰 session_key 是對用戶數據進行 加密簽名 的密鑰。為了應用自身的數據安全,開發者服務器不應該把會話密鑰下發到小程序,也不應該對外提供這個密鑰。
- 臨時登錄憑證 code 只能使用一次
用戶信息授權
- 微信小程序用戶信息授權
- 調用
wx.getUserInfo
- 需要對
button
設置open-type="getUserInfo"
的屬性 - 將用於加密的數據傳遞給服務端,如
rawData
signature
encryptedData
iv
等
- 調用
- 服務端解密用戶授權數據
- 將小程序業務端通過
wx.getUserInfo
獲取到 加密數據進行解密 - 結合已有的業務用戶,創建新的用戶或對已有用戶補全微信賬戶相關的信息
- 將小程序業務端通過
手機號授權
- 獲取方式
- 獲取微信用戶綁定的手機號,需先調用
wx.login
接口。 - 因為需要用戶主動觸發才能發起獲取手機號接口,所以該功能不由 API 來調用,需用
button
組件的點擊來觸發。 - 需要將
button
組件open-type
的值設置為getPhoneNumber
,當用戶點擊並同意之后,可以通過bindgetphonenumber
事件回調獲取到微信服務器返回的加密數據, 然后在第三方服務端結合session_key
以及app_id
進行解密獲取手機號。
- 獲取微信用戶綁定的手機號,需先調用
- 注意事項
- 目前該接口針對非個人開發者,且完成了認證的小程序開放(不包含海外主體)。需謹慎使用,若用戶舉報較多或被發現在不必要場景下使用,微信有權永久回收該小程序的該接口權限。
- 在回調中調用
wx.login
登錄,可能會刷新登錄態。此時服務器使用code
換取的sessionKey
不是加密時使用的sessionKey
,導致解密失敗。建議開發者提前進行login
;或者在回調中先使用checkSession
進行登錄態檢查,避免login
刷新登錄態。
應用建議
- 注意登錄與授權沒有必然聯系
- 登錄后的
OpenID
是需要通過服務器調用微信接口獲取 - 業務可以根據授權用戶信息 + 授權手機號的結合,來創建新的業務用戶
靜默授權:我們常說的靜默授權其實就是通過調用小程序提供的 wx.login
換取 code
后,獲取用戶 OpenID
以及其他業務關聯的信息,因此我們常說的靜默授權其實就是不主動調用用戶信息授權。