From dfc352a64a836a788eec21bdb5a8e3a730cb62b5 Mon Sep 17 00:00:00 2001 From: zpc Date: Sat, 24 Jan 2026 19:51:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B9=E4=B8=BA=E4=BC=98=E5=85=88?= =?UTF-8?q?=E4=BB=8E=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=A7=81=E9=92=A5=EF=BC=8C=E6=8F=90=E9=AB=98?= =?UTF-8?q?=E5=8F=AF=E9=9D=A0=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WeChat/WeChatService.cs | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/server/src/XiangYi.Infrastructure/WeChat/WeChatService.cs b/server/src/XiangYi.Infrastructure/WeChat/WeChatService.cs index dcf13bd..62cc0aa 100644 --- a/server/src/XiangYi.Infrastructure/WeChat/WeChatService.cs +++ b/server/src/XiangYi.Infrastructure/WeChat/WeChatService.cs @@ -430,9 +430,34 @@ public class WeChatService : IWeChatService private string SignWithPrivateKey(string message) { using var rsa = RSA.Create(); - // 处理 JSON 中转义的换行符 - var privateKey = _options.Pay.PrivateKey.Replace("\\n", "\n"); - rsa.ImportFromPem(privateKey); + + // 优先从文件读取,如果文件不存在则从配置读取 + string privateKeyPem; + if (!string.IsNullOrEmpty(_options.Pay.PrivateKey) && _options.Pay.PrivateKey.StartsWith("-----BEGIN")) + { + // 从配置中读取,处理转义的换行符 + privateKeyPem = _options.Pay.PrivateKey.Replace("\\n", "\n"); + } + else + { + // 从文件读取 + var keyPath = Path.Combine(AppContext.BaseDirectory, "apiclient_key.pem"); + if (!File.Exists(keyPath)) + { + throw new FileNotFoundException($"私钥文件不存在: {keyPath}"); + } + privateKeyPem = File.ReadAllText(keyPath); + } + + try + { + rsa.ImportFromPem(privateKeyPem.AsSpan()); + } + catch (Exception ex) + { + _logger.LogError(ex, "导入私钥失败,私钥内容长度: {Length}", privateKeyPem.Length); + throw; + } var data = Encoding.UTF8.GetBytes(message); var signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);