博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue + Django 2.0.6 学习笔记 10.12 支付宝支付接口返回签名校验
阅读量:4126 次
发布时间:2019-05-25

本文共 2273 字,大约阅读时间需要 7 分钟。

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

所以我们需要校验返回参数中的签名(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进行调用这些函数

函数

转载地址:http://esepi.baihongyu.com/

你可能感兴趣的文章
C语言-预处理指令3-文件包含
查看>>
C语言-变量类型
查看>>
C语言-static和extern关键字1-对函数的作用
查看>>
C 语言-static和extern关键字2-对变量的作用
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
还不会正则表达式?看这篇!
查看>>
100道+ JavaScript 面试题,助你查漏补缺
查看>>
JavaScript深入理解之闭包
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
如何实现a===1 && a===2 && a===3返回true?
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
12 个JavaScript 特性技巧你可能从未使用过
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>