feat(tenpayv3): 升级公共组件

This commit is contained in:
Fu Diwei
2024-01-29 23:12:37 +08:00
committed by RHQYZ
parent 84ee19d614
commit a6763ca683
348 changed files with 4397 additions and 3878 deletions

View File

@@ -13,8 +13,8 @@
builder.RegisterType<Services.HttpClients.Implements.WechatTenpayCertificateManagerFactory>()
.As<Services.HttpClients.IWechatTenpayCertificateManagerFactory>()
.SingleInstance();
builder.RegisterType<Services.HttpClients.Implements.WechatTenpayHttpClientFactory>()
.As<Services.HttpClients.IWechatTenpayHttpClientFactory>()
builder.RegisterType<Services.HttpClients.Implements.WechatTenpayClientFactory>()
.As<Services.HttpClients.IWechatTenpayClientFactory>()
.SingleInstance();
builder.RegisterType<Services.BackgroundJobs.TenpayCertificateRefreshingBackgroundJob>()

View File

@@ -3,12 +3,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
[RoutePrefix("api/notify")]
public class TenpayNotifyController : ApiController
{
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _tenpayHttpClientFactory;
private readonly Services.HttpClients.IWechatTenpayClientFactory _wechatTenpayClientFactory;
public TenpayNotifyController(
Services.HttpClients.IWechatTenpayHttpClientFactory tenpayHttpClientFactory)
Services.HttpClients.IWechatTenpayClientFactory wechatTenpayClientFactory)
{
_tenpayHttpClientFactory = tenpayHttpClientFactory;
_wechatTenpayClientFactory = wechatTenpayClientFactory;
}
@@ -26,45 +26,47 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
string content = await reader.ReadToEndAsync();
Debug.WriteLine("接收到微信支付推送的数据:{0}", content);
var client = _tenpayHttpClientFactory.Create(merchantId);
bool valid = client.VerifyEventSignature(
callbackTimestamp: timestamp,
callbackNonce: nonce,
callbackBody: content,
callbackSignature: signature,
callbackSerialNumber: serialNumber
);
if (!valid)
using (var client = _wechatTenpayClientFactory.Create(merchantId))
{
// NOTICE:
// 需提前注入 CertificateManager、并添加平台证书才可以使用扩展方法执行验签操作。
// 请参考本示例项目 TenpayCertificateRefreshingBackgroundService 后台任务中的相关实现。
// 有关 CertificateManager 的完整介绍请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》。
// 后续如何解密并反序列化,请参阅《开发文档 / 基础用法 / 如何解密回调通知事件中的敏感数据?》。
bool valid = client.VerifyEventSignature(
webhookTimestamp: timestamp,
webhookNonce: nonce,
webhookBody: content,
webhookSignature: signature,
webhookSerialNumber: serialNumber
);
if (!valid)
{
// NOTICE:
// 需提前注入 CertificateManager、并添加平台证书才可以使用扩展方法执行验签操作。
// 请参考本示例项目 TenpayCertificateRefreshingBackgroundService 后台任务中的相关实现。
// 有关 CertificateManager 的完整介绍请参阅《开发文档 / 基础用法 / 如何验证回调通知事件签名?》。
// 后续如何解密并反序列化,请参阅《开发文档 / 基础用法 / 如何解密回调通知事件中的敏感数据?》。
return Json(new { code = "FAIL", message = "验签失败" });
return Json(new { code = "FAIL", message = "验签失败" });
}
var callbackModel = client.DeserializeEvent(content);
var eventType = callbackModel.EventType?.ToUpper();
switch (eventType)
{
case "TRANSACTION.SUCCESS":
{
var callbackResource = client.DecryptEventResource<Events.TransactionResource>(callbackModel);
Debug.WriteLine("接收到微信支付推送的订单支付成功通知,商户订单号:{0}", callbackResource.OutTradeNumber);
// 后续处理略
}
break;
default:
{
// 其他情况略
}
break;
}
return Json(new { code = "SUCCESS", message = "成功" });
}
var callbackModel = client.DeserializeEvent(content);
var eventType = callbackModel.EventType?.ToUpper();
switch (eventType)
{
case "TRANSACTION.SUCCESS":
{
var callbackResource = client.DecryptEventResource<Events.TransactionResource>(callbackModel);
Debug.WriteLine("接收到微信支付推送的订单支付成功通知,商户订单号:{0}", callbackResource.OutTradeNumber);
// 后续处理略
}
break;
default:
{
// 其他情况略
}
break;
}
return Json(new { code = "SUCCESS", message = "成功" });
}
}
}

View File

