feat(tenpayv3): WechatTenpayGlobalClient 不再继承自 WechatTenpayClient

This commit is contained in:
Fu Diwei 2025-07-12 12:48:32 +08:00
parent 827a32ee0b
commit acdc13a8cf
12 changed files with 101 additions and 61 deletions

View File

@ -0,0 +1,9 @@
using System.Reflection;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Constants
{
internal class AssemblyProps
{
public static readonly string VERSION = Assembly.GetAssembly(typeof(AssemblyProps))!.GetName()!.Version!.ToString();
}
}

View File

@ -28,7 +28,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
public static T DecryptEventResource<T>(this WechatTenpayGlobalClient client, WechatTenpayGlobalEvent webhookEvent) public static T DecryptEventResource<T>(this WechatTenpayGlobalClient client, WechatTenpayGlobalEvent webhookEvent)
where T : WechatTenpayGlobalEvent.Types.IDecryptedResource, new() where T : WechatTenpayGlobalEvent.Types.IDecryptedResource, new()
{ {
return WechatTenpayClientEventDecryptionExtensions.DecryptEventResource<T>(client, webhookEvent.Resource); return WechatTenpayClientEventDecryptionExtensions.DecryptEventResource<T>(client.ProxyClient, webhookEvent.Resource);
} }
/// <summary> /// <summary>
@ -41,7 +41,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
public static T DecryptEventResource<T>(this WechatTenpayGlobalClient client, WechatTenpayGlobalEvent.Types.Resource webhookEventResource) public static T DecryptEventResource<T>(this WechatTenpayGlobalClient client, WechatTenpayGlobalEvent.Types.Resource webhookEventResource)
where T : WechatTenpayGlobalEvent.Types.IDecryptedResource, new() where T : WechatTenpayGlobalEvent.Types.IDecryptedResource, new()
{ {
return WechatTenpayClientEventDecryptionExtensions.DecryptEventResource<T>(client, webhookEventResource); return WechatTenpayClientEventDecryptionExtensions.DecryptEventResource<T>(client.ProxyClient, webhookEventResource);
} }
} }
} }

View File

