demo(tenpayv3): clean code

This commit is contained in:
Fu Diwei 2021-12-04 16:11:49 +08:00
parent c00ce7be84
commit df656663c7
8 changed files with 54 additions and 56 deletions

View File

@ -8,18 +8,17 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Controllers
{ {
[ApiController] [ApiController]
[Route("notify")] [Route("notify")]
public class WxpayNotifyController : ControllerBase public class TenpayNotifyController : ControllerBase
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _tenpayHttpClientFactory;
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _wechatTenpayHttpClientFactory; public TenpayNotifyController(
public WxpayNotifyController(
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
Services.HttpClients.IWechatTenpayHttpClientFactory wechatTenpayHttpClientFactory) Services.HttpClients.IWechatTenpayHttpClientFactory tenpayHttpClientFactory)
{ {
_logger = loggerFactory.CreateLogger(GetType()); _logger = loggerFactory.CreateLogger(GetType());
_wechatTenpayHttpClientFactory = wechatTenpayHttpClientFactory; _tenpayHttpClientFactory = tenpayHttpClientFactory;
} }
@ -39,7 +38,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Controllers
string content = await reader.ReadToEndAsync(); string content = await reader.ReadToEndAsync();
_logger.LogInformation("接收到微信支付推送的数据:{0}", content); _logger.LogInformation("接收到微信支付推送的数据:{0}", content);
var client = _wechatTenpayHttpClientFactory.Create(merchantId); var client = _tenpayHttpClientFactory.Create(merchantId);
bool valid = client.VerifyEventSignature( bool valid = client.VerifyEventSignature(
callbackTimestamp: timestamp, callbackTimestamp: timestamp,
callbackNonce: nonce, callbackNonce: nonce,

View File

@ -14,22 +14,20 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Controllers
{ {
[ApiController] [ApiController]
[Route("order")] [Route("order")]
public class WxpayOrderController : ControllerBase public class TenpayOrderController : ControllerBase
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly Options.TenpayOptions _tenpayOptions;
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _tenpayHttpClientFactory;
private readonly Options.WxpayOptions _wxpayOptions; public TenpayOrderController(
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _wechatTenpayHttpClientFactory;
public WxpayOrderController(
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
IOptions<Options.WxpayOptions> wxpayOptions, IOptions<Options.TenpayOptions> tenpayOptions,
Services.HttpClients.IWechatTenpayHttpClientFactory wechatTenpayHttpClientFactory) Services.HttpClients.IWechatTenpayHttpClientFactory tenpayHttpClientFactory)
{ {
_logger = loggerFactory.CreateLogger(GetType()); _logger = loggerFactory.CreateLogger(GetType());
_wxpayOptions = wxpayOptions.Value; _tenpayOptions = tenpayOptions.Value;
_wechatTenpayHttpClientFactory = wechatTenpayHttpClientFactory; _tenpayHttpClientFactory = tenpayHttpClientFactory;
} }
[HttpPost] [HttpPost]
@ -39,13 +37,13 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Controllers
// JSAPI 下单 // JSAPI 下单
// 文档https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml // 文档https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml
var client = _wechatTenpayHttpClientFactory.Create(requestModel.MerchantId); var client = _tenpayHttpClientFactory.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"),
AppId = requestModel.AppId, AppId = requestModel.AppId,
Description = "演示订单", Description = "演示订单",
NotifyUrl = _wxpayOptions.CallbackUrl, NotifyUrl = _tenpayOptions.NotifyUrl,
Amount = new CreatePayTransactionJsapiRequest.Types.Amount() { Total = requestModel.Amount }, Amount = new CreatePayTransactionJsapiRequest.Types.Amount() { Total = requestModel.Amount },
Payer = new CreatePayTransactionJsapiRequest.Types.Payer() { OpenId = requestModel.OpenId } Payer = new CreatePayTransactionJsapiRequest.Types.Payer() { OpenId = requestModel.OpenId }
}; };

View File

@ -14,22 +14,20 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Controllers
{ {
[ApiController] [ApiController]
[Route("refund")] [Route("refund")]
public class WxpayRefundController : ControllerBase public class TenpayRefundController : ControllerBase
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly Options.TenpayOptions _tenpayOptions;
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _tenpayHttpClientFactory;
private readonly Options.WxpayOptions _wxpayOptions; public TenpayRefundController(
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _wechatTenpayHttpClientFactory;
public WxpayRefundController(
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
IOptions<Options.WxpayOptions> wxpayOptions, IOptions<Options.TenpayOptions> tenpayOptions,
Services.HttpClients.IWechatTenpayHttpClientFactory wechatTenpayHttpClientFactory) Services.HttpClients.IWechatTenpayHttpClientFactory tenpayHttpClientFactory)
{ {
_logger = loggerFactory.CreateLogger(GetType()); _logger = loggerFactory.CreateLogger(GetType());
_wxpayOptions = wxpayOptions.Value; _tenpayOptions = tenpayOptions.Value;
_wechatTenpayHttpClientFactory = wechatTenpayHttpClientFactory; _tenpayHttpClientFactory = tenpayHttpClientFactory;
} }
[HttpPost] [HttpPost]
@ -39,7 +37,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Controllers
// 申请退款 // 申请退款
// 文档https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_9.shtml // 文档https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_9.shtml
var client = _wechatTenpayHttpClientFactory.Create(requestModel.MerchantId); var client = _tenpayHttpClientFactory.Create(requestModel.MerchantId);
var request = new CreateRefundDomesticRefundRequest() var request = new CreateRefundDomesticRefundRequest()
{ {
TransactionId = requestModel.TransactionId, TransactionId = requestModel.TransactionId,
@ -50,7 +48,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Controllers
Refund = requestModel.RefundAmount Refund = requestModel.RefundAmount
}, },
Reason = "示例退款", Reason = "示例退款",
NotifyUrl = _wxpayOptions.CallbackUrl NotifyUrl = _tenpayOptions.NotifyUrl
}; };
var response = await client.ExecuteCreateRefundDomesticRefundAsync(request, cancellationToken: HttpContext.RequestAborted); var response = await client.ExecuteCreateRefundDomesticRefundAsync(request, cancellationToken: HttpContext.RequestAborted);
if (!response.IsSuccessful()) if (!response.IsSuccessful())

View File

@ -6,16 +6,16 @@ using Microsoft.Extensions.Options;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Options namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Options
{ {
public partial class WxpayOptions : IOptions<WxpayOptions> public partial class TenpayOptions : IOptions<TenpayOptions>
{ {
WxpayOptions IOptions<WxpayOptions>.Value => this; TenpayOptions IOptions<TenpayOptions>.Value => this;
public WechatMerchant[] Merchants { get; set; } = Array.Empty<WechatMerchant>(); public WechatMerchant[] Merchants { get; set; } = Array.Empty<WechatMerchant>();
public string CallbackUrl { get; set; } = string.Empty; public string NotifyUrl { get; set; } = string.Empty;
} }
partial class WxpayOptions partial class TenpayOptions
{ {
public class WechatMerchant public class WechatMerchant
{ {

View File

@ -10,30 +10,30 @@ using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Services.BackgroundServices namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Services.BackgroundServices
{ {
class WxpayCertificateRefreshingBackgroundService : BackgroundService class TenpayCertificateRefreshingBackgroundService : BackgroundService
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly Options.WxpayOptions _wxpayOptions; private readonly Options.TenpayOptions _tenpayOptions;
private readonly CertificateManager _certificateManager; private readonly CertificateManager _tenpayCertificateManager;
private readonly HttpClients.IWechatTenpayHttpClientFactory _wechatTenpayHttpClientFactory; private readonly HttpClients.IWechatTenpayHttpClientFactory _tenpayHttpClientFactory;
public WxpayCertificateRefreshingBackgroundService( public TenpayCertificateRefreshingBackgroundService(
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
IOptions<Options.WxpayOptions> wxpayOptions, IOptions<Options.TenpayOptions> tenpayOptions,
CertificateManager certificateManager, CertificateManager tenpayCertificateManager,
HttpClients.IWechatTenpayHttpClientFactory wechatTenpayHttpClientFactory) HttpClients.IWechatTenpayHttpClientFactory tenpayHttpClientFactory)
{ {
_logger = loggerFactory.CreateLogger(GetType()); _logger = loggerFactory.CreateLogger(GetType());
_wxpayOptions = wxpayOptions.Value; _tenpayOptions = tenpayOptions.Value;
_certificateManager = certificateManager; _tenpayCertificateManager = tenpayCertificateManager;
_wechatTenpayHttpClientFactory = wechatTenpayHttpClientFactory; _tenpayHttpClientFactory = tenpayHttpClientFactory;
} }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
while (!stoppingToken.IsCancellationRequested) while (!stoppingToken.IsCancellationRequested)
{ {
var wxpayMerchant = _wxpayOptions.Merchants.FirstOrDefault(); var wxpayMerchant = _tenpayOptions.Merchants.FirstOrDefault();
if (wxpayMerchant == null) if (wxpayMerchant == null)
{ {
_logger.LogWarning("未找到微信商户配置项。"); _logger.LogWarning("未找到微信商户配置项。");
@ -42,7 +42,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Services.BackgroundSe
try try
{ {
var client = _wechatTenpayHttpClientFactory.Create(wxpayMerchant.MerchantId); var client = _tenpayHttpClientFactory.Create(wxpayMerchant.MerchantId);
var request = new QueryCertificatesRequest(); var request = new QueryCertificatesRequest();
var response = await client.ExecuteQueryCertificatesAsync(request, cancellationToken: stoppingToken); var response = await client.ExecuteQueryCertificatesAsync(request, cancellationToken: stoppingToken);
if (response.IsSuccessful()) if (response.IsSuccessful())
@ -52,7 +52,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Services.BackgroundSe
foreach (var certificateModel in response.CertificateList) foreach (var certificateModel in response.CertificateList)
{ {
_certificateManager.AddEntry(new CertificateEntry(certificateModel)); _tenpayCertificateManager.AddEntry(new CertificateEntry(certificateModel));
} }
_logger.LogInformation("刷新微信商户平台证书成功。"); _logger.LogInformation("刷新微信商户平台证书成功。");

View File

@ -12,12 +12,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Services.HttpClients.
partial class WechatTenpayHttpClientFactory : IWechatTenpayHttpClientFactory partial class WechatTenpayHttpClientFactory : IWechatTenpayHttpClientFactory
{ {
private readonly System.Net.Http.IHttpClientFactory _httpClientFactory; private readonly System.Net.Http.IHttpClientFactory _httpClientFactory;
private readonly Options.WxpayOptions _wechatOptions; private readonly Options.TenpayOptions _wechatOptions;
private readonly CertificateManager _certificateManager; private readonly CertificateManager _certificateManager;
public WechatTenpayHttpClientFactory( public WechatTenpayHttpClientFactory(
System.Net.Http.IHttpClientFactory httpClientFactory, System.Net.Http.IHttpClientFactory httpClientFactory,
IOptions<Options.WxpayOptions> wechatOptions, IOptions<Options.TenpayOptions> wechatOptions,
CertificateManager certificateManager) CertificateManager certificateManager)
{ {
_httpClientFactory = httpClientFactory; _httpClientFactory = httpClientFactory;

View File

@ -27,7 +27,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5
// 注入配置项 // 注入配置项
services.AddOptions(); services.AddOptions();
services.Configure<Options.WxpayOptions>(Configuration.GetSection(nameof(Options.WxpayOptions))); services.Configure<Options.TenpayOptions>(Configuration.GetSection(nameof(Options.TenpayOptions)));
// 注入工厂 HTTP 客户端 // 注入工厂 HTTP 客户端
services.AddHttpClient(); services.AddHttpClient();
@ -35,7 +35,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5
services.AddSingleton<Services.HttpClients.IWechatTenpayHttpClientFactory, Services.HttpClients.Implements.WechatTenpayHttpClientFactory>(); services.AddSingleton<Services.HttpClients.IWechatTenpayHttpClientFactory, Services.HttpClients.Implements.WechatTenpayHttpClientFactory>();
// 注入后台任务 // 注入后台任务
services.AddHostedService<Services.BackgroundServices.WxpayCertificateRefreshingBackgroundService>(); services.AddHostedService<Services.BackgroundServices.TenpayCertificateRefreshingBackgroundService>();
} }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

View File

@ -9,12 +9,15 @@
"AllowedHosts": "*", "AllowedHosts": "*",
"WxpayOptions": { "TenpayOptions": {
"Merchants": [ "Merchants": [
{ {
"MerchantId": "填写商户号" "MerchantId": "填写商户号",
"SecretV3": "填写 V3 API 密钥",
"CertSerialNumber": "填写商户证书序列号",
"CertPrivateKey": "填写商户证书文件内容"
} }
], ],
"CallbackEntry": "https://localhost:5001" "NotifyUrl": "https://localhost:5001"
} }
} }