feat(tenpayv3): 重命名部分参数名

This commit is contained in:
Fu Diwei 2022-01-21 14:41:40 +08:00
parent 215aea8fb8
commit 25bffda684
15 changed files with 93 additions and 56 deletions

View File

@ -45,7 +45,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.BackgroundService
foreach (var certificateModel in response.CertificateList)
{
client.CertificateManager.AddEntry(new CertificateEntry(certificateModel));
client.PlatformCertificateManager.AddEntry(new CertificateEntry(certificateModel));
}
_logger.LogInformation("刷新微信商户平台证书成功。");

View File

@ -35,9 +35,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients.Imple
{
MerchantId = tenpayMerchantConfig.MerchantId,
MerchantV3Secret = tenpayMerchantConfig.SecretV3,
MerchantCertSerialNumber = tenpayMerchantConfig.CertSerialNumber,
MerchantCertPrivateKey = tenpayMerchantConfig.CertPrivateKey,
CertificateManager = _tenpayCertificateManagerFactory.Create(tenpayMerchantConfig.MerchantId),
MerchantCertificateSerialNumber = tenpayMerchantConfig.CertSerialNumber,
MerchantCertificatePrivateKey = tenpayMerchantConfig.CertPrivateKey,
PlatformCertificateManager = _tenpayCertificateManagerFactory.Create(tenpayMerchantConfig.MerchantId),
AutoEncryptRequestSensitiveProperty = true,
AutoDecryptResponseSensitiveProperty = true
};

View File

