Skip to main content

支付宝异步验签3

本节我们来继续完成支付校验的第五步,如下图所示:

图75-校验流程第五步

我们需要对参数进行严格验证校验,包括验证商家的订单号、订单金额、商家ID和APP ID等。

AlipayCallbackAPIView新增如下代码:

dx_movie/trade/views.py
from django.conf import settings

class AlipayCallbackAPIView(APIView):
def post(self, request):
params = request.POST.dict()
print(params)
# 去除sign 和 sign_type
sign = params.pop('sign')
del params['sign_type']
# 对字典进行排序
sorted_list = sorted([(k, v) for k,v in params.items() ])
unsigned_string = '&'.join(f"{k}={v}" for k,v in sorted_list) # buyer_pay_amount=0.02&app_id=9021000126620710
alipay = Alipay()
if not alipay.verify_sign(unsigned_string, sign):
print('vefify sign error')
return Response('error')
# 验证out_trade_no
try:
order = Order.objects.get(order_sn=params.get('out_trade_no'))
except:
return Response('error')
if params.get('total_amount') != str(order.order_mount):
return Response('error')
if params.get('seller_id') != settings.ALIPAY_SELLER_ID:
return Response('error')
if params.get('app_id') != settings.ALIPAY_APP_ID:
return Response('error')
if params.get('trade_status') not in ['TRADE_SUCCESS', 'TRADE_FINISHED']:
return Response('error')
# 业务逻辑
print('全部验证通过')
return Response('success')

上述代码中,如果verify_sign()验证通过,则继续验证其他参数。

首先验证order表中是否存在out_trade_no。还记得我们创建订单时,就已经生成了一个Order表,将订单号写入到了order_sn字段。所以,如果请求正确的话,这个在Order表中,这个值肯定是存在的。

接着验证total_amount, 验证一下与order表中的值是否一致。

然后验证seller_id和app_id,验证一下是否与我们的配置文件中的一致。

最后验证trade_status, 它的值必须是'TRADE_SUCCESS'或者'TRADE_FINISHED',这是支付宝端指定的名字。

至此,我们就完成了异步验签的全部流程。