mirror of
https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git
synced 2025-07-15 14:04:32 +08:00
feat(tenpayv3): 构造器模式
This commit is contained in:
parent
fbb9d3c6af
commit
1dcd2a9158
@ -35,7 +35,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
|
|||||||
string content = await reader.ReadToEndAsync();
|
string content = await reader.ReadToEndAsync();
|
||||||
_logger.LogInformation("接收到微信支付推送的数据:{0}", content);
|
_logger.LogInformation("接收到微信支付推送的数据:{0}", content);
|
||||||
|
|
||||||
using var client = _wechatTenpayClientFactory.Create(merchantId);
|
var client = _wechatTenpayClientFactory.Create(merchantId);
|
||||||
bool valid = client.VerifyEventSignature(
|
bool valid = client.VerifyEventSignature(
|
||||||
webhookTimestamp: timestamp,
|
webhookTimestamp: timestamp,
|
||||||
webhookNonce: nonce,
|
webhookNonce: nonce,
|
||||||
|
@ -31,7 +31,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
|
|||||||
[Route("jsapi")]
|
[Route("jsapi")]
|
||||||
public async Task<IActionResult> CreateOrderByJsapi([FromBody] Models.CreateOrderByJsapiRequest requestModel)
|
public async Task<IActionResult> CreateOrderByJsapi([FromBody] Models.CreateOrderByJsapiRequest requestModel)
|
||||||
{
|
{
|
||||||
using var client = _wechatTenpayClientFactory.Create(requestModel.MerchantId);
|
var client = _wechatTenpayClientFactory.Create(requestModel.MerchantId);
|
||||||
var request = new CreatePayTransactionJsapiRequest()
|
var request = new CreatePayTransactionJsapiRequest()
|
||||||
{
|
{
|
||||||
OutTradeNumber = "SAMPLE_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
|
OutTradeNumber = "SAMPLE_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
|
||||||
|
@ -31,7 +31,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
|
|||||||
[Route("")]
|
[Route("")]
|
||||||
public async Task<IActionResult> CreateRefund([FromBody] Models.CreateRefundRequest requestModel)
|
public async Task<IActionResult> CreateRefund([FromBody] Models.CreateRefundRequest requestModel)
|
||||||
{
|
{
|
||||||
using var client = _wechatTenpayClientFactory.Create(requestModel.MerchantId);
|
var client = _wechatTenpayClientFactory.Create(requestModel.MerchantId);
|
||||||
var request = new CreateRefundDomesticRefundRequest()
|
var request = new CreateRefundDomesticRefundRequest()
|
||||||
{
|
{
|
||||||
TransactionId = requestModel.TransactionId,
|
TransactionId = requestModel.TransactionId,
|
||||||
|
@ -1,18 +1,22 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net.Http;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients.Implements
|
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients.Implements
|
||||||
{
|
{
|
||||||
internal partial class WechatTenpayClientFactory : IWechatTenpayClientFactory
|
internal partial class WechatTenpayClientFactory : IWechatTenpayClientFactory
|
||||||
{
|
{
|
||||||
|
private readonly IHttpClientFactory _httpClientFactory;
|
||||||
private readonly Options.TenpayOptions _tenpayOptions;
|
private readonly Options.TenpayOptions _tenpayOptions;
|
||||||
private readonly IWechatTenpayCertificateManagerFactory _tenpayCertificateManagerFactory;
|
private readonly IWechatTenpayCertificateManagerFactory _tenpayCertificateManagerFactory;
|
||||||
|
|
||||||
public WechatTenpayClientFactory(
|
public WechatTenpayClientFactory(
|
||||||
|
IHttpClientFactory httpClientFactory,
|
||||||
IOptions<Options.TenpayOptions> tenpayOptions,
|
IOptions<Options.TenpayOptions> tenpayOptions,
|
||||||
IWechatTenpayCertificateManagerFactory tenpayCertificateManagerFactory)
|
IWechatTenpayCertificateManagerFactory tenpayCertificateManagerFactory)
|
||||||
{
|
{
|
||||||
|
_httpClientFactory = httpClientFactory;
|
||||||
_tenpayOptions = tenpayOptions.Value;
|
_tenpayOptions = tenpayOptions.Value;
|
||||||
_tenpayCertificateManagerFactory = tenpayCertificateManagerFactory;
|
_tenpayCertificateManagerFactory = tenpayCertificateManagerFactory;
|
||||||
}
|
}
|
||||||
@ -37,7 +41,9 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients.Imple
|
|||||||
AutoEncryptRequestSensitiveProperty = false,
|
AutoEncryptRequestSensitiveProperty = false,
|
||||||
AutoDecryptResponseSensitiveProperty = false
|
AutoDecryptResponseSensitiveProperty = false
|
||||||
};
|
};
|
||||||
var wechatTenpayClient = new WechatTenpayClient(wechatTenpayClientOptions);
|
var wechatTenpayClient = WechatTenpayClientBuilder.Create(wechatTenpayClientOptions)
|
||||||
|
.UseHttpClient(_httpClientFactory.CreateClient(), disposeClient: false)
|
||||||
|
.Build();
|
||||||
return wechatTenpayClient;
|
return wechatTenpayClient;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.BackgroundJobs
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
const string ALGORITHM_TYPE = "RSA";
|
const string ALGORITHM_TYPE = "RSA";
|
||||||
var client = _wechatTenpayClientFactory.Create(tenpayMerchantOptions.MerchantId);
|
using var client = _wechatTenpayClientFactory.Create(tenpayMerchantOptions.MerchantId);
|
||||||
var request = new QueryCertificatesRequest() { AlgorithmType = ALGORITHM_TYPE };
|
var request = new QueryCertificatesRequest() { AlgorithmType = ALGORITHM_TYPE };
|
||||||
var response = await client.ExecuteQueryCertificatesAsync(request);
|
var response = await client.ExecuteQueryCertificatesAsync(request);
|
||||||
if (response.IsSuccessful())
|
if (response.IsSuccessful())
|
||||||
|
@ -0,0 +1,94 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net.Http;
|
||||||
|
|
||||||
|
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 用于构造 <see cref="WechatTenpayClient"/> 实例的构造器。
|
||||||
|
/// </summary>
|
||||||
|
public partial class WechatTenpayClientBuilder : ICommonClientBuilder<WechatTenpayClient>
|
||||||
|
{
|
||||||
|
private readonly WechatTenpayClientOptions _options;
|
||||||
|
private readonly IList<Action<CommonClientSettings>> _configures;
|
||||||
|
private readonly IList<HttpInterceptor> _interceptors;
|
||||||
|
private HttpClient? _httpClient;
|
||||||
|
private bool? _disposeClient;
|
||||||
|
|
||||||
|
private WechatTenpayClientBuilder(WechatTenpayClientOptions options)
|
||||||
|
{
|
||||||
|
_options = options;
|
||||||
|
_configures = new List<Action<CommonClientSettings>>();
|
||||||
|
_interceptors = new List<HttpInterceptor>();
|
||||||
|
}
|
||||||
|
|
||||||
|
ICommonClientBuilder<WechatTenpayClient> ICommonClientBuilder<WechatTenpayClient>.ConfigureSettings(Action<CommonClientSettings> configure)
|
||||||
|
{
|
||||||
|
return ConfigureSettings(configure);
|
||||||
|
}
|
||||||
|
|
||||||
|
ICommonClientBuilder<WechatTenpayClient> ICommonClientBuilder<WechatTenpayClient>.UseInterceptor(HttpInterceptor interceptor)
|
||||||
|
{
|
||||||
|
return UseInterceptor(interceptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
ICommonClientBuilder<WechatTenpayClient> ICommonClientBuilder<WechatTenpayClient>.UseHttpClient(HttpClient httpClient, bool disposeClient)
|
||||||
|
{
|
||||||
|
return UseHttpClient(httpClient, disposeClient);
|
||||||
|
}
|
||||||
|
|
||||||
|
public WechatTenpayClientBuilder ConfigureSettings(Action<CommonClientSettings> configure)
|
||||||
|
{
|
||||||
|
if (configure is null) throw new ArgumentNullException(nameof(configure));
|
||||||
|
|
||||||
|
_configures.Add(configure);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WechatTenpayClientBuilder UseInterceptor(HttpInterceptor interceptor)
|
||||||
|
{
|
||||||
|
if (interceptor is null) throw new ArgumentNullException(nameof(interceptor));
|
||||||
|
|
||||||
|
_interceptors.Add(interceptor);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WechatTenpayClientBuilder UseHttpClient(HttpClient httpClient, bool disposeClient = true)
|
||||||
|
{
|
||||||
|
if (httpClient is null) throw new ArgumentNullException(nameof(httpClient));
|
||||||
|
|
||||||
|
_httpClient = httpClient;
|
||||||
|
_disposeClient = disposeClient;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WechatTenpayClient Build()
|
||||||
|
{
|
||||||
|
WechatTenpayClient client = _disposeClient.HasValue
|
||||||
|
? new WechatTenpayClient(_options, _httpClient, _disposeClient.Value)
|
||||||
|
: new WechatTenpayClient(_options, _httpClient);
|
||||||
|
|
||||||
|
foreach (Action<CommonClientSettings> configure in _configures)
|
||||||
|
{
|
||||||
|
client.Configure(configure);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (HttpInterceptor interceptor in _interceptors)
|
||||||
|
{
|
||||||
|
client.Interceptors.Add(interceptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
partial class WechatTenpayClientBuilder
|
||||||
|
{
|
||||||
|
public static WechatTenpayClientBuilder Create(WechatTenpayClientOptions options)
|
||||||
|
{
|
||||||
|
if (options is null) throw new ArgumentNullException(nameof(options));
|
||||||
|
|
||||||
|
return new WechatTenpayClientBuilder(options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user