@@ -1,14 +1,14 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
{
[RoutePrefix("api/order")]
public class TenpayOrderController : ApiController
{
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _tenpayHttpClientFactory;
private readonly Services.HttpClients.IWechatTenpayClientFactory _wechatTenpayClientFactory;
public TenpayOrderController(
Services.HttpClients.IWechatTenpayHttpClientFactory tenpayHttpClientFactory)
Services.HttpClients.IWechatTenpayClientFactory wechatTenpayClientFactory)
{
_tenpayHttpClientFactory = tenpayHttpClientFactory;
_wechatTenpayClientFactory = wechatTenpayClientFactory;
}
[HttpPost]
@@ -18,7 +18,7 @@
if (requestModel == null)
return BadRequest();
var client = _tenpayHttpClientFactory.Create(requestModel.MerchantId);
using var client = _wechatTenpayClientFactory.Create(requestModel.MerchantId);
var request = new CreatePayTransactionJsapiRequest()
{
OutTradeNumber = "SAMPLE_OTN_" + DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff"),
@@ -33,7 +33,7 @@
{
Debug.WriteLine(
"JSAPI 下单失败(状态码:{0},错误代码:{1},错误描述:{2})。",
response.RawStatus, response.ErrorCode, response.ErrorMessage
response.GetRawStatus(), response.ErrorCode, response.ErrorMessage
);
}

View File

@@ -1,14 +1,14 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Controllers
{
[RoutePrefix("api/refund")]
public class TenpayRefundController : ApiController
{
private readonly Services.HttpClients.IWechatTenpayHttpClientFactory _tenpayHttpClientFactory;
private readonly Services.HttpClients.IWechatTenpayClientFactory _wechatTenpayClientFactory;
public TenpayRefundController(
Services.HttpClients.IWechatTenpayHttpClientFactory tenpayHttpClientFactory)
Services.HttpClients.IWechatTenpayClientFactory wechatTenpayClientFactory)
{
_tenpayHttpClientFactory = tenpayHttpClientFactory;
_wechatTenpayClientFactory = wechatTenpayClientFactory;
}
[HttpPost]
@@ -18,7 +18,7 @@
if (requestModel == null)
return BadRequest();
var client = _tenpayHttpClientFactory.Create(requestModel.MerchantId);
using var client = _wechatTenpayClientFactory.Create(requestModel.MerchantId);
var request = new CreateRefundDomesticRefundRequest()
{
TransactionId = requestModel.TransactionId,
@@ -36,7 +36,7 @@
{
Debug.WriteLine(
"申请退款失败(状态码:{0},错误代码:{1},错误描述:{2})。",
response.RawStatus, response.ErrorCode, response.ErrorMessage
response.GetRawStatus(), response.ErrorCode, response.ErrorMessage
);
}

View File

@@ -2,12 +2,12 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.BackgroundJobs
{
internal class TenpayCertificateRefreshingBackgroundJob
{
private readonly HttpClients.IWechatTenpayHttpClientFactory _tenpayHttpClientFactory;
private readonly HttpClients.IWechatTenpayClientFactory _wechatTenpayClientFactory;
public TenpayCertificateRefreshingBackgroundJob(
HttpClients.IWechatTenpayHttpClientFactory tenpayHttpClientFactory)
HttpClients.IWechatTenpayClientFactory wechatTenpayClientFactory)
{
_tenpayHttpClientFactory = tenpayHttpClientFactory;
_wechatTenpayClientFactory = wechatTenpayClientFactory;
}
public async Task ExecuteAsync()
@@ -17,7 +17,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.BackgroundJobs
try
{
const string ALGORITHM_TYPE = "RSA";
var client = _tenpayHttpClientFactory.Create(tenpayMerchantOptions.MerchantId);
var client = _wechatTenpayClientFactory.Create(tenpayMerchantOptions.MerchantId);
var request = new QueryCertificatesRequest() { AlgorithmType = ALGORITHM_TYPE };
var response = await client.ExecuteQueryCertificatesAsync(request);
if (response.IsSuccessful())
@@ -28,7 +28,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.BackgroundJobs
foreach (var certificate in response.CertificateList)
{
client.CertificateManager.AddEntry(new CertificateEntry(ALGORITHM_TYPE, certificate));
client.CertificateManager.AddEntry(CertificateEntry.Parse(ALGORITHM_TYPE, certificate));
}
Debug.WriteLine("刷新微信商户平台证书成功。");
@@ -37,7 +37,7 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.BackgroundJobs
{
Debug.WriteLine(
"刷新微信商户平台证书失败(状态码:{0},错误代码:{1},错误描述:{2})。",
response.RawStatus, response.ErrorCode, response.ErrorMessage
response.GetRawStatus(), response.ErrorCode, response.ErrorMessage
);
}
}

View File

@@ -0,0 +1,7 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients
{
public interface IWechatTenpayClientFactory
{
WechatTenpayClient Create(string merchantId);
}
}

View File

@@ -1,7 +0,0 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients
{
public interface IWechatTenpayHttpClientFactory
{
WechatTenpayClient Create(string merchantId);
}
}

View File

@@ -1,10 +1,10 @@
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients.Implements
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients.Implements
{
internal partial class WechatTenpayHttpClientFactory : IWechatTenpayHttpClientFactory
internal partial class WechatTenpayClientFactory : IWechatTenpayClientFactory
{
private readonly IWechatTenpayCertificateManagerFactory _tenpayCertificateManagerFactory;
public WechatTenpayHttpClientFactory(
public WechatTenpayClientFactory(
IWechatTenpayCertificateManagerFactory tenpayCertificateManagerFactory)
{
_tenpayCertificateManagerFactory = tenpayCertificateManagerFactory;