diff --git a/backend/app/__pycache__/alipay_provider.cpython-313.pyc b/backend/app/__pycache__/alipay_provider.cpython-313.pyc index dbbec3e..fad1e2e 100644 Binary files a/backend/app/__pycache__/alipay_provider.cpython-313.pyc and b/backend/app/__pycache__/alipay_provider.cpython-313.pyc differ diff --git a/backend/app/alipay_provider.py b/backend/app/alipay_provider.py index 5ff753a..85758ae 100644 --- a/backend/app/alipay_provider.py +++ b/backend/app/alipay_provider.py @@ -7,12 +7,16 @@ mode do not require credentials or network access. from decimal import Decimal import hashlib import json +import logging from pathlib import Path import re from .config import settings +logger = logging.getLogger(__name__) + + class AlipayTransferError(RuntimeError): def __init__(self, message: str, code: str = "", ambiguous: bool = False): super().__init__(message) @@ -49,6 +53,11 @@ def validate_configuration() -> None: raise AlipayTransferError("应用公钥证书与应用私钥不匹配") else: _sdk_key(_read_key(settings.alipay_public_key_path, "支付宝公钥"), private=False) + logger.info( + "Alipay provider configuration validated: scene=%s certificate_mode=%s transfer_scene_report_schema=佣金报酬说明", + settings.alipay_transfer_scene_name, + _certificate_mode_enabled(), + ) def _certificate_mode_enabled() -> bool: @@ -278,6 +287,18 @@ def transfer(*, out_biz_no: str, amount_fen: int, account: str, payee_name: str, payee.identity_type = "ALIPAY_LOGON_ID" payee.name = payee_name model.payee_info = payee + # Keep a deploy-time diagnostic in the server log without exposing the + # recipient account, name, private key, or certificate data. This makes + # it possible to distinguish an old server build from an Alipay rejection. + logger.info( + "Alipay transfer request prepared: scene=%s info_type=%s info_content=%s amount=%s biz_scene=%s product_code=%s", + model.transfer_scene_name, + reward_description.info_type, + reward_description.info_content, + model.trans_amount, + model.biz_scene, + model.product_code, + ) try: request = AlipayFundTransUniTransferRequest(biz_model=model) if settings.alipay_notify_url: @@ -290,7 +311,13 @@ def transfer(*, out_biz_no: str, amount_fen: int, account: str, payee_name: str, raise provider_error = _provider_error_from_exception(exc) if provider_error: + logger.error( + "Alipay transfer rejected: code=%s message=%s", + provider_error.code, + provider_error, + ) raise provider_error from exc + logger.exception("Alipay transfer request failed without a structured provider response") raise AlipayTransferError(f"支付宝转账请求失败:{exc}", ambiguous=True) from exc return { "out_biz_no": response.out_biz_no or out_biz_no,