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

@@ -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 返回的错误码。