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

我们需要对参数进行严格验证校验,包括验证商家的订单号、订单金额、商家ID和APP ID等。
AlipayCallbackAPIView新增如下代码:
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',这是支付宝端指定的名字。
至此,我们就完成了异步验签的全部流程。
【大熊课堂精品课程】
Python零基础入门动画课: https://www.bilibili.com/cheese/play/ss7988
Django+Vue:全栈开发: https://www.bilibili.com/cheese/play/ss8134
PyQT6开发桌面软件: https://www.bilibili.com/cheese/play/ss12314
Python办公自动化: https://www.bilibili.com/cheese/play/ss14990
Cursor AI编程+MCP:零基础实战项目课: https://www.bilibili.com/cheese/play/ss105194189
Pandas数据分析实战: https://www.bilibili.com/cheese/play/ss734522035
AI大模型+Python小白应用实战: https://www.bilibili.com/cheese/play/ss3844