支付宝支付成功异步回调验签以及注意事项(附源码)

1. 吐槽:

做微信支付的时候抽时间去看了支付宝支付,发现支付宝支付好简单,有官方给的SDK直接调用就OK,但是真正做起来才发现实在是太想当然了,微信app支付就那么几个接口,而且输入输出验签都写得很详细,但是支付宝开始做才发现文档实在是太多了,说不定就从哪跳转到了另外一个地方,尤其做到异步调用这里,文档简直不要太不详细,其实最主要就是封装的SDK没有文档,找不到验签的方法.

2. 要注意的点:
  1. notify_url
    notify_url = "https://www.xxx.com/****/******/callback/",这里的url要注意看你的项目中最后的"/"是否需要加,有的斜杠不加是会报错的

  2. 异步通知中,要进行sign验签
    官方代码基本都是封装到类里的,我找来找去就是找不到那个类,但是找到了它封装的一个
    verify_with_rsa(public_key, message, sign) 函数

3. 导入方法(上代码)
from alipay.aop.api.util.SignatureUtils import verify_with_rsa


def 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_key
        try:
            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 = False
                	if trade_status == 'TRADE_SUCCESS' or trade_status == 'TRADE_FINISHED':
                    	pay_success = True
                	if pay_success:
                		# 如果支付成功一定是success这个单词,其他的alipay不认
                		return 'success'
                return 'failure'
            else:
                return 'failure'
         except:
            return 'failure'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值