【微信官方】獲取使用者資訊方案介紹
背景
✦✦01✦✦
小程式一個比較重要的能力就是獲取使用者資訊,也就是使用 wx.getUserInfo
介面。我們發現幾乎所有的小程式都會呼叫這個介面。雖然我們在設計文件上有提出最好的設計是在真正要使用者資訊的情況下才去獲取使用者資訊,不過很多開發者並沒有按照我們的期望去做,導致使用者在使用的時候有很多困擾。
歸結起來有幾點:
- 開發者在首頁直接呼叫
wx.getUserInfo
進行授權,彈框有會使得一部分使用者放棄小程式的使用。 - 開發者沒有處理使用者拒絕彈框的情況,有部分小程式強制要求使用者授權頭像暱稱等資訊才能繼續使用小程式。
- 使用者沒有很好的方式重新授權,雖然在前幾個版本我們增加了
設定
- 開發者希望進到首頁就獲取到使用者的
unionId
,以便和之前已經關注了公眾號的使用者畫像關聯起來。 - 開發者預設將
wx.login
和wx.getUserInfo
繫結使用,這個是由於我們一開始的設計缺陷和例項程式碼導致:getUserInfo
必須通過wx.login
在後臺生成session_key
後才能呼叫。
為了解決以上幾點,我們更新了三個能力:
- 使用元件來獲取使用者資訊,使用者拒絕授權後也可以重新彈窗再次授權
- 若使用者滿足一定條件(下文有詳細介紹),則可以用
wx.login
獲取到的code直接換到unionId
-
wx.getUserInfo
wx.login
就能呼叫得到資料。 獲取使用者資訊元件介紹
✦✦02✦✦
元件變化:
-
open-type
屬性增加getUserInfo
:使用者點選時候會觸發bindgetuserinfo
事件。 - 新增事件
bindgetuserinfo
:當open-type
為getUserInfo
時,使用者點選會觸發。可以從事件返回引數的detail
欄位中獲取到和wx.getUserInfo
返回引數相同的資料。
示例:
<button open-type="getUserInfo" bindgetuserinfo="userInfoHandler"> Click me </button>
和 wx.getUserInfo
不同之處在於:
- API
wx.getUserInfo
只會彈一次框,使用者拒絕授權之後,再次呼叫將不會彈框 - 元件 由於是使用者主動觸發,不受彈框次數限制,只要使用者沒有授權,都會再次彈框
直接獲取unionId
✦✦03✦✦
考慮很多場景下,業務方申請userinfo授權主要為了獲取unionid。我們鼓勵開發者在不騷擾使用者的情況下合理獲得unionid,而僅在必要時才向用戶彈窗申請使用暱稱頭像。為此,凡使用“獲取使用者資訊元件”獲取使用者暱稱頭像的小程式,在滿足以下全部條件時,將可以靜默獲得unionid。
- 在微信開放平臺下存在同主體的App、公眾號、小程式。
- 使用者關注了某個相同主體公眾號,或曾經在某個相同主體App、公眾號上進行過微信登入授權。
getUserInfo 和 login
✦✦04✦✦
很多開發者會把login和getUserInfo捆綁呼叫當成登入使用,其實login已經可以完成登入,可以建立賬號體系了,getUserInfo只是獲取額外的使用者資訊。
在login獲取到code,然後傳送到開發者後端,開發者後端再通過介面去微信後端換取到openid和sessionKey(並且現在會將unionid也一併返回)之後,然後把3rd_session返回給前端,就已經完成登入行為。而login行為是靜默,不必授權的,不會對使用者造成騷擾。
getUserInfo只是為了提供更優質的服務而存在,比如展示頭像暱稱,判斷性別,通過unionId和其他公眾號上已有的使用者畫像結合起來提供歷史資料。所以不必在剛剛進入小程式的時候就強制要求授權。
推薦使用方法
✦✦05✦✦
- 呼叫
wx.login
獲取code
,然後從微信後端換取到sessionKey
,用於解密getUserInfo
返回的敏感資料。 - 使用
wx.getSetting
獲取使用者的授權情況- 如果使用者已經授權,直接呼叫 API
wx.getUserInfo
獲取使用者最新的資訊 - 使用者未授權,在介面中顯示一個按鈕提示使用者登入,當用戶點選並授權後就獲取到使用者的最新資訊。
- 如果使用者已經授權,直接呼叫 API
- 獲取到使用者資料後可以進行展示或者傳送給自己的後端。
文件中的quickStart已經更新
特別注意
✦✦06✦✦
為了給使用者提供更好的小程式環境,我們約定在一段時間後(具體時間會做通知),若還出現以下情況(包括但不限於),將無法通過稽核
- 初次開啟小程式就彈框授權使用者資訊
- 未處理使用者拒絕授權的情況
- 強制要求使用者授權
已經上線的小程式不會受到影響。