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

@@ -471,8 +471,9 @@ class FaKuanPayPollView(APIView):
return Response({'code': 400, 'message': '订单ID不能为空'})
order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID)
# 订单未支付时,尝试补偿履约(回调延迟/失败时通过轮询兜底)
if order.zhuangtai == 9:
# 订单未支付/已关单待补履约时,尝试补偿履约(回调延迟/失败时通过轮询兜底)
from products.czjilu_types import is_czjilu_fulfillable_status
if is_czjilu_fulfillable_status(order.zhuangtai):
from jituan.services.czjilu_fulfill import confirm_czjilu_paid, CzjiluFulfillError
try:
confirm_czjilu_paid(dingdanid, request.user.UserUID, expected_leixing=6)
@@ -503,12 +504,13 @@ class FaKuanPayFailView(APIView):
return Response({'code': 400, 'message': '订单ID不能为空'})
order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID)
if order.zhuangtai == 9: # 未支付
order.delete()
logger.info(f"用户{request.user.UserUID}删除未支付订单: {dingdanid}")
return Response({'code': 200, 'message': '订单已删除'})
if order.zhuangtai == 9: # 未支付:关单不删
from products.czjilu_types import close_unpaid_czjilu
close_unpaid_czjilu(order, reason='用户取消支付')
logger.info(f"用户{request.user.UserUID}关闭未支付罚款订单(不删): {dingdanid}")
return Response({'code': 200, 'message': '订单已取消'})
else:
return Response({'code': 400, 'message': '订单状态不是未支付,无法删除'})
return Response({'code': 400, 'message': '订单状态不是未支付,无法取消'})
except Czjilu.DoesNotExist:
return Response({'code': 400, 'message': '订单不存在'})
except Exception as e:
@@ -1004,8 +1006,9 @@ class KaohePayPollView(APIView):
return Response({'code': 400, 'message': '订单ID不能为空'})
try:
order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID, leixing=5)
# 订单未支付时,尝试补偿履约(回调延迟/失败时通过轮询兜底)
if order.zhuangtai == 9:
# 订单未支付/已关单待补履约时,尝试补偿履约
from products.czjilu_types import is_czjilu_fulfillable_status
if is_czjilu_fulfillable_status(order.zhuangtai):
from jituan.services.czjilu_fulfill import confirm_czjilu_paid, CzjiluFulfillError
try:
confirm_czjilu_paid(dingdanid, request.user.UserUID, expected_leixing=5)
@@ -1032,8 +1035,9 @@ class KaohePayFailView(APIView):
try:
order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID, leixing=5)
if order.zhuangtai == 9:
order.delete()
return Response({'code': 200, 'message': '订单已删除'})
return Response({'code': 400, 'message': '订单状态无法删除'})
from products.czjilu_types import close_unpaid_czjilu
close_unpaid_czjilu(order, reason='用户取消支付')
return Response({'code': 200, 'message': '订单已取消'})
return Response({'code': 400, 'message': '订单状态无法取消'})
except Czjilu.DoesNotExist:
return Response({'code': 400, 'message': '订单不存在'})