@ -60,11 +60,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (callbackSignature == null) throw new ArgumentNullException(nameof(callbackSignature));
if (callbackSerialNumber == null) throw new ArgumentNullException(nameof(callbackSerialNumber));
if (client.CertificateManager != null)
if (client.PlatformCertificateManager != null)
{
try
{
var cert = client.CertificateManager.GetEntry(callbackSerialNumber);
var cert = client.PlatformCertificateManager.GetEntry(callbackSerialNumber);
if (!cert.HasValue)
{
error = new Exceptions.WechatTenpayEventVerificationException("Verify signature of event failed, because there is no platform certificate matched the serial number.");

View File

@ -36,7 +36,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
string nonce = Guid.NewGuid().ToString("N");
string package = $"prepay_id={prepayId}";
string sign = Utilities.RSAUtility.SignWithSHA256(
privateKey: client.Credentials.MerchantCertPrivateKey,
privateKey: client.Credentials.MerchantCertificatePrivateKey,
plainText: $"{appId}\n{timestamp}\n{nonce}\n{package}\n"
);
@ -91,7 +91,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
string timestamp = DateTimeOffset.Now.ToLocalTime().ToUnixTimeSeconds().ToString();
string nonce = Guid.NewGuid().ToString("N");
string sign = Utilities.RSAUtility.SignWithSHA256(
privateKey: client.Credentials.MerchantCertPrivateKey,
privateKey: client.Credentials.MerchantCertificatePrivateKey,
plainText: $"{appId}\n{timestamp}\n{nonce}\n{prepayId}\n"
);

View File

@ -35,15 +35,15 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (Constants.EncryptionAlgorithms.RSA_2048_PKCS8_ECB.Equals(attr.Algorithm))
{
if (client.CertificateManager == null)
if (client.PlatformCertificateManager == null)
throw new Exceptions.WechatTenpayRequestEncryptionException("Encrypt request failed, because there is no platform certificate in the manager.");
string certificate;
if (!string.IsNullOrEmpty(request.WechatpayCertSerialNumber))
if (!string.IsNullOrEmpty(request.WechatpayCertificateSerialNumber))
{
// 如果已在请求中指定特定的平台证书序列号,直接从管理器中取值
var cert = client.CertificateManager.GetEntry(request.WechatpayCertSerialNumber!);
var cert = client.PlatformCertificateManager.GetEntry(request.WechatpayCertificateSerialNumber!);
if (!cert.HasValue)
{
throw new Exceptions.WechatTenpayEventVerificationException("Encrypt request failed, because there is no platform certificate matched the serial number.");
@ -54,7 +54,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
else
{
// 如果未在请求中指定特定的平台证书序列号,从管理器中取过期时间最远的
var certs = client.CertificateManager.AllEntries().OrderByDescending(e => e.ExpireTime);
var certs = client.PlatformCertificateManager.AllEntries().OrderByDescending(e => e.ExpireTime);
if (!certs.Any())
{
throw new Exceptions.WechatTenpayEventVerificationException("Encrypt request failed, because there is no platform certificate in the manager.");
@ -62,7 +62,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
var cert = certs.First();
certificate = cert.Certificate;
request.WechatpayCertSerialNumber = cert.SerialNumber;
request.WechatpayCertificateSerialNumber = cert.SerialNumber;
}
string newValue = Utilities.RSAUtility.EncryptWithECBByCertificate(

View File

@ -36,7 +36,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{
if (Constants.EncryptionAlgorithms.AEAD_AES_256_GCM.Equals(certificateModel.EncryptCertificate?.Algorithm))
{
if (string.IsNullOrEmpty(client.Credentials.MerchantCertPrivateKey))
if (string.IsNullOrEmpty(client.Credentials.MerchantCertificatePrivateKey))
throw new Exceptions.WechatTenpayResponseDecryptionException("Decrypt response failed, because there is no merchant private key.");
certificateModel.EncryptCertificate.CipherText = Utilities.AESUtility.DecryptWithGCM(
@ -68,7 +68,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (Constants.EncryptionAlgorithms.RSA_2048_PKCS8_ECB.Equals(attr.Algorithm))
{
string newValue = Utilities.RSAUtility.DecryptWithECB(
privateKey: client.Credentials.MerchantCertPrivateKey,
privateKey: client.Credentials.MerchantCertificatePrivateKey,
cipherText: oldValue
);
return (true, newValue);

View File

@ -40,11 +40,11 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (client == null) throw new ArgumentNullException(nameof(client));
if (response == null) throw new ArgumentNullException(nameof(response));
if (client.CertificateManager != null)
if (client.PlatformCertificateManager != null)
{
try
{
var cert = client.CertificateManager.GetEntry(response.WechatpayCertSerialNumber)!;
var cert = client.PlatformCertificateManager.GetEntry(response.WechatpayCertificateSerialNumber)!;
if (!cert.HasValue)
{
error = new Exceptions.WechatTenpayResponseVerificationException("Verify signature of response failed, because there is no platform certificate matched the serial number.");

View File

@ -15,14 +15,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings
public string MerchantV3Secret { get; }
/// <summary>
/// 初始化客户端时 <see cref="WechatTenpayClientOptions.MerchantCertSerialNumber"/> 的副本。
/// 初始化客户端时 <see cref="WechatTenpayClientOptions.MerchantCertificateSerialNumber"/> 的副本。
/// </summary>
public string MerchantCertSerialNumber { get; }
public string MerchantCertificateSerialNumber { get; }
/// <summary>
/// 初始化客户端时 <see cref="WechatTenpayClientOptions.MerchantCertPrivateKey"/> 的副本。
/// 初始化客户端时 <see cref="WechatTenpayClientOptions.MerchantCertificatePrivateKey"/> 的副本。
/// </summary>
public string MerchantCertPrivateKey { get; }
public string MerchantCertificatePrivateKey { get; }
internal Credentials(WechatTenpayClientOptions options)
{
@ -30,8 +30,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings
MerchantId = options.MerchantId;
MerchantV3Secret = options.MerchantV3Secret;
MerchantCertSerialNumber = options.MerchantCertSerialNumber;
MerchantCertPrivateKey = options.MerchantCertPrivateKey;
MerchantCertificateSerialNumber = options.MerchantCertificateSerialNumber;
MerchantCertificatePrivateKey = options.MerchantCertificatePrivateKey;
}
}
}

View File

@ -14,14 +14,14 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
public class WechatTenpayClient : CommonClientBase, ICommonClient
{
/// <summary>
/// 获取当前客户端使用的微信商户平台凭证。
/// 获取当前客户端使用的微信支付商户凭证。
/// </summary>
public Settings.Credentials Credentials { get; }
/// <summary>
/// 获取当前客户端使用的微信商户平台证书管理器。
/// 获取当前客户端使用的微信支付平台证书管理器。
/// </summary>
public Settings.CertificateManager CertificateManager { get; }
public Settings.CertificateManager PlatformCertificateManager { get; }
/// <summary>
/// 获取是否自动加密请求中的敏感信息字段。
@ -42,7 +42,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
if (options == null) throw new ArgumentNullException(nameof(options));
Credentials = new Settings.Credentials(options);
CertificateManager = options.CertificateManager;
PlatformCertificateManager = options.PlatformCertificateManager;
AutoEncryptRequestSensitiveProperty = options.AutoEncryptRequestSensitiveProperty;
AutoDecryptResponseSensitiveProperty = options.AutoDecryptResponseSensitiveProperty;
@ -58,8 +58,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
Interceptors.Add(new Interceptors.WechatTenpaySignInterceptor(
scheme: options.SignAlgorithm,
mchId: options.MerchantId,
mchCertSn: options.MerchantCertSerialNumber,
mchCertPk: options.MerchantCertPrivateKey
mchCertSn: options.MerchantCertificateSerialNumber,
mchCertPk: options.MerchantCertificatePrivateKey
));
}
@ -84,10 +84,10 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
flurlRequest.WithTimeout(TimeSpan.FromMilliseconds(request.Timeout.Value));
}
if (request.WechatpayCertSerialNumber != null)
if (request.WechatpayCertificateSerialNumber != null)
{
flurlRequest.Headers.Remove("Wechatpay-Serial");
flurlRequest.WithHeader("Wechatpay-Serial", request.WechatpayCertSerialNumber);
flurlRequest.WithHeader("Wechatpay-Serial", request.WechatpayCertificateSerialNumber);
}
return flurlRequest;
@ -161,7 +161,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
result.WechatpayNonce = flurlResponse.Headers.GetAll("Wechatpay-Nonce").FirstOrDefault() ?? string.Empty;
result.WechatpayTimestamp = flurlResponse.Headers.GetAll("Wechatpay-Timestamp").FirstOrDefault() ?? string.Empty;
result.WechatpaySignature = flurlResponse.Headers.GetAll("Wechatpay-Signature").FirstOrDefault() ?? string.Empty;
result.WechatpayCertSerialNumber = flurlResponse.Headers.GetAll("Wechatpay-Serial").FirstOrDefault() ?? string.Empty;
result.WechatpayCertificateSerialNumber = flurlResponse.Headers.GetAll("Wechatpay-Serial").FirstOrDefault() ?? string.Empty;
if (AutoDecryptResponseSensitiveProperty && result.IsSuccessful())
{

View File

@ -39,24 +39,36 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
public string SignAlgorithm { get; set; } = Constants.SignAlgorithms.WECHATPAY2_SHA256_RSA2048;
/// <summary>
/// 获取或设置微信商户号。
/// 获取或设置微信支付商户号。
/// </summary>
public string MerchantId { get; set; } = default!;
/// <summary>
/// 获取或设置微信商户 API v3 密钥(注意与 API 密钥相区分)。
/// 获取或设置微信支付商户 API v3 密钥(注意与 API 密钥相区分)。
/// </summary>
public string MerchantV3Secret { get; set; } = default!;
/// <summary>
/// 获取或设置微信商户 API 证书序列号。
/// <i>(本参数已废弃,请使用 <see cref="MerchantCertificateSerialNumber"/> 参数)</i>
/// </summary>
public string MerchantCertSerialNumber { get; set; } = default!;
[Obsolete("本参数已废弃,请使用 `MerchantCertificateSerialNumber` 参数")]
public string MerchantCertSerialNumber { get { return MerchantCertificateSerialNumber; } set { MerchantCertificateSerialNumber = value; } }
/// <summary>
/// 获取或设置微信商户 API 证书私钥
/// 获取或设置微信支付商户 API 证书序列号
/// </summary>
public string MerchantCertPrivateKey { get; set; } = default!;
public string MerchantCertificateSerialNumber { get; set; } = default!;
/// <summary>
/// <i>(本参数已废弃,请使用 <see cref="MerchantCertificatePrivateKey"/> 参数)</i>
/// </summary>
[Obsolete("本参数已废弃,请使用 `MerchantCertificatePrivateKey` 参数")]
public string MerchantCertPrivateKey { get { return MerchantCertificatePrivateKey; } set { MerchantCertificatePrivateKey = value; } }
/// <summary>
/// 获取或设置微信支付商户 API 证书私钥(通常为 `apiclient_key.pem` 文件内容)。
/// </summary>
public string MerchantCertificatePrivateKey { get; set; } = default!;
/// <summary>
/// 获取或设置是否自动加密请求中的敏感字段数据。
@ -69,9 +81,15 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
public bool AutoDecryptResponseSensitiveProperty { get; set; }
/// <summary>
/// 获取或设置微信商户平台证书管理器。
/// <i>(本参数已废弃,请使用 <see cref="PlatformCertificateManager"/> 参数)</i>
/// </summary>
[Obsolete("本参数已废弃,请使用 `PlatformCertificateManager` 参数")]
public Settings.CertificateManager CertificateManager { get { return PlatformCertificateManager; } set { PlatformCertificateManager = value; } }
/// <summary>
/// 获取或设置微信支付平台证书管理器。
/// <para>默认值:<see cref="Settings.InMemoryCertificateManager"/></para>
/// </summary>
public Settings.CertificateManager CertificateManager { get; set; } = new Settings.InMemoryCertificateManager();
public Settings.CertificateManager PlatformCertificateManager { get; set; } = new Settings.InMemoryCertificateManager();
}
}

View File

@ -1,4 +1,6 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
using System;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{
/// <summary>
/// 表示微信支付 API 请求的基类。
@ -12,11 +14,19 @@
[System.Text.Json.Serialization.JsonIgnore]
public virtual int? Timeout { get; set; }
/// <summary>
/// <i>(本参数已废弃,请使用 <see cref="WechatpayCertificateSerialNumber"/> 参数)</i>
/// </summary>
[Obsolete("本参数已废弃,请使用 `WechatpayCertificateSerialNumber` 参数")]
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string? WechatpayCertSerialNumber { get { return WechatpayCertificateSerialNumber; } set { WechatpayCertificateSerialNumber = value; } }
/// <summary>
/// 获取或设置微信请求使用的微信支付平台证书序列号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public virtual string? WechatpayCertSerialNumber { get; set; }
public virtual string? WechatpayCertificateSerialNumber { get; set; }
}
}

View File

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{
@ -83,12 +84,20 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
[System.Text.Json.Serialization.JsonIgnore]
public string WechatpaySignature { get; internal set; } = default!;
/// <summary>
/// <i>(本参数已废弃,请使用 <see cref="WechatpayCertificateSerialNumber"/> 参数)</i>
/// </summary>
[Obsolete("本参数已废弃,请使用 `WechatpayCertificateSerialNumber` 参数")]
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string WechatpayCertSerialNumber { get { return WechatpayCertificateSerialNumber; } set { WechatpayCertificateSerialNumber = value; } }
/// <summary>
/// 获取微信应答签名使用的微信支付平台证书序列号。
/// </summary>
[Newtonsoft.Json.JsonIgnore]
[System.Text.Json.Serialization.JsonIgnore]
public string WechatpayCertSerialNumber { get; internal set; } = default!;
public string WechatpayCertificateSerialNumber { get; internal set; } = default!;
/// <summary>
/// 获取微信支付 API 返回的错误码。

View File

@ -21,7 +21,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
));
return new WechatTenpayClient(new WechatTenpayClientOptions()
{
CertificateManager = certManager
PlatformCertificateManager = certManager
});
}, isThreadSafe: false);
@ -35,7 +35,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
};
var data = MockClientInstance.Value.EncryptRequestSensitiveProperty(mock);
Assert.Equal(RSA_CERTSN, data.WechatpayCertSerialNumber);
Assert.Equal(RSA_CERTSN, data.WechatpayCertificateSerialNumber);
Assert.Equal(MockText, data.Account);
Assert.Equal(MockText, Utilities.RSAUtility.DecryptWithECB(RSA_PRIVATE_KEY, data.Name!));
}
@ -56,7 +56,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
};
var data = MockClientInstance.Value.EncryptRequestSensitiveProperty(mock);
Assert.Equal(RSA_CERTSN, data.WechatpayCertSerialNumber);
Assert.Equal(RSA_CERTSN, data.WechatpayCertificateSerialNumber);
Assert.Equal(MockText, data.ReceiverList[0].Account);
Assert.Equal(MockText, Utilities.RSAUtility.DecryptWithECB(RSA_PRIVATE_KEY, data.ReceiverList[0].Name!));
}

View File

@ -15,7 +15,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
{
return new WechatTenpayClient(new WechatTenpayClientOptions()
{
MerchantCertPrivateKey = RSA_PRIVATE_KEY
MerchantCertificatePrivateKey = RSA_PRIVATE_KEY
});
}, isThreadSafe: false);
@ -26,8 +26,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
{
MerchantId = TestConfigs.WechatMerchantId,
MerchantV3Secret = TestConfigs.WechatMerchantSecret,
MerchantCertSerialNumber = TestConfigs.WechatMerchantCertSerialNumber,
MerchantCertPrivateKey = TestConfigs.WechatMerchantCertPrivateKey,
MerchantCertificateSerialNumber = TestConfigs.WechatMerchantCertSerialNumber,
MerchantCertificatePrivateKey = TestConfigs.WechatMerchantCertPrivateKey,
AutoEncryptRequestSensitiveProperty = true,
AutoDecryptResponseSensitiveProperty = true
});
@ -39,8 +39,8 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
{
MerchantId = TestConfigs.WechatMerchantId,
MerchantV3Secret = TestConfigs.WechatMerchantSecret,
MerchantCertSerialNumber = TestConfigs.WechatMerchantCertSerialNumber,
MerchantCertPrivateKey = TestConfigs.WechatMerchantCertPrivateKey,
MerchantCertificateSerialNumber = TestConfigs.WechatMerchantCertSerialNumber,
MerchantCertificatePrivateKey = TestConfigs.WechatMerchantCertPrivateKey,
AutoEncryptRequestSensitiveProperty = false,
AutoDecryptResponseSensitiveProperty = false
});

View File

@ -11,9 +11,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
{
MerchantId = TestConfigs.WechatMerchantId,
MerchantV3Secret = TestConfigs.WechatMerchantSecret,
MerchantCertSerialNumber = TestConfigs.WechatMerchantCertSerialNumber,
MerchantCertPrivateKey = TestConfigs.WechatMerchantCertPrivateKey,
CertificateManager = certificateManager
MerchantCertificateSerialNumber = TestConfigs.WechatMerchantCertSerialNumber,
MerchantCertificatePrivateKey = TestConfigs.WechatMerchantCertPrivateKey,
PlatformCertificateManager = certificateManager
});
}
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.UnitTests
response = Instance.DecryptResponseSensitiveProperty(response);
foreach (var certificateModel in response.CertificateList)
{
Instance.CertificateManager.AddEntry(new Settings.CertificateEntry(certificateModel));
Instance.PlatformCertificateManager.AddEntry(new Settings.CertificateEntry(certificateModel));
}
}