区分平台上限与微信商户额度,失败时明确返回已尝试的商户号。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-14 21:36:28 +08:00
parent 9bcd7b3a21
commit b158250d70
2 changed files with 36 additions and 11 deletions

View File

@@ -505,7 +505,7 @@ def _check_personal_quota_readonly(user_main, leixing, jine, shenhe_danhao=''):
if projected_personal > personal_quota:
return (
False,
f'【平台个人限额】今日提现已达上限,今日已提{personal_today}元,本次申请{jine}元,限额{personal_quota}',
f'【平台个人限额·与微信商户无关·换号无效】今日提现已达上限,今日已提{personal_today}元,本次申请{jine}元,限额{personal_quota}',
'personal',
)
return True, '', ''
@@ -530,7 +530,7 @@ def _check_platform_quota_readonly(leixing, shijidaozhang, shenhe_danhao=''):
)
return (
False,
f'【平台总限额】今日该角色提现已达上限,今日已提{daily_used}元,本次到账{additional}元,限额{platform_limit}',
f'【平台总限额·与微信商户无关·换号无效】今日该角色提现已达上限,今日已提{daily_used}元,本次到账{additional}元,限额{platform_limit}',
'platform',
)
@@ -589,7 +589,7 @@ def reserve_collect_quota_limits(user_main, leixing, jine, shijidaozhang, shenhe
if personal_today + jine > personal_quota:
return (
False,
f'【平台个人限额】今日提现已达上限,今日已提{personal_today}元,本次申请{jine}元,限额{personal_quota}',
f'【平台个人限额·与微信商户无关·换号无效】今日提现已达上限,今日已提{personal_today}元,本次申请{jine}元,限额{personal_quota}',
'personal',
)
@@ -604,7 +604,7 @@ def reserve_collect_quota_limits(user_main, leixing, jine, shijidaozhang, shenhe
if platform_stat.total_amount + shijidaozhang > platform_limit:
return (
False,
f'【平台总限额】今日该角色提现已达上限,今日已提{platform_stat.total_amount}元,'
f'【平台总限额·与微信商户无关·换号无效】今日该角色提现已达上限,今日已提{platform_stat.total_amount}元,'
f'本次到账{shijidaozhang}元,限额{platform_limit}',
'platform',
)

View File

@@ -293,9 +293,9 @@ def process_audit_collect(request):
logger.error('微信打款配置不完整 enabled_count=%s', len(mch_cfgs))
return Response({'code': 11, 'msg': '系统配置异常,请联系客服'})
if len(mch_cfgs) < 2:
logger.warning(
logger.error(
'启用且配置完整的转账商户仅 %s 个,无法轮换 mch_ids=%s '
'(后台多个启用但私钥路径无效会被跳过)',
'(后台多个启用但私钥路径无效会被跳过;微信商户日额度失败时将无法换号',
len(mch_cfgs), [c.get('MCHID') for c in mch_cfgs],
)
@@ -415,10 +415,12 @@ def process_audit_collect(request):
last_user_msg = '微信收款发起失败,请稍后重试'
last_was_balance = False
tixian_id = None
tried_mchs = []
for mch_idx, wx_cfg in enumerate(mch_cfgs):
tixian_id = generate_tixian_id()
mch_id = wx_cfg['MCHID']
tried_mchs.append(mch_id)
with transaction.atomic():
TixianAutoRecord.objects.create(
tixian_id=tixian_id,
@@ -532,6 +534,7 @@ def process_audit_collect(request):
or clear_fail
or ('额度' in err_msg)
or ('限额' in err_msg)
or ('上限' in err_msg)
or resp.status_code in (400, 401, 403)
)
@@ -587,29 +590,51 @@ def process_audit_collect(request):
TixianAutoRecord.objects.get(tixian_id=tixian_id),
)
quota_reserved = False
tried = ''.join(tried_mchs) or mch_id
if len(mch_cfgs) < 2:
return Response({
'code': 99,
'msg': (
f'仅1个可用打款商户({tried}),无法轮换。'
f'失败原因:{user_msg}。请在后台再完善并启用第二个商户(私钥须存在)。'
),
})
if ip_denied:
return Response({
'code': 99,
'msg': '所有商户均无法发起打款请检查各商户IP白名单/日额度),请联系管理员',
'msg': f'已尝试商户 {tried} 均失败含IP白名单请检查各商户配置',
})
if last_was_balance:
return Response({
'code': 99,
'msg': '运营账户资金不足,需等管理员充值后才能提现',
'msg': f'已尝试商户 {tried}运营账户资金不足,需等管理员充值后才能提现',
})
return Response({'code': 99, 'msg': user_msg})
return Response({
'code': 99,
'msg': f'已尝试商户 {tried} 均失败:{user_msg}',
})
if quota_reserved and tixian_id:
release_collect_quota_for_record(
TixianAutoRecord.objects.get(tixian_id=tixian_id),
)
quota_reserved = False
tried = ''.join(tried_mchs) if tried_mchs else ''
if last_was_balance:
return Response({
'code': 99,
'msg': '运营账户资金不足,需等管理员充值后才能提现',
'msg': (
f'已尝试商户 {tried},运营账户资金不足,需等管理员充值后才能提现'
if tried else '运营账户资金不足,需等管理员充值后才能提现'
),
})
return Response({'code': 99, 'msg': last_user_msg})
return Response({
'code': 99,
'msg': (
f'已尝试商户 {tried} 均失败:{last_user_msg}'
if tried else last_user_msg
),
})
finally:
release_lock(lock_key)