在微信开发中,会有保存手机号的需求,流程是小程序端调用api获取手机号,再发送到后端保存,注意这个手机号是加密的,这里需要后端在获取后解密。
这里用python的flask作为后端实现。
表单验证:
这里需要传入验证参数encryptedData和vinum
class DecodeUserPhoneForm(BaseForm):
"""解密用户手机号"""
encryptedData = wtforms.StringField(
validators=[
DataRequired()])
vinum = wtforms.StringField(
validators=[
DataRequired()])
然后是逻辑处理:
class WXBizDataCrypt:
def __init__(self, appId, sessionKey):
self.appId = appId
self.sessionKey = sessionKey
def decrypt(self, encryptedData, iv):
# base64 decode
sessionKey = base64.b64decode(self.sessionKey)
encryptedData = base64.b64decode(encryptedData)
iv = base64.b64decode(iv)
cipher = AES.new(sessionKey, AES.MODE_CBC, iv)
decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData)).decode())
if decrypted['watermark']['appid'] != self.appId:
raise Exception('Invalid Buffer')
return decrypted
def _unpad(self, s):
return s[:-ord(s[len(s)-1:])]
def decode_user_phone():
"""解密用户手机号"""
form = validators.DecodeUserPhoneForm(request.args).validate_()
user = get_user_model()
encryptedData = form.encryptedData.data + '=='
iv = form.vinum.data + '=='
pc = WXBizDataCrypt(config.MINI_PROGRAM_APPID, user.user_session_key)
mobile_obj = pc.decrypt(encryptedData, iv)
mobile = mobile_obj['phoneNumber']
print(mobile)
data = {
'mobile': mobile
}
# 存储号码
todo
return ''
随即就能获取到解密后的手机号,再进行逻辑处理。
版权属于:Jolly
本文链接:https://totoro.site/index.php/archives/83/
关于转载:原创文章,禁止转载