mirror of
https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git
synced 2025-04-05 17:37:54 +08:00
docs: 完善微信商户平台模块的示例项目
This commit is contained in:
parent
25763e550b
commit
18c0719655
@ -14,6 +14,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Sample_Net5.Services.DistributedLock.I
|
||||
|
||||
public IDistributedLock Create(string lockName)
|
||||
{
|
||||
// NOTICE: 单机演示基于文件实现分布式锁,生产项目请替换成其他实现
|
||||
return new FileDistributedLock(_lockFileDirectory, lockName);
|
||||
}
|
||||
}
|
||||
|
@ -6,16 +6,16 @@ using Microsoft.Extensions.Options;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Options
|
||||
{
|
||||
public partial class WechatOptions : IOptions<WechatOptions>
|
||||
public partial class WxpayOptions : IOptions<WxpayOptions>
|
||||
{
|
||||
WechatOptions IOptions<WechatOptions>.Value => this;
|
||||
WxpayOptions IOptions<WxpayOptions>.Value => this;
|
||||
|
||||
public WechatMerchant[] Merchants { get; set; } = Array.Empty<WechatMerchant>();
|
||||
|
||||
public string CallbackEntry { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
partial class WechatOptions
|
||||
partial class WxpayOptions
|
||||
{
|
||||
public class WechatMerchant
|
||||
{
|
@ -0,0 +1,77 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using SKIT.FlurlHttpClient.Wechat.TenpayV3;
|
||||
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
|
||||
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Services.BackgroundServices
|
||||
{
|
||||
class WxpayCertificateRefreshingBackgroundService : BackgroundService
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
private readonly Options.WxpayOptions _wxpayOptions;
|
||||
private readonly CertificateManager _certificateManager;
|
||||
private readonly HttpClients.IWechatTenpayHttpClientFactory _wechatTenpayHttpClientFactory;
|
||||
|
||||
public WxpayCertificateRefreshingBackgroundService(
|
||||
ILoggerFactory loggerFactory,
|
||||
IOptions<Options.WxpayOptions> wxpayOptions,
|
||||
CertificateManager certificateManager,
|
||||
HttpClients.IWechatTenpayHttpClientFactory wechatTenpayHttpClientFactory)
|
||||
{
|
||||
_logger = loggerFactory.CreateLogger(GetType());
|
||||
_wxpayOptions = wxpayOptions.Value;
|
||||
_certificateManager = certificateManager;
|
||||
_wechatTenpayHttpClientFactory = wechatTenpayHttpClientFactory;
|
||||
}
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
while (!stoppingToken.IsCancellationRequested)
|
||||
{
|
||||
var wxpayMerchant = _wxpayOptions.Merchants.FirstOrDefault();
|
||||
if (wxpayMerchant == null)
|
||||
{
|
||||
_logger.LogWarning("未找到微信商户配置项。");
|
||||
break;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var client = _wechatTenpayHttpClientFactory.Create(wxpayMerchant.MerchantId);
|
||||
var request = new QueryCertificatesRequest();
|
||||
var response = await client.ExecuteQueryCertificatesAsync(request, cancellationToken: stoppingToken);
|
||||
if (response.IsSuccessful())
|
||||
{
|
||||
client.DecryptResponseEncryptedData(ref response);
|
||||
foreach (var cert in response.CertificateList)
|
||||
{
|
||||
_certificateManager.SetCertificate(cert.SerialNumber, cert.EncryptCertificate.CipherText);
|
||||
}
|
||||
|
||||
_logger.LogInformation("刷新微信商户平台证书成功。");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"刷新微信商户平台证书失败(状态码:{0},错误代码:{1},错误描述:{2})。",
|
||||
response.RawStatus, response.ErrorCode, response.ErrorMessage
|
||||
);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "刷新微信商户平台证书遇到异常。");
|
||||
}
|
||||
|
||||
await Task.Delay(TimeSpan.FromDays(1)); // 每隔 1 天轮询刷新
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -7,6 +7,6 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Services.HttpClients
|
||||
{
|
||||
public interface IWechatTenpayHttpClientFactory
|
||||
{
|
||||
WechatTenpayClient Create(string appId);
|
||||
WechatTenpayClient Create(string merchantId);
|
||||
}
|
||||
}
|
||||
|
@ -14,12 +14,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5.Services.HttpClients.
|
||||
partial class WechatTenpayHttpClientFactory : IWechatTenpayHttpClientFactory
|
||||
{
|
||||
private readonly System.Net.Http.IHttpClientFactory _httpClientFactory;
|
||||
private readonly Options.WechatOptions _wechatOptions;
|
||||
private readonly Options.WxpayOptions _wechatOptions;
|
||||
private readonly CertificateManager _certificateManager;
|
||||
|
||||
public WechatTenpayHttpClientFactory(
|
||||
System.Net.Http.IHttpClientFactory httpClientFactory,
|
||||
IOptions<Options.WechatOptions> wechatOptions,
|
||||
IOptions<Options.WxpayOptions> wechatOptions,
|
||||
CertificateManager certificateManager)
|
||||
{
|
||||
_httpClientFactory = httpClientFactory;
|
||||
|
@ -27,12 +27,15 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5
|
||||
|
||||
// 注入配置项
|
||||
services.AddOptions();
|
||||
services.Configure<Options.WechatOptions>(Configuration.GetSection(nameof(Options.WechatOptions)));
|
||||
services.Configure<Options.WxpayOptions>(Configuration.GetSection(nameof(Options.WxpayOptions)));
|
||||
|
||||
// 注入工厂 HTTP 客户端
|
||||
services.AddHttpClient();
|
||||
services.AddSingleton<CertificateManager, InMemoryCertificateManager>();
|
||||
services.AddSingleton<Services.HttpClients.IWechatTenpayHttpClientFactory, Services.HttpClients.Implements.WechatTenpayHttpClientFactory>();
|
||||
|
||||
// ×¢Èëºǫ́ÈÎÎñ
|
||||
services.AddHostedService<Services.BackgroundServices.WxpayCertificateRefreshingBackgroundService>();
|
||||
}
|
||||
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
"AllowedHosts": "*",
|
||||
|
||||
"WechatOptions": {
|
||||
"WxpayOptions": {
|
||||
"Merchants": [
|
||||
{
|
||||
"MerchantId": "填写商户号"
|
||||
|
Loading…
Reference in New Issue
Block a user