python 用支付宝官方的接口,异步通知由于一些文档和示例都没有,特记录如下:
首先一个大坑:
1、notify_url 必须要以'/'号结尾,
request_order = AlipayTradePagePayRequest(biz_model=model)
request_order.notify_url = 'https://www.5y100.com/****/******/callback/'
原来我是填了callback,结果支付宝走不了这个通知,尝试了一番,加‘/’号终于走通
2、异步通知中,要进行sign验签的主要函数和几个步骤
官方的异步通知的sign验签是封装到一个类里的,我找来找去就是找不到那个类,但是找到了它封装的一个
verify_with_rsa
方法,所以,自行按步骤走了前面几个,下面的这个函数体可以通用:
@classmethod
def notify(cls,request):
"""
支付宝内部支付完成后,异步通知到这个接口,返回支付宝状态,同步到数据库中
"""
"""处理不同得参数,必须返回success"""
data = request.values.to_dict()
# sign, sign_type 都要从数据中取出,否则签名通不过
sign, sign_type = data.pop('sign'), data.pop('sign_type')
#排序
params = sorted(data.items(), key=lambda e: e[0], reverse=False)
#拼接成字符串
message = "&".join(u"{}={}".format(k, v) for k, v in params).encode()
alipay_public_key = cls.alipay_client_config.alipay_public_key
try:
if verify_with_rsa(alipay_public_key.encode('utf-8').decode('utf-8'), message, sign):
# 一定是success这个单词,其他的alipay不认
return 'success'
else:
return 'failure'
except:
return 'failure'