浏览代码

feat: 转账错误码友好提示 + 通知回调 tenant_id 修复

alphah 1 周之前
父节点
当前提交
4e1dbd39bf

+ 27 - 2
backend/app/plugin/module_payment/account/service.py

@@ -35,6 +35,28 @@ from .schema import (
 )
 from ..openapi.crud import OpenTransferCRUD
 
+# 支付宝资金专户转账错误码 → 友好提示
+_TRANSFER_ERROR_HINTS = {
+    "SYSTEM_ERROR": "系统繁忙,请稍后重试",
+    "INVALID_PARAMETER": "请求参数有误,请检查后重试",
+    "AMOUNT_LESS_THAN_ONE_CENT": "转账金额不能低于 0.01 元",
+    "BALANCE_IS_NOT_ENOUGH": "企业余额不足,建议充值",
+    "BANK_RESPONSE_ERROR": "银行处理失败:账户异常",
+    "CARD_BIN_ERROR": "收款银行账号不正确,请确认",
+    "DUPLICATE_DIFFERENT_REQUEST": "重复请求但参数不一致,请检查",
+    "EXCEED_LIMIT_SM_MIN_AMOUNT": "转账金额不能低于 0.1 元",
+    "EXCEED_LIMIT_DM_MAX_AMOUNT": "超出单日转账限额,请明天再试或联系管理员提升限额",
+    "INVALID_ACCOUNT_BOOK": "资金专户不存在,请检查专户号",
+    "INVALID_CARDNO": "无效的收款银行卡号",
+    "INVALID_IDENTITY_TYPE": "收款方身份类型不匹配",
+    "NO_AGREEMENT": "无转账权限,请联系管理员",
+    "PAYEE_CARD_INFO_ERROR": "收款方账号或银行卡信息有误,请核实",
+    "PAYEE_NOT_EXIST": "收款账号不存在或姓名有误",
+    "PAYER_BALANCE_NOT_ENOUGH": "付款方余额不足,建议充值",
+    "REQUEST_PROCESSING": "系统处理中,请稍后重试",
+    "TRANS_AUTH_NO_EXIST": "转账授权协议不存在,请先签约",
+}
+
 
 def _parse_dt(val: str | None) -> datetime | None:
     """解析支付宝日期字符串"""
@@ -312,8 +334,11 @@ class AccountService:
         result.parse_response_content(response)
 
         if not result.is_success():
-            log.error(f"支付宝接口调用失败: {result.code} - {result.msg}")
-            raise CustomException(msg=f"转账失败: {result.sub_msg or result.msg or result.code}")
+            sub_code = getattr(result, 'sub_code', '') or ''
+            sub_msg = getattr(result, 'sub_msg', '') or ''
+            hint = _TRANSFER_ERROR_HINTS.get(sub_code, sub_msg or result.msg or "转账失败")
+            log.error(f"支付宝接口调用失败: {result.code} - {result.msg} (sub_code={sub_code})")
+            raise CustomException(msg=f"转账失败: {hint}")
 
         transfer_crud = TransferCRUD(auth)
         transfer_data = {

+ 16 - 1
backend/app/plugin/module_payment/notification/service.py

@@ -163,7 +163,22 @@ class NotificationService:
         biz_content = notify_data.parse_biz_content()
         log.debug(f"支付宝通知消息 - 消息内容: {biz_content}")
 
-        # 4. 分发处理
+        # 4. 从 enterprise_id 获取正确的 tenant_id
+        enterprise_id = biz_content.get("enterprise_id", "")
+        if enterprise_id and auth.tenant_id == -1:
+            try:
+                from app.plugin.module_payment.enterprise.model import EnterpriseModel
+                from sqlalchemy import select
+                stmt = select(EnterpriseModel.tenant_id).where(EnterpriseModel.enterprise_id == enterprise_id)
+                result = await auth.db.execute(stmt)
+                tenant_id = result.scalar_one_or_none()
+                if tenant_id:
+                    auth.tenant_id = tenant_id
+                    log.debug(f"支付宝通知消息 - 从 enterprise_id 解析 tenant_id={tenant_id}")
+            except Exception:
+                log.warning(f"支付宝通知消息 - 解析 tenant_id 失败: enterprise_id={enterprise_id}")
+
+        # 5. 分发处理
         success = await cls.dispatch(notify_data.method, biz_content, auth, redis)
 
         # 5. 处理成功后记录