fix: 加固支付宝充值回调幂等履约,避免付成功不到账与误删单
禁止 Czjilu 回调地址回落到订单 notify;回调失败回 fail 重试;取消支付改关单不删;客服补单走同一履约防多加。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user