天天看點

微信小程式擷取使用者手機号

小程式擷取code。

背景得到session_key,openid。

因為需要使用者主動觸發才能發起擷取手機号接口,是以該功能不由 API 來調用,需用<code>&lt;button&gt;</code> 元件的點選來觸發。

需要将 <code>&lt;button&gt;</code> 元件 open-type 的值設定為 getPhoneNumber,當使用者點選并同意之後,可以通過 bindgetphonenumber 事件回調擷取到微信伺服器傳回的加密資料, 然後在第三方服務端結合 session_key 以及 app_id 進行解密擷取手機号。

tips:

在回調中調用 wx.login 登入,可能會重新整理登入态。此時伺服器使用 code 換取的 sessionKey 不是加密時使用的 sessionKey,導緻解密失敗。建議開發者提前進行 login;或者在回調中先使用 checkSession 進行登入态檢查,避免 login 重新整理登入态。

encryptedData 解密後為以下 JSON 結構

小程式可以通過各種前端接口擷取微信提供的開放資料。考慮到開發者伺服器也需要擷取這些開放資料,微信會對這些資料做簽名和加密處理。開發者背景拿到開放資料後可以對資料進行校驗簽名和解密,來保證資料不被篡改。

簽名校驗以及資料加解密涉及使用者的會話密鑰 session_key。 開發者應該事先通過 wx.login 登入流程擷取會話密鑰 session_key 并儲存在伺服器。為了資料不被篡改,開發者不應該把 session_key 傳到小程式用戶端等伺服器外的環境。

接口傳回的加密資料(encryptedData) 進行對稱解密。 解密算法如下:

對稱解密使用的算法為 AES-128-CBC,資料采用PKCS#7填充。

對稱解密的目标密文為 Base64_Decode(encryptedData)。

對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16位元組。

對稱解密算法初始向量 為Base64_Decode(iv),其中iv由資料接口傳回。

開發者如果遇到因為 session_key 不正确而校驗簽名失敗或解密失敗,請關注下面幾個與 session_key 有關的注意事項。

wx.login 調用時,使用者的 session_key 可能會被更新而緻使舊 session_key 失效(重新整理機制存在最短周期,如果同一個使用者短時間内多次調用 wx.login,并非每次調用都導緻 session_key 重新整理)。開發者應該在明确需要重新登入時才調用 wx.login,及時通過 code2Session 接口更新伺服器存儲的 session_key。

微信不會把 session_key 的有效期告知開發者。我們會根據使用者使用小程式的行為對 session_key 進行續期。使用者越頻繁使用小程式,session_key 有效期越長。

開發者在 session_key 失效時,可以通過重新執行登入流程擷取有效的 session_key。使用接口 wx.checkSession可以校驗 session_key 是否有效,進而避免小程式反複執行登入流程。

當開發者在實作自定義登入态時,可以考慮以 session_key 有效期作為自身登入态有效期,也可以實作自定義的時效性政策。

改造

繼續閱讀