Vue + Django 2.0.6 学习笔记 10.12 支付宝支付接口返回签名校验

支付成功后 支付宝会返回相应参数。但是我们必须要检查返回的参数是不是支付宝发起的。还是被串改的。

所以我们需要校验返回参数中的签名(sign)是否与其他参数一致

代码:

# 测试用函数

写在 if __name__ == "__main__"中的。 用于单独测试

    return_url = 'http://127.0.0.1:8000/?total_amount=100.00&timestamp=2017-08-15+23%3A53%3A34&sign=e9E9UE0AxR84NK8TP1CicX6aZL8VQj68ylugWGHnM79zA7BKTIuxxkf%2FvhdDYz4XOLzNf9pTJxTDt8tTAAx%2FfUAJln4WAeZbacf1Gp4IzodcqU%2FsIc4z93xlfIZ7OLBoWW0kpKQ8AdOxrWBMXZck%2F1cffy4Ya2dWOYM6Pcdpd94CLNRPlH6kFsMCJCbhqvyJTflxdpVQ9kpH%2B%2Fhpqrqvm678vLwM%2B29LgqsLq0lojFWLe5ZGS1iFBdKiQI6wZiisBff%2BdAKT9Wcao3XeBUGigzUmVyEoVIcWJBH0Q8KTwz6IRC0S74FtfDWTafplUHlL%2Fnf6j%2FQd1y6Wcr2A5Kl6BQ%3D%3D&trade_no=2017081521001004340200204115&sign_type=RSA2&auth_app_id=2016080600180695&charset=utf-8&seller_id=2088102170208070&method=alipay.trade.page.pay.return&app_id=2016080600180695&out_trade_no=20170202185&version=1.0'

# 将url解析成各个参数
    o = urlparse(return_url)
# 转换为字典(这里要注意,值全部是list类型)
    query = parse_qs(o.query)
    processed_query = {}
# 去掉sign 不去掉的话会吧它一起签名了。那肯定验证不过
    ali_sign = query.pop('sign')[0]

# app_notify_url 是异步支付毁掉接收地址
    alipay = AliPay(
        appid="2016101100661810",
        app_notify_url= "http://127.0.0.1:8000/alipay/return/",
        app_private_key_path= "../trade/keys/private_2048.txt",
        alipay_public_key_path="../trade/keys/alipay_key_2048.txt",
        debug=True
    )

#将字典的value类型转成string类型。然后交给数据转换函数 verify
    for key, value in query.items():
        processed_query[key] = value[0]
    print(alipay.verify(processed_query, ali_sign))

在剔除掉sign字段之后就交给了verify来讲字典转换成带&符号的字段

# 数据整理转换

    def verify(self, data, signature):
# 剔除sign_type 其实外面剔除也可以
        if "sign_type" in data:
            sign_type = data.pop("sign_type")
# 排序。
        unsigned_items = self.ordered_data(data)
# 用&拼接
        message = "&".join(u"{}={}".format(k, y) for k, y in unsigned_items)
# 交给签名函数
        return self._verify(message, signature)

数据整理完之后就交给签名函数进行签名比对

# 签名

    def _verify(self, raw_content, signature):
# 阿里的公钥加签
        key = self.alipay_public_key
        signer = PKCS1_v1_5.new(key)
        digest = SHA256.new()
# 将参数进行加签
        digest.update(raw_content.encode('utf8'))
# 比对网络传递过来的签名,看是否一致。 如果是就返回True, 否则返回False
        if signer.verify(digest, decodebytes(signature.encode('utf8'))):
            return True
        return False

这样就完成了返回的验证。 然后接下来就是写View进行调用这些函数

函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@凌晨三点半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值