mirror of
https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git
synced 2025-12-29 01:44:42 +08:00
docs: 完善微信商户平台模块的示例项目
This commit is contained in:
@@ -14,6 +14,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Sample_Net5.Services.DistributedLock.I
|
|||||||
|
|
||||||
public IDistributedLock Create(string lockName)
|
public IDistributedLock Create(string lockName)
|
||||||
{
|
{
|
||||||
|
// NOTICE: 单机演示基于文件实现分布式锁,生产项目请替换成其他实现
|
||||||
return new FileDistributedLock(_lockFileDirectory, lockName);
|
return new FileDistributedLock(_lockFileDirectory, lockName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 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 WechatMerchant[] Merchants { get; set; } = Array.Empty<WechatMerchant>();
|
||||||
|
|
||||||
public string CallbackEntry { get; set; } = string.Empty;
|
public string CallbackEntry { get; set; } = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
partial class WechatOptions
|
partial class WxpayOptions
|
||||||
{
|
{
|
||||||
public class WechatMerchant
|
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
|
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
|
partial class WechatTenpayHttpClientFactory : IWechatTenpayHttpClientFactory
|
||||||
{
|
{
|
||||||
private readonly System.Net.Http.IHttpClientFactory _httpClientFactory;
|
private readonly System.Net.Http.IHttpClientFactory _httpClientFactory;
|
||||||
private readonly Options.WechatOptions _wechatOptions;
|
private readonly Options.WxpayOptions _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.WechatOptions> wechatOptions,
|
IOptions<Options.WxpayOptions> wechatOptions,
|
||||||
CertificateManager certificateManager)
|
CertificateManager certificateManager)
|
||||||
{
|
{
|
||||||
_httpClientFactory = httpClientFactory;
|
_httpClientFactory = httpClientFactory;
|
||||||
|
|||||||
@@ -27,12 +27,15 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net5
|
|||||||
|
|
||||||
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
services.AddOptions();
|
services.AddOptions();
|
||||||
services.Configure<Options.WechatOptions>(Configuration.GetSection(nameof(Options.WechatOptions)));
|
services.Configure<Options.WxpayOptions>(Configuration.GetSection(nameof(Options.WxpayOptions)));
|
||||||
|
|
||||||
// ע<>빤<EFBFBD><EBB9A4> HTTP <20>ͻ<EFBFBD><CDBB><EFBFBD>
|
// ע<>빤<EFBFBD><EBB9A4> HTTP <20>ͻ<EFBFBD><CDBB><EFBFBD>
|
||||||
services.AddHttpClient();
|
services.AddHttpClient();
|
||||||
services.AddSingleton<CertificateManager, InMemoryCertificateManager>();
|
services.AddSingleton<CertificateManager, InMemoryCertificateManager>();
|
||||||
services.AddSingleton<Services.HttpClients.IWechatTenpayHttpClientFactory, Services.HttpClients.Implements.WechatTenpayHttpClientFactory>();
|
services.AddSingleton<Services.HttpClients.IWechatTenpayHttpClientFactory, Services.HttpClients.Implements.WechatTenpayHttpClientFactory>();
|
||||||
|
|
||||||
|
// ע<><D7A2><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>
|
||||||
|
services.AddHostedService<Services.BackgroundServices.WxpayCertificateRefreshingBackgroundService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
|
|
||||||
"WechatOptions": {
|
"WxpayOptions": {
|
||||||
"Merchants": [
|
"Merchants": [
|
||||||
{
|
{
|
||||||
"MerchantId": "<22><>д<EFBFBD>̻<EFBFBD><CCBB><EFBFBD>"
|
"MerchantId": "<22><>д<EFBFBD>̻<EFBFBD><CCBB><EFBFBD>"
|
||||||
|
|||||||
Reference in New Issue
Block a user