文章目录
1. 吐槽:2. 要注意的点:3. 导入方法(上代码)1. 吐槽:
做微信支付的时候抽时间去看了支付宝支付,发现支付宝支付好简单,有官方给的SDK直接调用就OK,但是真正做起来才发现实在是太想当然了,微信app支付就那么几个接口,而且输入输出验签都写得很详细,但是支付宝开始做才发现文档实在是太多了,说不定就从哪跳转到了另外一个地方,尤其做到异步调用这里,文档简直不要太不详细,其实最主要就是封装的SDK没有文档,找不到验签的方法.
2. 要注意的点:
notify_url
notify_url = "/****/******/callback/"
,这里的url要注意看你的项目中最后的"/"是否需要加,有的斜杠不加是会报错的
异步通知中,要进行sign验签
官方代码基本都是封装到类里的,我找来找去就是找不到那个类,但是找到了它封装的一个
verify_with_rsa(public_key, message, sign)函数
3. 导入方法(上代码)
from alipay.aop.api.util.SignatureUtils import verify_with_rsadef notify(self, request):"""支付宝内部支付完成后,异步通知到这个接口,返回支付宝状态,同步到数据库中""""""处理不同得参数,必须返回success"""# 我这里是用的Django所以取值使用request.POST,具体怎么取值取决于使用者的框架data = request.POST.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 = settings.alipay_public_keytry:if verify_with_rsa(alipay_public_key.encode('utf-8').decode('utf-8'), message, sign):# 1. 商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号# 2. 判断 total_amount 是否确实为该订单的实际金额(即商户订单创建时的金额),# 3. 校验通知中的 seller_id(或者 seller_email ) 是否为 out_trade_no 这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)# 4. 验证 app_id 是否为该商户本身。上述 1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功# 1-4的验证需要自己加notify_type = data['notify_type'] # 通知类型trade_status = data['trade_status'] # 订单状态if notify_type == 'trade_status_sync':pay_success = Falseif trade_status == 'TRADE_SUCCESS' or trade_status == 'TRADE_FINISHED':pay_success = Trueif pay_success:# 如果支付成功一定是success这个单词,其他的alipay不认return 'success'return 'failure'else:return 'failure'except:return 'failure'