小程序登錄、獲取用戶信息、openid和unionid詳解


 

小程序開發中最常用也是最容易混淆的幾個api接口和概念有

  • wx.login(OBJECT)
  • wx.getUserInfo(OBJECT)
  • openid
  • unionid

什么情況下需要進行小程序的登錄?什么情況下需要獲取用戶信息?什么情況下需要用戶授權?openid和unionid有什么區別?什么情況下使用openid?什么情況下使用unionid?帶着這些疑問,我們來對這些api和概念逐個擊破。

wx.login(OBJECT)詳解

還是官方這張圖:

alt

官方說明:

  1. 小程序調用wx.login(OBJECT) 獲取臨時登錄憑證code ,並回傳到開發者服務器。

  2. 開發者服務器以code換取用戶唯一標識openid 和會話密鑰session_key。

之后開發者服務器可以根據用戶標識來生成自定義登錄態,用於后續業務邏輯中前后端交互時識別用戶身份。

可以看出:

  1. wx.login的目的主要就是向微信服務器獲取openid和會話密鑰session_key
  2. 獲取后將openid和session_key兩個參數作為value,后台再生成一個key(自定義登錄態)對應這個value
  3. 生成后將這個key和value組成的鍵值對存入開發者后台數據庫或者類似redis的緩存里
  4. 將key(自定義登錄態)返回給小程序端
  5. 下次小程序端再發請求給開發者服務器后端的時候必須要帶上這個key,然后后端接收到這個key,去匹配對應的value,識別出訪問用戶

注意:

  • 開發者服務器不應該把會話密鑰下發到小程序,也不應該對外提供這個密鑰
  • 微信服務器返回后端openid+session_key或者openid+session_key+unionid,返不返回unionid取決於是否開發者帳號下存在同主體的公眾號或移動應用,並且該用戶已經授權登錄過該公眾號或移動應用。

結合微信登錄,可以做小程序API接口攻擊防護。之前的博文已經有詳細描述。另外微信支付也有提到登錄,參見小程序微信支付詳解與代碼示例

wx.getUserInfo(OBJECT)詳解

這個接口今年微信官方做了一個比較大的調整,具體可以參考小程序獲取用戶信息接口調整方案

在調用該接口之前,必須進行用戶授權,否則將會報錯。

當調用該接口發送請求時攜帶的 withCredentials 為 true 時,要求此前有調用過 wx.login 且登錄態尚未過期,此時返回的數據會包含 encryptedData, iv 等敏感信息;當 withCredentials 為 false 時,不要求有登錄態,返回的數據不包含 encryptedData, iv 等敏感信息。

為什么withCredentials 為 true時要登錄呢?因為encryptedData, iv 解密的時候需要用到session_key,這個session_key是在wx.login的時候得到的。

那encryptedData解密出來的數據多了啥呢?多出的數據如下:

  • {
  • "openId": "OPENID",
  • "unionId": "UNIONID",
  • "watermark":
  • {
  • "appid":"APPID",
  • "timestamp":TIMESTAMP
  • }
  • }
json

這里還特意加了watermark,其中有個timestamp,是為了校驗數據的時效性。

另外一個比較關鍵的參數就是unionId,這里是區別為wx.login,不管你關沒關注同一微信開發平台下的公眾號,只要你的小程序綁定了微信開發平台,就能夠直接獲取到unionId。

unionId和openid的區別

那這個unionId到底有什么用呢?先來看它的特點:同一微信開放平台下的應用(App、小程序、公眾號)的unionId是一樣的。適用場景就是,如果一個用戶先使用了小程序,然后再關注了公眾號,對於開發者的你來說,當你想給小程序上的這位用戶發送公眾號模板消息的時候你能精確的通過unionId找到他。

那么問題又來了,openid是干嘛用的呢?openid是小程序或公眾號的唯一識別id,就是說不管你的小程序或公眾號綁定的是哪個微信開發平台,用戶他的openid都不會變,但是綁定不同微信開發平台用戶的unionid會不一樣。

用戶什么時候需要授權?

只有當開發者想要獲取用戶信息,如nickName、avatarUrl等,或者unionId這種敏感信息並保存到后端數據庫的時候才需要調用wx.getUserInfo(OBJECT)接口,進而需要進行用戶授權。而當僅僅需要獲取用戶的openid時,則可以通過調用wx.login后由后端服務器再向微信服務器發請求獲得。

那么為什么需要獲取nickName、avatarUrl等用戶信息呢?這個的目的就多了,當小程序端需要展示一堆用戶列表的時候,當需要對用戶進行區域划分的時候,當需要對用戶信息進行數據分析的時候,等等等等。

本文鏈接:https://www.daguanren.cc/post/wxlogin_getuserinfo_openid_unionid.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM