fix: 加固支付宝充值回调幂等履约,避免付成功不到账与误删单

禁止 Czjilu 回调地址回落到订单 notify;回调失败回 fail 重试;取消支付改关单不删;客服补单走同一履约防多加。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-20 22:59:59 +08:00
parent 48d2e13037
commit 1ab59efddb
13 changed files with 283 additions and 106 deletions

View File

@@ -457,6 +457,45 @@ class AlipayPayNotifyView(WechatPayNotifyView):
# 处理支付结果
if trade_status in ('TRADE_SUCCESS', 'TRADE_FINISHED'):
logger.warning(f"[ALIPAY_NOTIFY_DEBUG] 调用 _handle_success")
# 充值单误打进订单回调:转交 Czjilu 履约,禁止空 success 吞掉通知
from products.czjilu_types import looks_like_czjilu_out_trade_no
from products.models import Czjilu
if looks_like_czjilu_out_trade_no(out_trade_no) or Czjilu.query.filter(dingdan_id=out_trade_no).exists():
logger.error(
'[ALIPAY_NOTIFY_DEBUG] 充值单误入订单回调,改走 Czjilu 履约: %s',
out_trade_no,
)
from products.views.alipay_czjilu_notify import _fulfill_czjilu_by_leixing
cz = Czjilu.query.filter(dingdan_id=out_trade_no).first()
if not cz:
logger.error('[ALIPAY_NOTIFY_DEBUG] Czjilu 不存在仍回 fail: %s', out_trade_no)
return HttpResponse('fail', content_type='text/plain')
if cz.zhuangtai == 3:
return HttpResponse('success', content_type='text/plain')
from products.czjilu_types import is_czjilu_fulfillable_status
if not is_czjilu_fulfillable_status(cz.zhuangtai):
logger.warning(
'[ALIPAY_NOTIFY_DEBUG] Czjilu 终态不再履约 %s zhuangtai=%s',
out_trade_no, cz.zhuangtai,
)
return HttpResponse('success', content_type='text/plain')
try:
paid_amount = params.get('total_amount') or cz.jine
_fulfill_czjilu_by_leixing(out_trade_no, cz.leixing, paid_amount, source='order_notify_redirect')
except Exception as redirect_exc:
logger.error(
'[ALIPAY_NOTIFY_DEBUG] 充值单转履约失败 %s: %s',
out_trade_no, redirect_exc, exc_info=True,
)
return HttpResponse('fail', content_type='text/plain')
return HttpResponse('success', content_type='text/plain')
# 老板订单:不存在则 fail让支付宝重试禁止假 success
from orders.models import Order
if not Order.query.filter(OrderID=out_trade_no).exists():
logger.error(f"[ALIPAY_NOTIFY_DEBUG] 订单不存在,回 fail 以便重试: {out_trade_no}")
return HttpResponse('fail', content_type='text/plain')
self._handle_success(out_trade_no, trade_no, None)
logger.warning(f"[ALIPAY_NOTIFY_DEBUG] _handle_success 完成")
else: