fix: 统一付呗/微信直连官方查单确认,轮询幂等入账

复查与充值轮询按通道查官方单:付呗单查付呗、直连查微信;履约仍幂等防多加,未完成返回业务码便于继续轮询。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-21 20:57:36 +08:00
parent b19430213a
commit dacd55bb1e
9 changed files with 185 additions and 125 deletions

View File

@@ -575,45 +575,22 @@ class PaymentVerifyView(APIView):
return Response({'code': 1, 'msg': '订单正在处理中,请稍后'})
try:
# 判断支付方式并主动查单
is_alipay = cache.get(f'alipay_pay_url_{dingdanid}') is not None
trade_state = None
transaction_id = None
# 付呗单优先:勿用微信直连 orderquery查不到会一直「支付中」
from jituan.services.fubei_query import fubei_success_payload
fb = fubei_success_payload(dingdanid, getattr(dingdan, 'ClubID', None))
if fb is not None:
txn, _fee = fb
if txn or _fee is not None:
trade_state = 'SUCCESS'
transaction_id = txn or None
else:
return Response({'code': 1, 'msg': '支付中', 'data': {'zhuangtai': 9}})
elif 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}})
from jituan.services.pay_confirm import confirm_remote_payment
remote = confirm_remote_payment(
dingdanid,
getattr(dingdan, 'ClubID', None),
prefer_amount=getattr(dingdan, 'Amount', None),
)
if remote.get('ok'):
trade_state = 'SUCCESS'
transaction_id = remote.get('transaction_id')
elif remote.get('pending'):
return Response({'code': 1, 'msg': '支付中', 'data': {'zhuangtai': 9}})
else:
# 微信订单:主动查单(按订单 club 读后台商户配置)
trade_state, transaction_id = self._query_wechat_payment(
dingdanid, club_id=getattr(dingdan, 'ClubID', None),
)
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': '支付失败'})
return Response({'code': 2, 'msg': remote.get('msg') or '支付失败'})
if trade_state == 'SUCCESS':
# 支付成功,执行本地更新