fix: 统一付呗/微信直连官方查单确认,轮询幂等入账
复查与充值轮询按通道查官方单:付呗单查付呗、直连查微信;履约仍幂等防多加,未完成返回业务码便于继续轮询。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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':
|
||||
# 支付成功,执行本地更新
|
||||
|
||||
Reference in New Issue
Block a user