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