小程式擷取code。
背景得到session_key,openid。
因為需要使用者主動觸發才能發起擷取手機号接口,是以該功能不由 API 來調用,需用<code><button></code> 元件的點選來觸發。
需要将 <code><button></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 有效期作為自身登入态有效期,也可以實作自定義的時效性政策。
改造