@ -23,7 +23,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static ErroredResult VerifyEventSignature(this WechatTenpayGlobalClient client, string webhookTimestamp, string webhookNonce, string webhookBody, string webhookSignature, string webhookSerialNumber) public static ErroredResult VerifyEventSignature(this WechatTenpayGlobalClient client, string webhookTimestamp, string webhookNonce, string webhookBody, string webhookSignature, string webhookSerialNumber)
{ {
return WechatTenpayClientEventVerificationExtensions.VerifyEventSignature(client, webhookTimestamp, webhookNonce, webhookBody, webhookSignature, webhookSerialNumber); return WechatTenpayClientEventVerificationExtensions.VerifyEventSignature(client.ProxyClient, webhookTimestamp, webhookNonce, webhookBody, webhookSignature, webhookSerialNumber);
} }
/// <summary> /// <summary>
@ -43,7 +43,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static ErroredResult VerifyEventSignature(this WechatTenpayGlobalClient client, string webhookTimestamp, string webhookNonce, string webhookBody, string webhookSignature, string webhookSignatureType, string webhookSerialNumber) public static ErroredResult VerifyEventSignature(this WechatTenpayGlobalClient client, string webhookTimestamp, string webhookNonce, string webhookBody, string webhookSignature, string webhookSignatureType, string webhookSerialNumber)
{ {
return WechatTenpayClientEventVerificationExtensions.VerifyEventSignature(client, webhookTimestamp, webhookNonce, webhookBody, webhookSignature, webhookSignatureType, webhookSerialNumber); return WechatTenpayClientEventVerificationExtensions.VerifyEventSignature(client.ProxyClient, webhookTimestamp, webhookNonce, webhookBody, webhookSignature, webhookSignatureType, webhookSerialNumber);
} }
/// <summary> /// <summary>
@ -63,7 +63,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static Task<ErroredResult> VerifyEventSignatureAsync(this WechatTenpayGlobalClient client, string webhookTimestamp, string webhookNonce, string webhookBody, string webhookSignature, string webhookSerialNumber, CancellationToken cancellationToken = default) public static Task<ErroredResult> VerifyEventSignatureAsync(this WechatTenpayGlobalClient client, string webhookTimestamp, string webhookNonce, string webhookBody, string webhookSignature, string webhookSerialNumber, CancellationToken cancellationToken = default)
{ {
return WechatTenpayClientEventVerificationExtensions.VerifyEventSignatureAsync(client, webhookTimestamp, webhookNonce, webhookBody, webhookSignature, webhookSerialNumber, cancellationToken); return WechatTenpayClientEventVerificationExtensions.VerifyEventSignatureAsync(client.ProxyClient, webhookTimestamp, webhookNonce, webhookBody, webhookSignature, webhookSerialNumber, cancellationToken);
} }
/// <summary> /// <summary>
@ -84,7 +84,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static Task<ErroredResult> VerifyEventSignatureAsync(this WechatTenpayGlobalClient client, string webhookTimestamp, string webhookNonce, string webhookBody, string webhookSignature, string webhookSignatureType, string webhookSerialNumber, CancellationToken cancellationToken = default) public static Task<ErroredResult> VerifyEventSignatureAsync(this WechatTenpayGlobalClient client, string webhookTimestamp, string webhookNonce, string webhookBody, string webhookSignature, string webhookSignatureType, string webhookSerialNumber, CancellationToken cancellationToken = default)
{ {
return WechatTenpayClientEventVerificationExtensions.VerifyEventSignatureAsync(client, webhookTimestamp, webhookNonce, webhookBody, webhookSignature, webhookSignatureType, webhookSerialNumber, cancellationToken); return WechatTenpayClientEventVerificationExtensions.VerifyEventSignatureAsync(client.ProxyClient, webhookTimestamp, webhookNonce, webhookBody, webhookSignature, webhookSignatureType, webhookSerialNumber, cancellationToken);
} }
} }
} }

View File

@ -30,7 +30,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (client is null) throw new ArgumentNullException(nameof(client)); if (client is null) throw new ArgumentNullException(nameof(client));
if (request is null) throw new ArgumentNullException(nameof(request)); if (request is null) throw new ArgumentNullException(nameof(request));
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Get, "certificates"); .CreateFlurlRequest(request, HttpMethod.Get, "certificates");
return await client.SendFlurlRequestAsJsonAsync<Models.QueryCertificatesResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.SendFlurlRequestAsJsonAsync<Models.QueryCertificatesResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);

View File

