This commit is contained in:
2026-06-12 11:08:47 +08:00
parent b9a2bd5bef
commit 20a0348743
2 changed files with 47 additions and 8 deletions
+31 -4
View File
@@ -211,6 +211,28 @@ _alipay_client = None
_alipay_client_app_id = None
def _format_alipay_key(key: str) -> str:
"""
格式化支付宝密钥,移除PEM头部和尾部,并清理所有空白字符。
"""
if not key:
return ""
# 移除首尾空白
key = key.strip()
# 移除 PEM 头部和尾部
key = key.replace("-----BEGIN RSA PRIVATE KEY-----", "")
key = key.replace("-----BEGIN PRIVATE KEY-----", "")
key = key.replace("-----END RSA PRIVATE KEY-----", "")
key = key.replace("-----END PRIVATE KEY-----", "")
key = key.replace("-----BEGIN PUBLIC KEY-----", "")
key = key.replace("-----END PUBLIC KEY-----", "")
key = key.replace("-----BEGIN ALIPAY PUBLIC KEY-----", "")
key = key.replace("-----END ALIPAY PUBLIC KEY-----", "")
# 移除所有空白字符(换行、空格、制表符等)
key = "".join(key.split())
return key
def _get_alipay_client(app_id: str, private_key: str, public_key: str, gateway: str = ""):
"""Get or create an Alipay client. Recreated if app_id changes."""
global _alipay_client, _alipay_client_app_id
@@ -228,18 +250,23 @@ def _get_alipay_client(app_id: str, private_key: str, public_key: str, gateway:
)
return None
# 格式化私钥和公钥
formatted_private_key = _format_alipay_key(private_key)
formatted_public_key = _format_alipay_key(public_key)
config = AlipayClientConfig()
config.server_url = gateway or "https://openapi.alipay.com/gateway.do"
config.app_id = app_id
config.app_private_key = private_key
config.alipay_public_key = public_key
config.app_private_key = formatted_private_key
config.alipay_public_key = formatted_public_key
config.sign_type = "RSA2"
config.charset = "utf-8"
try:
_alipay_client = DefaultAlipayClient(config, logger)
_alipay_client_app_id = app_id
except Exception:
logger.info("Alipay client initialized successfully")
except Exception as e:
logger.exception("Failed to initialize Alipay client")
_alipay_client = None
_alipay_client_app_id = None
@@ -505,7 +532,7 @@ async def _close_wechat_order(db: AsyncSession, order: PaymentOrder, db_configs:
try:
code, result = client.close(out_trade_no=order.order_no)
if code == 200:
if code == 204:
logger.info(f"WeChat order closed: order_no={order.order_no}")
return True
else: