fix: 统一付呗/微信直连官方查单确认,轮询幂等入账
复查与充值轮询按通道查官方单:付呗单查付呗、直连查微信;履约仍幂等防多加,未完成返回业务码便于继续轮询。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1099,36 +1099,15 @@ def confirm_member_recharge_paid(dingdan_id, yonghuid):
|
||||
if order.zhuangtai != MEMBER_PENDING_STATUS and order.zhuangtai != MEMBER_CANCELLED_STATUS:
|
||||
raise MemberRechargeError(f'订单状态异常: {order.zhuangtai}', 'status_error')
|
||||
|
||||
# 主动查单确认支付状态
|
||||
from django.core.cache import cache
|
||||
club_id = getattr(order, 'club_id', None)
|
||||
is_alipay = cache.get(f'alipay_pay_url_{dingdan_id}') is not None
|
||||
from jituan.services.pay_confirm import confirm_remote_payment
|
||||
remote = confirm_remote_payment(dingdan_id, club_id, prefer_amount=order.jine)
|
||||
if not remote.get('ok'):
|
||||
if remote.get('pending'):
|
||||
raise MemberRechargeError('支付结果尚未同步,请稍后再试', 'not_paid')
|
||||
raise MemberRechargeError(remote.get('msg') or '支付未成功', 'not_paid')
|
||||
|
||||
from jituan.services.fubei_query import fubei_success_payload
|
||||
fb = fubei_success_payload(dingdan_id, club_id)
|
||||
if fb is not None:
|
||||
txn, _total = fb
|
||||
if not txn and _total is None:
|
||||
raise MemberRechargeError('付呗支付结果尚未同步,请稍后再试', 'not_paid')
|
||||
elif is_alipay:
|
||||
# 支付宝订单:主动查单(alipay.trade.query),TRADE_SUCCESS/FINISHED 则触发履约
|
||||
from jituan.services.alipay_pay import query_alipay_trade
|
||||
trade_status = query_alipay_trade(dingdan_id, club_id)
|
||||
if trade_status not in ('TRADE_SUCCESS', 'TRADE_FINISHED'):
|
||||
raise MemberRechargeError('支付宝支付结果尚未同步,请稍后再试', 'not_paid')
|
||||
else:
|
||||
# 微信订单:主动查单
|
||||
trade_state, _ = query_wechat_v2_trade_state(dingdan_id, club_id)
|
||||
if trade_state != 'SUCCESS':
|
||||
# 兜底:cache 标记可能已过期(30分钟),尝试查支付宝确认
|
||||
from jituan.services.alipay_pay import query_alipay_trade
|
||||
alipay_status = query_alipay_trade(dingdan_id, club_id)
|
||||
if alipay_status in ('TRADE_SUCCESS', 'TRADE_FINISHED'):
|
||||
logger.info('cache 过期但支付宝查单成功 dingdan=%s', dingdan_id)
|
||||
else:
|
||||
raise MemberRechargeError('微信侧尚未支付成功,请稍后再试', 'not_paid')
|
||||
|
||||
total_fee_yuan = Decimal(str(order.jine))
|
||||
total_fee_yuan = Decimal(str(remote.get('amount') if remote.get('amount') is not None else order.jine))
|
||||
result = fulfill_member_recharge(
|
||||
dingdan_id, paid_amount_yuan=total_fee_yuan, source='confirm',
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user