@ -30,7 +30,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "app"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "app");
return await ((WechatTenpayClient)client).SendFlurlRequestAsJsonAsync<Models.CreatePartnerTransactionAppResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.ProxyClient.SendFlurlRequestAsJsonAsync<Models.CreatePartnerTransactionAppResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -81,7 +81,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "jsapi"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "jsapi");
return await ((WechatTenpayClient)client).SendFlurlRequestAsJsonAsync<Models.CreatePartnerTransactionJsapiResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.ProxyClient.SendFlurlRequestAsJsonAsync<Models.CreatePartnerTransactionJsapiResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -106,7 +106,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "native"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "native");
return await ((WechatTenpayClient)client).SendFlurlRequestAsJsonAsync<Models.CreatePartnerTransactionNativeResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.ProxyClient.SendFlurlRequestAsJsonAsync<Models.CreatePartnerTransactionNativeResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -158,7 +158,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (request.MerchantId is null) if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId; request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Get, "transactions", "out-trade-no", request.OutTradeNumber) .CreateFlurlRequest(request, HttpMethod.Get, "transactions", "out-trade-no", request.OutTradeNumber)
.SetQueryParam("sp_mchid", request.MerchantId) .SetQueryParam("sp_mchid", request.MerchantId)
.SetQueryParam("sub_mchid", request.SubMerchantId); .SetQueryParam("sub_mchid", request.SubMerchantId);
@ -190,7 +190,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (request.MerchantId is null) if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId; request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Get, "transactions", "id", request.TransactionId) .CreateFlurlRequest(request, HttpMethod.Get, "transactions", "id", request.TransactionId)
.SetQueryParam("sp_mchid", request.MerchantId) .SetQueryParam("sp_mchid", request.MerchantId)
.SetQueryParam("sub_mchid", request.SubMerchantId); .SetQueryParam("sub_mchid", request.SubMerchantId);
@ -221,7 +221,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (request.MerchantId is null) if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId; request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "close"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "close");
return await client.SendFlurlRequestAsJsonAsync<Models.ClosePartnerTransactionResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.SendFlurlRequestAsJsonAsync<Models.ClosePartnerTransactionResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
@ -246,7 +246,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (request.MerchantId is null) if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId; request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "reverse") .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "reverse")
.SetQueryParam("sp_mchid", request.MerchantId) .SetQueryParam("sp_mchid", request.MerchantId)
.SetQueryParam("sub_mchid", request.SubMerchantId); .SetQueryParam("sub_mchid", request.SubMerchantId);

View File

@ -30,7 +30,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "app"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "app");
return await ((WechatTenpayClient)client).SendFlurlRequestAsJsonAsync<Models.CreateTransactionAppResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.ProxyClient.SendFlurlRequestAsJsonAsync<Models.CreateTransactionAppResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -55,7 +55,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "mweb"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "mweb");
return await ((WechatTenpayClient)client).SendFlurlRequestAsJsonAsync<Models.CreateTransactionMWebResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.ProxyClient.SendFlurlRequestAsJsonAsync<Models.CreateTransactionMWebResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -81,7 +81,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "jsapi"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "jsapi");
return await ((WechatTenpayClient)client).SendFlurlRequestAsJsonAsync<Models.CreateTransactionJsapiResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.ProxyClient.SendFlurlRequestAsJsonAsync<Models.CreateTransactionJsapiResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -106,7 +106,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "native"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "native");
return await ((WechatTenpayClient)client).SendFlurlRequestAsJsonAsync<Models.CreateTransactionNativeResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.ProxyClient.SendFlurlRequestAsJsonAsync<Models.CreateTransactionNativeResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -158,7 +158,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (request.MerchantId is null) if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId; request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Get, "transactions", "out-trade-no", request.OutTradeNumber) .CreateFlurlRequest(request, HttpMethod.Get, "transactions", "out-trade-no", request.OutTradeNumber)
.SetQueryParam("mchid", request.MerchantId); .SetQueryParam("mchid", request.MerchantId);
@ -189,7 +189,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (request.MerchantId is null) if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId; request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Get, "transactions", "id", request.TransactionId) .CreateFlurlRequest(request, HttpMethod.Get, "transactions", "id", request.TransactionId)
.SetQueryParam("mchid", request.MerchantId); .SetQueryParam("mchid", request.MerchantId);
@ -219,7 +219,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (request.MerchantId is null) if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId; request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "close"); .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "close");
return await client.SendFlurlRequestAsJsonAsync<Models.CloseTransactionResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false); return await client.SendFlurlRequestAsJsonAsync<Models.CloseTransactionResponse>(flurlReq, data: request, cancellationToken: cancellationToken).ConfigureAwait(false);
@ -244,7 +244,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
if (request.MerchantId is null) if (request.MerchantId is null)
request.MerchantId = client.Credentials.MerchantId; request.MerchantId = client.Credentials.MerchantId;
IFlurlRequest flurlReq = client IFlurlRequest flurlReq = client.ProxyClient
.CreateFlurlRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "reverse") .CreateFlurlRequest(request, HttpMethod.Post, "transactions", "out-trade-no", request.OutTradeNumber, "reverse")
.SetQueryParam("mchid", request.MerchantId); .SetQueryParam("mchid", request.MerchantId);

