支付宝支付接口返回签名校验"/>
Vue + Django 2.0.6 学习笔记 10.12 支付宝支付接口返回签名校验
支付成功后 支付宝会返回相应参数。但是我们必须要检查返回的参数是不是支付宝发起的。还是被串改的。
所以我们需要校验返回参数中的签名(sign)是否与其他参数一致
代码:
# 测试用函数写在 if __name__ == "__main__"中的。 用于单独测试return_url = 'http://127.0.0.1:8000/?total_amount=100.00×tamp=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类型。然后交给数据转换函数 verifyfor 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_keysigner = PKCS1_v1_5.new(key)digest = SHA256.new()
# 将参数进行加签digest.update(raw_content.encode('utf8'))
# 比对网络传递过来的签名,看是否一致。 如果是就返回True, 否则返回Falseif signer.verify(digest, decodebytes(signature.encode('utf8'))):return Truereturn False
这样就完成了返回的验证。 然后接下来就是写View进行调用这些函数
函数
更多推荐
Vue + Django 2.0.6 学习笔记 10.12 支付宝支付接口返回签名校验
发布评论