本文共 2273 字,大约阅读时间需要 7 分钟。
支付成功后 支付宝会返回相应参数。但是我们必须要检查返回的参数是不是支付宝发起的。还是被串改的。
所以我们需要校验返回参数中的签名(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类型。然后交给数据转换函数 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/