View File

@ -18,7 +18,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static IDictionary<string, string> GenerateParametersForJsapiPayRequest(this WechatTenpayGlobalClient client, string appId, string prepayId) public static IDictionary<string, string> GenerateParametersForJsapiPayRequest(this WechatTenpayGlobalClient client, string appId, string prepayId)
{ {
return WechatTenpayClientParameterExtensions.GenerateParametersForJsapiPayRequest(client, appId, prepayId); return WechatTenpayClientParameterExtensions.GenerateParametersForJsapiPayRequest(client.ProxyClient, appId, prepayId);
} }
/// <summary> /// <summary>
@ -34,7 +34,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static IDictionary<string, string> GenerateParametersForAppPayRequest(this WechatTenpayGlobalClient client, string appId, string prepayId) public static IDictionary<string, string> GenerateParametersForAppPayRequest(this WechatTenpayGlobalClient client, string appId, string prepayId)
{ {
return WechatTenpayClientParameterExtensions.GenerateParametersForAppPayRequest(client, appId, prepayId); return WechatTenpayClientParameterExtensions.GenerateParametersForAppPayRequest(client.ProxyClient, appId, prepayId);
} }
/// <summary> /// <summary>
@ -51,7 +51,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static IDictionary<string, string> GenerateParametersForAppPayRequest(this WechatTenpayGlobalClient client, string merchantId, string appId, string prepayId) public static IDictionary<string, string> GenerateParametersForAppPayRequest(this WechatTenpayGlobalClient client, string merchantId, string appId, string prepayId)
{ {
return WechatTenpayClientParameterExtensions.GenerateParametersForAppPayRequest(client, merchantId, appId, prepayId); return WechatTenpayClientParameterExtensions.GenerateParametersForAppPayRequest(client.ProxyClient, merchantId, appId, prepayId);
} }
} }
} }

View File

@ -14,7 +14,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
public static TRequest EncryptRequestSensitiveProperty<TRequest>(this WechatTenpayGlobalClient client, TRequest request) public static TRequest EncryptRequestSensitiveProperty<TRequest>(this WechatTenpayGlobalClient client, TRequest request)
where TRequest : WechatTenpayGlobalRequest where TRequest : WechatTenpayGlobalRequest
{ {
return WechatTenpayClientRequestEncryptionExtensions.EncryptRequestSensitiveProperty<TRequest>(client, request); return WechatTenpayClientRequestEncryptionExtensions.EncryptRequestSensitiveProperty<TRequest>(client.ProxyClient, request);
} }
/// <summary> /// <summary>
@ -27,7 +27,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
public static Task<TRequest> EncryptRequestSensitivePropertyAsync<TRequest>(this WechatTenpayGlobalClient client, TRequest request, CancellationToken cancellationToken = default) public static Task<TRequest> EncryptRequestSensitivePropertyAsync<TRequest>(this WechatTenpayGlobalClient client, TRequest request, CancellationToken cancellationToken = default)
where TRequest : WechatTenpayGlobalRequest where TRequest : WechatTenpayGlobalRequest
{ {
return WechatTenpayClientRequestEncryptionExtensions.EncryptRequestSensitivePropertyAsync<TRequest>(client, request, cancellationToken); return WechatTenpayClientRequestEncryptionExtensions.EncryptRequestSensitivePropertyAsync<TRequest>(client.ProxyClient, request, cancellationToken);
} }
} }
} }

View File

