Jolly

微信小程序后端解密手机号
在微信开发中,会有保存手机号的需求,流程是小程序端调用api获取手机号,再发送到后端保存,注意这个手机号是加密的,...
扫描右侧二维码阅读全文
07
2020/07

微信小程序后端解密手机号

在微信开发中,会有保存手机号的需求,流程是小程序端调用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 ''

随即就能获取到解密后的手机号,再进行逻辑处理。

Last modification:July 7th, 2020 at 01:59 pm
🌓