Python中Django支付宝异步通知接收不到,请问能帮我看一下么?

我的代码如下:

[@login_required](/user/login_required)(login_url='/accounts/login/')
[@csrf_exempt](/user/csrf_exempt)
def apliy_check_pay(request):
    alipay=AliPay(
        appid=ALIPAY_APPID,
        app_notify_url=set_url,
        app_private_key_path=os.path.join(settings.BASE_DIR, "app/app_private_key.pem"),
        alipay_public_key_path=os.path.join(settings.BASE_DIR, "app/alipay_public_key.pem"),
        sign_type="RSA2",
        debug=True,
    )
    if request.method == 'POST':
        mydata=request.POST.dict()
        signature = mydata.pop("sign")
        success=alipay.verify(mydata,signature)
        if success:
            order_sn=mydata['out_trade_no']
            trade_no=mydata['trade_no']  
            myfunding=Funding.objects.filter(number=order_sn)
            existed_orders=myfunding.update(
                    fudingpaid=True,
                    number=str(order_sn),
                    trade_no=str(trade_no),
            )
            return HttpResponse('支付成功')
    if request.method == 'GET':
        params=request.GET.dict()	
        #test=request.GET.get('trade_status')	
        sign=params.pop('sign',None)
        print(sign)
        status=alipay.verify(params,sign)
        if status:
            order_sn=params['out_trade_no']
            trade_no=params['trade_no']
            myfunding=Funding.objects.filter(number=order_sn)
            existed_orders=myfunding.update(
                    fudingpaid=True,
                    number=str(order_sn),
                    trade_no=str(trade_no),
            )
            return HttpResponse('支付成功')
        return HttpResponse('支付失败')
    else:
        return  HttpResponseRedirect(reverse('accounts:payment_funding'))

GET 是可以 GET 到的,是 POST 哪里写错了么?

使用的 github 上该封装 https://github.com/fzlee/alipay/blob/master/README.zh-hans.md


Python中Django支付宝异步通知接收不到,请问能帮我看一下么?

2 回复

我遇到过这个问题,异步通知收不到通常是验签或回调处理的问题。看看你的代码:

# views.py
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
import json
from alipay import AliPay

@csrf_exempt
def alipay_notify(request):
    if request.method != 'POST':
        return HttpResponse('fail')
    
    # 1. 获取POST数据
    data = request.POST.dict()
    
    # 2. 初始化Alipay对象(配置要和下单时一致)
    alipay = AliPay(
        appid='你的APPID',
        app_notify_url='https://yourdomain.com/notify/',
        app_private_key_string='应用私钥',
        alipay_public_key_string='支付宝公钥',  # 注意不是应用公钥
        sign_type='RSA2',
        debug=False
    )
    
    # 3. 验证签名
    signature = data.pop('sign', None)
    sign_type = data.pop('sign_type', 'RSA2')
    
    success = alipay.verify(data, signature)
    
    if success and data['trade_status'] in ['TRADE_SUCCESS', 'TRADE_FINISHED']:
        # 4. 处理业务逻辑
        out_trade_no = data['out_trade_no']
        trade_no = data['trade_no']
        
        # TODO: 更新订单状态,注意处理幂等性
        # 先检查订单是否已处理过
        
        return HttpResponse('success')
    else:
        return HttpResponse('fail')

关键点:

  1. 路由配置:确保URL能公网访问,支付宝只能回调到公网地址
  2. CSRF豁免:必须加@csrf_exempt装饰器
  3. 密钥正确:支付宝公钥要从支付宝开放平台获取,不是自己生成的应用公钥
  4. 返回格式:成功必须返回纯文本的success,失败返回fail
  5. 日志记录:建议在关键步骤添加日志,方便排查

检查下你的支付宝配置和网络可达性。


另外 GET 状态下是没有’trade_status’标签的

回到顶部