@ -69,7 +69,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
return (DecryptResponseSensitiveProperty(client, queryCertificatesResponse) as TResponse)!; return (DecryptResponseSensitiveProperty(client, queryCertificatesResponse) as TResponse)!;
} }
return WechatTenpayClientResponseDecryptionExtensions.DecryptResponseSensitiveProperty(client, response); return WechatTenpayClientResponseDecryptionExtensions.DecryptResponseSensitiveProperty(client.ProxyClient, response);
} }
} }
} }

View File

@ -21,7 +21,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
public static ErroredResult VerifyResponseSignature<TResponse>(this WechatTenpayGlobalClient client, TResponse response) public static ErroredResult VerifyResponseSignature<TResponse>(this WechatTenpayGlobalClient client, TResponse response)
where TResponse : WechatTenpayGlobalResponse where TResponse : WechatTenpayGlobalResponse
{ {
return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignature(client, response); return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignature(client.ProxyClient, response);
} }
/// <summary> /// <summary>
@ -40,7 +40,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static ErroredResult VerifyResponseSignature(this WechatTenpayGlobalClient client, string responseTimestamp, string responseNonce, string responseBody, string responseSignature, string responseSerialNumber) public static ErroredResult VerifyResponseSignature(this WechatTenpayGlobalClient client, string responseTimestamp, string responseNonce, string responseBody, string responseSignature, string responseSerialNumber)
{ {
return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignature(client, responseTimestamp, responseNonce, responseBody, responseSignature, responseSerialNumber); return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignature(client.ProxyClient, responseTimestamp, responseNonce, responseBody, responseSignature, responseSerialNumber);
} }
/// <summary> /// <summary>
@ -60,7 +60,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static ErroredResult VerifyResponseSignature(this WechatTenpayGlobalClient client, string responseTimestamp, string responseNonce, string responseBody, string responseSignature, string responseSignatureType, string responseSerialNumber) public static ErroredResult VerifyResponseSignature(this WechatTenpayGlobalClient client, string responseTimestamp, string responseNonce, string responseBody, string responseSignature, string responseSignatureType, string responseSerialNumber)
{ {
return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignature(client, responseTimestamp, responseNonce, responseBody, responseSignature, responseSignatureType, responseSerialNumber); return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignature(client.ProxyClient, responseTimestamp, responseNonce, responseBody, responseSignature, responseSignatureType, responseSerialNumber);
} }
/// <summary> /// <summary>
@ -78,7 +78,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
public static Task<ErroredResult> VerifyResponseSignatureAsync<TResponse>(this WechatTenpayGlobalClient client, TResponse response, CancellationToken cancellationToken = default) public static Task<ErroredResult> VerifyResponseSignatureAsync<TResponse>(this WechatTenpayGlobalClient client, TResponse response, CancellationToken cancellationToken = default)
where TResponse : WechatTenpayGlobalResponse where TResponse : WechatTenpayGlobalResponse
{ {
return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignatureAsync(client, response, cancellationToken); return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignatureAsync(client.ProxyClient, response, cancellationToken);
} }
/// <summary> /// <summary>
@ -98,7 +98,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static Task<ErroredResult> VerifyResponseSignatureAsync(this WechatTenpayGlobalClient client, string responseTimestamp, string responseNonce, string responseBody, string responseSignature, string responseSerialNumber, CancellationToken cancellationToken = default) public static Task<ErroredResult> VerifyResponseSignatureAsync(this WechatTenpayGlobalClient client, string responseTimestamp, string responseNonce, string responseBody, string responseSignature, string responseSerialNumber, CancellationToken cancellationToken = default)
{ {
return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignatureAsync(client, responseTimestamp, responseNonce, responseBody, responseSignature, responseSerialNumber, cancellationToken); return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignatureAsync(client.ProxyClient, responseTimestamp, responseNonce, responseBody, responseSignature, responseSerialNumber, cancellationToken);
} }
/// <summary> /// <summary>
@ -119,7 +119,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <returns></returns> /// <returns></returns>
public static Task<ErroredResult> VerifyResponseSignatureAsync(this WechatTenpayGlobalClient client, string responseTimestamp, string responseNonce, string responseBody, string responseSignature, string responseSignatureType, string responseSerialNumber, CancellationToken cancellationToken = default) public static Task<ErroredResult> VerifyResponseSignatureAsync(this WechatTenpayGlobalClient client, string responseTimestamp, string responseNonce, string responseBody, string responseSignature, string responseSignatureType, string responseSerialNumber, CancellationToken cancellationToken = default)
{ {
return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignatureAsync(client, responseTimestamp, responseNonce, responseBody, responseSignature, responseSignatureType, responseSerialNumber, cancellationToken); return WechatTenpayClientResponseVerificationExtensions.VerifyResponseSignatureAsync(client.ProxyClient, responseTimestamp, responseNonce, responseBody, responseSignature, responseSignatureType, responseSerialNumber, cancellationToken);
} }
} }
} }

