diff --git a/src/Senparc.Weixin.All/Senparc.Weixin.All.csproj b/src/Senparc.Weixin.All/Senparc.Weixin.All.csproj index 2a9694dea5..0c4bf86def 100644 --- a/src/Senparc.Weixin.All/Senparc.Weixin.All.csproj +++ b/src/Senparc.Weixin.All/Senparc.Weixin.All.csproj @@ -3,7 +3,7 @@ net8.0 enable enable - 2024.10.8 + 2024.10.20 10.0 Senparc.Weixin.All Senparc.Weixin.All @@ -48,7 +48,8 @@ [2024-09-02] v2024.9.2 WxOpen 支持小程序付费能力的用量告警事件 [2024-09-10] v2024.9.10 更新基础库,包括缓存、APM、CO2NET 核心模块等全面升级 [2024-10-08] v2024.10.8 更新基础库,简化 .NET 版本支持 - + [2024-10-20] v2024.10.20 TenPayV3 v1.6.5 修改 SM 证书判断逻辑,向下兼容未升级 appsettings.json 的系统 #3084 感谢 @WXJDLM + https://github.com/JeffreySu/WeiXinMPSDK diff --git a/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/Helpers/SecurityHelper.cs b/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/Helpers/SecurityHelper.cs index 1454d55fe8..fea264bc0f 100644 --- a/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/Helpers/SecurityHelper.cs +++ b/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/Helpers/SecurityHelper.cs @@ -1,4 +1,38 @@ -using Org.BouncyCastle.Crypto.Engines; +#region Apache License Version 2.0 +/*---------------------------------------------------------------- + +Copyright 2024 Jeffrey Su & Suzhou Senparc Network Technology Co.,Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the +License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied. See the License for the specific language governing permissions +and limitations under the License. + +Detail: https://github.com/JeffreySu/WeiXinMPSDK/blob/master/license.md + +----------------------------------------------------------------*/ +#endregion Apache License Version 2.0 + +/*---------------------------------------------------------------- + Copyright (C) 2024 Senparc + + 文件名:SecurityHelper.cs + 文件功能描述:安全帮助类,提供加密解密方法及微信支付要求的安全方法 + + 创建标识:Senparc - 20210822 + + 修改标识:Senparc - 20241020 + 修改描述:v1.6.5 修改 SM 证书判断逻辑,向下兼容未升级 appsettings.json 的系统 #3084 感谢 @WXJDLM + +----------------------------------------------------------------*/ + + +using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Modes; using Org.BouncyCastle.Crypto.Parameters; using Senparc.CO2NET.Helpers; @@ -16,6 +50,9 @@ namespace Senparc.Weixin.TenPayV3.Helpers { + /// + /// 安全帮助类 + /// public class SecurityHelper { /// @@ -48,7 +85,11 @@ public static string GetUnwrapCertKey(string originalPublicKey) /// public static string GetPublicKey(Encrypt_Certificate encryptCertificate, string apiV3Key, string encryptionType) { - if (encryptionType == CertType.RSA.ToString()) + if (encryptionType == CertType.SM.ToString()) + { + return GmHelper.Sm4DecryptGCM(apiV3Key, encryptCertificate.nonce, "certificate", encryptCertificate.ciphertext); + } + else { var buff = Convert.FromBase64String(encryptCertificate.ciphertext); var secret = Encoding.UTF8.GetBytes(apiV3Key); @@ -65,10 +106,6 @@ public static string GetPublicKey(Encrypt_Certificate encryptCertificate, string cipher.DoFinal(data, num); return Encoding.UTF8.GetString(data); } - else - { - return GmHelper.Sm4DecryptGCM(apiV3Key, encryptCertificate.nonce, "certificate", encryptCertificate.ciphertext); - } } /// @@ -80,18 +117,18 @@ public static string GetPublicKey(Encrypt_Certificate encryptCertificate, string /// public static string Encrypt(string text, string publicKey, string encryptionType) { - if (encryptionType == CertType.RSA.ToString()) + if (encryptionType == CertType.SM.ToString()) + { + ECPublicKeyParameters eCPublicKeyParameters = SMPemHelper.LoadPublicKeyToParameters(Encoding.UTF8.GetBytes(publicKey)); + return GmHelper.Sm2Encrypt(eCPublicKeyParameters, text); + } + else { var x509 = new X509Certificate2(Encoding.UTF8.GetBytes(publicKey)); var rsa = x509.GetRSAPublicKey(); var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.OaepSHA1); return Convert.ToBase64String(buff); } - else - { - ECPublicKeyParameters eCPublicKeyParameters = SMPemHelper.LoadPublicKeyToParameters(Encoding.UTF8.GetBytes(publicKey)); - return GmHelper.Sm2Encrypt(eCPublicKeyParameters, text); - } } /// diff --git a/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/HttpHandlers/TenPayNotifyHandler.cs b/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/HttpHandlers/TenPayNotifyHandler.cs index 55c8a4b7e5..085085f691 100644 --- a/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/HttpHandlers/TenPayNotifyHandler.cs +++ b/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/HttpHandlers/TenPayNotifyHandler.cs @@ -32,6 +32,9 @@ and limitations under the License. 修改标识:Senparc - 20240802 修改描述:v1.4.2 完善 SM 相关方法 + 修改标识:Senparc - 20241020 + 修改描述:v1.6.5 修改 SM 证书判断逻辑,向下兼容未升级 appsettings.json 的系统 #3084 感谢 @WXJDLM + ----------------------------------------------------------------*/ using Microsoft.AspNetCore.Http; @@ -163,13 +166,13 @@ public TenPayNotifyHandler(HttpContext httpContext, ISenparcWeixinSettingForTenp // TODO: 本方法持续测试 public async Task DecryptGetObjectAsync(/*string aes_key = null, */string nonce = null, string associated_data = null) where T : ReturnJsonBase, new() { - if (_tenpayV3Setting.EncryptionType == CertType.RSA.ToString()) + if (_tenpayV3Setting.EncryptionType == CertType.SM.ToString()) { - return await AesGcmDecryptGetObjectAsync(nonce, associated_data); + return await Sm4GcmDecryptGetObjectAsync(nonce, associated_data); } else { - return await Sm4GcmDecryptGetObjectAsync(nonce, associated_data); + return await AesGcmDecryptGetObjectAsync(nonce, associated_data); } } } diff --git a/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/Senparc.Weixin.TenPayV3.net8.csproj b/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/Senparc.Weixin.TenPayV3.net8.csproj index 0ccde0d453..198be3c627 100644 --- a/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/Senparc.Weixin.TenPayV3.net8.csproj +++ b/src/Senparc.Weixin.TenPay/Senparc.Weixin.TenPayV3/Senparc.Weixin.TenPayV3.net8.csproj @@ -1,7 +1,7 @@ netstandard2.1 - 1.6.4 + 1.6.5 Senparc.Weixin.TenPayV3 Senparc.Weixin.TenPayV3 10.0 @@ -23,41 +23,42 @@ https://github.com/JeffreySu/WeiXinMPSDK icon.jpg - v0.1.0 创世 - v0.3.500.2 重构加密方法 - v0.3.500.3 修正合单支付的 URL 路径错误 - v0.3.500.4 完成商家券接口、委托营销接口、消费卡接口、支付有礼接口 - v0.5.1 修复PayV3营销工具商户券API - v0.5.6 使用 Senparc.Weixin.Config.TenPayV3Host 提供可配置的 API 域名 - v0.5.7 升级微信支付请求的方法,支持多种加密方式 - v0.6.1 修复 CloseOrderAsync() 参数问题 - v0.6.2.2 修复 TenPayHttpClient 赋值问题 - v0.6.3 添加“发起商家转账API” - v0.6.5 重构 BasePayApis.GetPayApiUrl() 方法 - v0.6.8.2 MarketingApis.ModifyBusifavorStockInformationAsync 方法单独提取参数 stock_id - v0.6.8.3 MarketingApis.ModifyBusifavorStockBudgetAsync 方法单独提取参数 stock_id - v0.6.8.4 修改 week_day 类型为 int[] - v0.6.8.7 优化 TenPayApiResultCode 获取逻辑,修复 TryGetCode() 方法中当匹配不到预设错误信息时,返回 null 的问题 - v0.6.8.8 修复 RefundQueryAsync() URL 问题 - v0.6.8.13 修复验签时 204(NoContent)情况下的异常 - v0.6.8.14 修复 PayScoreApis.QueryServiceOrderAsync() 重复代码 - v0.6.8.15 修复 PayScoreApis.QueryServiceOrderAsync() 参数判断逻辑 - v0.7.0 BasePay 支持服务商模式 - v0.7.1 修复 TradeBillQueryRequestData 默认参数问题 - v0.7.3 新增微信支付 V3 服务商的“经营能力”“资金应用”相关接口 - v0.7.5 TenPayV3Util.GetNoncestr() 弃用 MD5 加密方法 - v0.7.10.4 基础支付参数缺失处理 、JsonIgnore的问题处理 - v0.7.11 - v1.0.0-beta1 - 1、TenPayV3 RefundQueryRequestData.sub_mchid 属性添加 [JsonIgnore] 标签 #2905 - 2、添加小程序发货信息管理服务消息事件 PR#2908 - 3、TenPayV3分账 字段内部加密 PR#2909 - v1.1.0 TenPaySignHelper.GetJsApiUiPackage() 方法添加 senparcWeixinSettingForTenpayV3 参数 - v1.2.1.1 解决微信支付分、完成订单参数可为空的问题 Issue #2989 - v1.4.0 添加:微信支付-发起商家转账入参添加转账场景ID、通知地址;返回结果添加批次状态 / PR #3030 - v1.4.2 完善 SM 相关方法 - v1.6.3 更新支付接口调用过程中的 SM 和 RSA 判断方式 - + v0.1.0 创世 + v0.3.500.2 重构加密方法 + v0.3.500.3 修正合单支付的 URL 路径错误 + v0.3.500.4 完成商家券接口、委托营销接口、消费卡接口、支付有礼接口 + v0.5.1 修复PayV3营销工具商户券API + v0.5.6 使用 Senparc.Weixin.Config.TenPayV3Host 提供可配置的 API 域名 + v0.5.7 升级微信支付请求的方法,支持多种加密方式 + v0.6.1 修复 CloseOrderAsync() 参数问题 + v0.6.2.2 修复 TenPayHttpClient 赋值问题 + v0.6.3 添加“发起商家转账API” + v0.6.5 重构 BasePayApis.GetPayApiUrl() 方法 + v0.6.8.2 MarketingApis.ModifyBusifavorStockInformationAsync 方法单独提取参数 stock_id + v0.6.8.3 MarketingApis.ModifyBusifavorStockBudgetAsync 方法单独提取参数 stock_id + v0.6.8.4 修改 week_day 类型为 int[] + v0.6.8.7 优化 TenPayApiResultCode 获取逻辑,修复 TryGetCode() 方法中当匹配不到预设错误信息时,返回 null 的问题 + v0.6.8.8 修复 RefundQueryAsync() URL 问题 + v0.6.8.13 修复验签时 204(NoContent)情况下的异常 + v0.6.8.14 修复 PayScoreApis.QueryServiceOrderAsync() 重复代码 + v0.6.8.15 修复 PayScoreApis.QueryServiceOrderAsync() 参数判断逻辑 + v0.7.0 BasePay 支持服务商模式 + v0.7.1 修复 TradeBillQueryRequestData 默认参数问题 + v0.7.3 新增微信支付 V3 服务商的“经营能力”“资金应用”相关接口 + v0.7.5 TenPayV3Util.GetNoncestr() 弃用 MD5 加密方法 + v0.7.10.4 基础支付参数缺失处理 、JsonIgnore的问题处理 + v0.7.11 + v1.0.0-beta1 + 1、TenPayV3 RefundQueryRequestData.sub_mchid 属性添加 [JsonIgnore] 标签 #2905 + 2、添加小程序发货信息管理服务消息事件 PR#2908 + 3、TenPayV3分账 字段内部加密 PR#2909 + v1.1.0 TenPaySignHelper.GetJsApiUiPackage() 方法添加 senparcWeixinSettingForTenpayV3 参数 + v1.2.1.1 解决微信支付分、完成订单参数可为空的问题 Issue #2989 + v1.4.0 添加:微信支付-发起商家转账入参添加转账场景ID、通知地址;返回结果添加批次状态 / PR #3030 + v1.4.2 完善 SM 相关方法 + v1.6.3 更新支付接口调用过程中的 SM 和 RSA 判断方式 + v1.6.5 修改 SM 证书判断逻辑,向下兼容未升级 appsettings.json 的系统 #3084 + https://github.com/JeffreySu/WeiXinMPSDK