python獲取小程式手機號並繫結
最近在做小程式開發,在其中也遇到了很多的坑,獲取小程式的手機號並繫結就遇到了一個很傻的坑。
流程介紹
官方流程圖
小程式使用方法
需要將 <button> 元件 open-type 的值設定為 getPhoneNumber,當用戶點選並同意之後,可以通過 bindgetphonenumber 事件回撥獲取到微信伺服器返回的加密資料, 然後在第三方服務端結合 session_key 以及 app_id 進行解密獲取手機號。
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"> </button>
返回引數說明
引數 | 型別 | 說明 |
---|---|---|
encryptedData | String | 包括敏感資料在內的完整使用者資訊的加密資料,詳細見 ofollow,noindex" target="_blank">加密資料解密演算法 |
iv | String | 加密演算法的初始向量,詳細見 加密資料解密演算法 |
接受到這些引數以後小程式把code,encryptedData,iv發給後臺,然後後臺解密
後臺解密
在解密以前需要session_key進行配合解密,所以首先通過code獲取session_key
# 獲取openid,session_key # Appid為小程式id openid_url = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code" % ( APP_ID, APP_KEY, code ) req = requests.get(openid_url) rep = req.json() session_key = rep.get("session_key")
在得到session_key,encryptedData,iv以後就可以進行解密了,python2實現程式碼如下:
1 import base64 2 import json 3 from Crypto.Cipher import AES 4 5 class WXBizDataCrypt: 6def __init__(self, appId, sessionKey): 7self.appId = appId 8self.sessionKey = sessionKey 9 10def decrypt(self, encryptedData, iv): 11# base64 decode 12sessionKey = base64.b64decode(self.sessionKey) 13encryptedData = base64.b64decode(encryptedData) 14iv = base64.b64decode(iv) 15 16cipher = AES.new(sessionKey, AES.MODE_CBC, iv) 17 18decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData))) 19 20if decrypted['watermark']['appid'] != self.appId: 21raise Exception('Invalid Buffer') 22 23return decrypted 24 25def _unpad(self, s): 26return s[:-ord(s[len(s)-1:])]
呼叫傳參
# APP_ID為小程式id不是openid!!! pc = wx_jm(APP_ID, session_key) res = pc.decrypt(encryptedData, iv)
引數詳情參照微信官方文件 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html
微信官方提供了多種程式語言的示例程式碼點選下載
返回資料格式
{ "phoneNumber": "13580006666", "purePhoneNumber": "13580006666", "countryCode": "86", "watermark": { "appid":"APPID", "timestamp":TIMESTAMP } }
小程式開發系列教程 https://blog.csdn.net/michael_ouyang/article/details/54700871