View File

@ -6,15 +6,35 @@ using Flurl.Http;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
{ {
using _ROOT_ = SKIT.FlurlHttpClient.Wechat.TenpayV3;
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Constants;
/// <summary> /// <summary>
/// 一个微信支付 Global API HTTP 客户端。 /// 一个微信支付 Global API HTTP 客户端。
/// </summary> /// </summary>
public class WechatTenpayGlobalClient : WechatTenpayClient public class WechatTenpayGlobalClient : CommonClientBase, ICommonClient
{ {
internal WechatTenpayClient ProxyClient { get; }
/// <summary> /// <summary>
/// 获取当前客户端使用的微信支付商户凭证。 /// 获取当前客户端使用的微信支付商户凭证。
/// </summary> /// </summary>
public new Settings.Credentials Credentials { get; } public Settings.Credentials Credentials { get; }
/// <summary>
/// 获取当前客户端使用的微信支付平台证书管理器。
/// </summary>
public _ROOT_.Settings.ICertificateManager PlatformCertificateManager { get; }
/// <summary>
/// 获取是否自动加密请求中的敏感信息字段。
/// </summary>
protected internal bool AutoEncryptRequestSensitiveProperty { get; }
/// <summary>
/// 获取是否自动解密请求中的敏感信息字段。
/// </summary>
protected internal bool AutoDecryptResponseSensitiveProperty { get; }
/// <summary> /// <summary>
/// 用指定的配置项初始化 <see cref="WechatTenpayGlobalClient"/> 类的新实例。 /// 用指定的配置项初始化 <see cref="WechatTenpayGlobalClient"/> 类的新实例。
@ -32,30 +52,43 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <param name="httpClient"></param> /// <param name="httpClient"></param>
/// <param name="disposeClient"></param> /// <param name="disposeClient"></param>
internal protected WechatTenpayGlobalClient(WechatTenpayGlobalClientOptions options, HttpClient? httpClient, bool disposeClient = true) internal protected WechatTenpayGlobalClient(WechatTenpayGlobalClientOptions options, HttpClient? httpClient, bool disposeClient = true)
: base( : base(httpClient, disposeClient)
new WechatTenpayClientOptions()
{
Timeout = options.Timeout,
Endpoint = options.Endpoint,
AcceptLanguage = options.AcceptLanguage,
SignScheme = options.SignScheme,
MerchantId = options.MerchantId,
MerchantV3Secret = options.MerchantV3Secret,
MerchantCertificateSerialNumber = options.MerchantCertificateSerialNumber,
MerchantCertificatePrivateKey = options.MerchantCertificatePrivateKey,
AutoEncryptRequestSensitiveProperty = options.AutoEncryptRequestSensitiveProperty,
AutoDecryptResponseSensitiveProperty = options.AutoDecryptResponseSensitiveProperty,
PlatformCertificateManager = options.PlatformCertificateManager
},
httpClient,
disposeClient
)
{ {
if (options is null) throw new ArgumentNullException(nameof(options)); if (options is null) throw new ArgumentNullException(nameof(options));
ProxyClient = new WechatTenpayClient(new WechatTenpayClientOptions()
{
Timeout = options.Timeout,
Endpoint = options.Endpoint,
AcceptLanguage = options.AcceptLanguage,
SignScheme = options.SignScheme,
MerchantId = options.MerchantId,
MerchantV3Secret = options.MerchantV3Secret,
MerchantCertificateSerialNumber = options.MerchantCertificateSerialNumber,
MerchantCertificatePrivateKey = options.MerchantCertificatePrivateKey,
PlatformAuthScheme = _ROOT_.Settings.PlatformAuthScheme.Certificate,
PlatformCertificateManager = options.PlatformCertificateManager,
AutoEncryptRequestSensitiveProperty = options.AutoEncryptRequestSensitiveProperty,
AutoDecryptResponseSensitiveProperty = options.AutoDecryptResponseSensitiveProperty
}, httpClient, disposeClient);
Credentials = new Settings.Credentials(options); Credentials = new Settings.Credentials(options);
PlatformCertificateManager = options.PlatformCertificateManager;
AutoEncryptRequestSensitiveProperty = options.AutoEncryptRequestSensitiveProperty;
AutoDecryptResponseSensitiveProperty = options.AutoDecryptResponseSensitiveProperty;
FlurlClient.BaseUrl = options.Endpoint ?? WechatTenpayGlobalEndpoints.DEFAULT; FlurlClient.BaseUrl = options.Endpoint ?? WechatTenpayGlobalEndpoints.DEFAULT;
FlurlClient.WithHeader(HttpHeaders.Accept, "application/json");
FlurlClient.WithHeader(HttpHeaders.AcceptLanguage, options.AcceptLanguage);
FlurlClient.WithHeader(HttpHeaders.UserAgent, $"OS/{Environment.OSVersion.Platform} SKIT.FlurlHttpClient.Wechat.Tenpay/{AssemblyProps.VERSION}");
FlurlClient.WithTimeout(options.Timeout <= 0 ? Timeout.InfiniteTimeSpan : TimeSpan.FromMilliseconds(options.Timeout));
Interceptors.Add(new Interceptors.WechatTenpayRequestSigningInterceptor(
scheme: options.SignScheme,
mchId: options.MerchantId,
mchCertSn: options.MerchantCertificateSerialNumber,
mchCertPk: options.MerchantCertificatePrivateKey
));
} }
/// <summary> /// <summary>
@ -78,7 +111,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <param name="httpContent"></param> /// <param name="httpContent"></param>
/// <param name="cancellationToken"></param> /// <param name="cancellationToken"></param>
/// <returns></returns> /// <returns></returns>
public new async Task<T> SendFlurlRequestAsync<T>(IFlurlRequest flurlRequest, HttpContent? httpContent = null, CancellationToken cancellationToken = default) public async Task<T> SendFlurlRequestAsync<T>(IFlurlRequest flurlRequest, HttpContent? httpContent = null, CancellationToken cancellationToken = default)
where T : WechatTenpayGlobalResponse, new() where T : WechatTenpayGlobalResponse, new()
{ {
if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest)); if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest));
@ -95,7 +128,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.ExtendedSDK.Global
/// <param name="data"></param> /// <param name="data"></param>
/// <param name="cancellationToken"></param> /// <param name="cancellationToken"></param>
/// <returns></returns> /// <returns></returns>
public new async Task<T> SendFlurlRequestAsJsonAsync<T>(IFlurlRequest flurlRequest, object? data = null, CancellationToken cancellationToken = default) public async Task<T> SendFlurlRequestAsJsonAsync<T>(IFlurlRequest flurlRequest, object? data = null, CancellationToken cancellationToken = default)
where T : WechatTenpayGlobalResponse, new() where T : WechatTenpayGlobalResponse, new()
{ {
if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest)); if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest));

