下面是“Python获取微信小程序手机号并绑定遇到的坑”的完整攻略。
1. 准备工作
在进行微信小程序手机号获取之前,需要先获取用户的授权。授权方式分为两种:一种是通过用户点击事件展示授权窗口;另一种是在页面加载时就调用授权接口。由于第一种较为常见,本攻略也采用第一种方式进行讲解。
授权窗口的代码如下:
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>
获取用户信息的方法如下:
//点击获取手机号时,显示微信授权窗口
getPhoneNumber: function (e) {
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
}
2. 解密微信提供的手机号加密数据
根据微信文档描述,encryptedData 是「包括敏感数据在内的完整用户信息的加密数据」,而 iv 是加密算法的初始向量。前往微信公众平台获取小程序的 AES Key 和 AppID。
首先我们需要将加密数据和其指定的密文算法(AES/CBC/PKCS7Padding)进行解密。代码示例:
def decrypt_wechat_user_phone_info(session_key, iv, encrypted_data):
try:
#解密手机号加密信息
aes_key_bytes = base64.b64decode(session_key)
iv_bytes = base64.b64decode(iv)
encrypted_data_bytes = base64.b64decode(encrypted_data)
cipher = AES.new(key=aes_key_bytes, mode=AES.MODE_CBC, iv=iv_bytes)
decrypted_data = unpad(cipher.decrypt(encrypted_data_bytes), AES.block_size)
decrypted_data = decrypted_data.decode('utf-8')
decrypted_data = json.loads(decrypted_data)
return decrypted_data.get('phoneNumber')
except Exception as e:
return None
3. 绑定手机号
获取到用户的手机号之后,我们需要进行头像昵称、手机号及发起该次请求的微信用户的openId、session_key等信息绑定。代码示例:
def wx_get_user_phone(request):
"""
获取微信小程序用户手机号
"""
code = request.data.get('code')
iv = request.data.get('iv')
encrypted_data = request.data.get('encryptedData')
# 获取微信openid,微信session_key
code2session_resp = requests.get(
'https://api.weixin.qq.com/sns/jscode2session',
params={
'appid': WECHAT_APP_ID,
'secret': WECHAT_APP_SECRET,
'js_code': code,
'grant_type': 'authorization_code'
})
if code2session_resp.status_code != 200:
return {"message": "Failed to get wechat session key."}, status.HTTP_500_INTERNAL_SERVER_ERROR
code2session_resp_data = code2session_resp.json()
wx_openid = code2session_resp_data.get('openid')
wx_session_key = code2session_resp_data.get('session_key')
# 解密手机号信息
wx_user_phone = decrypt_wechat_user_phone_info(wx_session_key, iv, encrypted_data)
# 对于已经有注册信息的用户,在不存在其他情况的前提下,不用重复绑定,直接获取用户id即可
user_profile = UserProfile.objects.filter(wx_openid=wx_openid).first()
if user_profile:
user_profile.wx_phone = wx_user_phone
user_profile.save(update_fields=('wx_phone',))
else:
...
以上是Python获取微信小程序手机号并绑定的一个简单示例。需要注意的是,由于该过程需要在后端进行解密与交互,请务必确保前端与后端的数据完整性及安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python获取微信小程序手机号并绑定遇到的坑 - Python技术站