修复了主动点单能力

This commit is contained in:
2026-07-10 15:50:43 +08:00
parent dcdcb7559e
commit 182f18da91
2 changed files with 49 additions and 22 deletions

View File

@@ -527,12 +527,8 @@ class PaymentVerifyView(APIView):
'data': {'dingdanid': dingdanid, 'zhuangtai': dingdan.Status}
})
# ---------- 5. 如果状态为9则主动查询微信支付状态 ----------
# ---------- 5. 如果状态为9则主动查询支付状态 ----------
if dingdan.Status == 9:
# 支付宝订单:异步回调会更新状态,这里返回支付中
if cache.get(f'alipay_pay_url_{dingdanid}'):
return Response({'code': 1, 'msg': '支付中', 'data': {'zhuangtai': 9}})
# 使用分布式锁防止并发处理同一订单
lock_key = f"payment_verify_lock_{dingdanid}"
if not cache.add(lock_key, "locked", timeout=10):
@@ -540,8 +536,33 @@ class PaymentVerifyView(APIView):
return Response({'code': 1, 'msg': '订单正在处理中,请稍后'})
try:
# 调用微信订单查询接口
trade_state, transaction_id = self._query_wechat_payment(dingdanid)
# 判断支付方式并主动查单
is_alipay = cache.get(f'alipay_pay_url_{dingdanid}') is not None
trade_state = None
transaction_id = None
if is_alipay:
# 支付宝订单主动查单alipay.trade.query
from jituan.services.alipay_pay import query_alipay_trade
alipay_status = query_alipay_trade(dingdanid, getattr(dingdan, 'ClubID', None))
if alipay_status in ('TRADE_SUCCESS', 'TRADE_FINISHED'):
trade_state = 'SUCCESS'
else:
return Response({'code': 1, 'msg': '支付中', 'data': {'zhuangtai': 9}})
else:
# 微信订单:主动查单
trade_state, transaction_id = self._query_wechat_payment(dingdanid)
if trade_state != 'SUCCESS':
# 兜底cache 标记可能已过期30分钟尝试查支付宝确认
from jituan.services.alipay_pay import query_alipay_trade
alipay_status = query_alipay_trade(dingdanid, getattr(dingdan, 'ClubID', None))
if alipay_status in ('TRADE_SUCCESS', 'TRADE_FINISHED'):
trade_state = 'SUCCESS'
logger.info('cache 过期但支付宝查单成功 dingdan=%s', dingdanid)
elif trade_state in ['NOTPAY', 'USERPAYING']:
return Response({'code': 1, 'msg': '支付中', 'data': {'zhuangtai': 9}})
else:
return Response({'code': 2, 'msg': '支付失败'})
if trade_state == 'SUCCESS':
# 支付成功,执行本地更新
@@ -553,15 +574,9 @@ class PaymentVerifyView(APIView):
'msg': '支付成功',
'data': {'dingdanid': dingdanid, 'zhuangtai': dingdan.Status}
})
elif trade_state in ['NOTPAY', 'USERPAYING']:
# 用户尚未支付或支付中
return Response({'code': 1, 'msg': '支付中', 'data': {'zhuangtai': 9}})
else:
# 其他状态CLOSED, REVOKED, PAYERROR 等,视为支付失败
return Response({'code': 2, 'msg': '支付失败'})
except Exception as e:
logger.error(f"查询微信支付异常: {e}", exc_info=True)
logger.error(f"查询支付异常: {e}", exc_info=True)
return Response({'code': 1, 'msg': '查询失败,请稍后重试'})
finally:
cache.delete(lock_key)