View File

@ -7,13 +7,13 @@ using Flurl.Http;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3 namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{ {
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Constants;
/// <summary> /// <summary>
/// 一个微信支付 API HTTP 客户端。 /// 一个微信支付 API HTTP 客户端。
/// </summary> /// </summary>
public class WechatTenpayClient : CommonClientBase, ICommonClient public class WechatTenpayClient : CommonClientBase, ICommonClient
{ {
private static readonly string ASSEMBLY_VERSION = Assembly.GetAssembly(typeof(WechatTenpayClient))!.GetName()!.Version!.ToString();
/// <summary> /// <summary>
/// 获取当前客户端使用的微信支付商户凭证。 /// 获取当前客户端使用的微信支付商户凭证。
/// </summary> /// </summary>
@ -74,7 +74,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
FlurlClient.BaseUrl = options.Endpoint ?? WechatTenpayEndpoints.DEFAULT; FlurlClient.BaseUrl = options.Endpoint ?? WechatTenpayEndpoints.DEFAULT;
FlurlClient.WithHeader(HttpHeaders.Accept, "application/json"); FlurlClient.WithHeader(HttpHeaders.Accept, "application/json");
FlurlClient.WithHeader(HttpHeaders.AcceptLanguage, options.AcceptLanguage); FlurlClient.WithHeader(HttpHeaders.AcceptLanguage, options.AcceptLanguage);
FlurlClient.WithHeader(HttpHeaders.UserAgent, $"OS/{Environment.OSVersion.Platform} SKIT.FlurlHttpClient.Wechat.Tenpay/{ASSEMBLY_VERSION}"); FlurlClient.WithHeader(HttpHeaders.UserAgent, $"OS/{Environment.OSVersion.Platform} SKIT.FlurlHttpClient.Wechat.Tenpay/{AssemblyProps.VERSION}");
FlurlClient.WithTimeout(options.Timeout <= 0 ? Timeout.InfiniteTimeSpan : TimeSpan.FromMilliseconds(options.Timeout)); FlurlClient.WithTimeout(options.Timeout <= 0 ? Timeout.InfiniteTimeSpan : TimeSpan.FromMilliseconds(options.Timeout));
Interceptors.Add(new Interceptors.WechatTenpayRequestSigningInterceptor( Interceptors.Add(new Interceptors.WechatTenpayRequestSigningInterceptor(
@ -121,7 +121,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
where T : WechatTenpayResponse, new() where T : WechatTenpayResponse, new()
{ {
if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest)); if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest));
if (this is ExtendedSDK.Global.WechatTenpayGlobalClient) throw new InvalidOperationException("This client only supports WeChatPay Global business. Maybe you have misused the client builder or imported a wrong namespaces.");
using IFlurlResponse flurlResponse = await base.SendFlurlRequestAsync(flurlRequest, httpContent, cancellationToken).ConfigureAwait(false); using IFlurlResponse flurlResponse = await base.SendFlurlRequestAsync(flurlRequest, httpContent, cancellationToken).ConfigureAwait(false);
return await WrapFlurlResponseAsJsonAsync<T>(flurlResponse, cancellationToken).ConfigureAwait(false); return await WrapFlurlResponseAsJsonAsync<T>(flurlResponse, cancellationToken).ConfigureAwait(false);
@ -139,7 +138,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
where T : WechatTenpayResponse, new() where T : WechatTenpayResponse, new()
{ {
if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest)); if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest));
if (this is ExtendedSDK.Global.WechatTenpayGlobalClient) throw new InvalidOperationException("This client only supports WeChatPay Global business. Maybe you have misused the client builder or imported a wrong namespaces.");
bool isSimpleRequest = data is null || bool isSimpleRequest = data is null ||
flurlRequest.Verb == HttpMethod.Get || flurlRequest.Verb == HttpMethod.Get ||