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')
关键点:
- 路由配置:确保URL能公网访问,支付宝只能回调到公网地址
- CSRF豁免:必须加
@csrf_exempt装饰器 - 密钥正确:支付宝公钥要从支付宝开放平台获取,不是自己生成的应用公钥
- 返回格式:成功必须返回纯文本的
success,失败返回fail - 日志记录:建议在关键步骤添加日志,方便排查
检查下你的支付宝配置和网络可达性。
另外 GET 状态下是没有’trade_status’标签的

