🚀 ABP VNext + Webhook:订阅与异步回调
📚 目录
🎯 一、背景切入:如何优雅地支持第三方回调?
在现代分布式系统中,Webhook 是实现系统解耦和异步通知的重要手段,广泛用于支付通知、审核结果返回、消息推送等场景。但在实践中,我们需要同时解决以下挑战:
- 🔐 安全防护:如何防止伪造请求?
- 🔄 幂等控制:如何避免重复处理同一事件?
- ⚙️ 失败重试:如何确保最终一致性,并避免无限重试?
- 💼 多厂商 & 多通道:如何优雅地支持不同支付/消息通道?
- 📊 可观测 & 可运维:如何快速诊断、监控并手动补偿?
🏗 二、系统架构设计
🔍 三、核心能力实现
3.1 🔐 签名验证(防伪造)
接口定义
public interface ISignatureVerifier
{
/// <summary>从安全配置中心获取 Secret</summary>
string GetSecret(string provider);
/// <summary>签名 Header 名</summary>
string HeaderName {
get; }
bool Verify(string payload, string signature);
}
实现示例(Wxpay)
public class WxSignatureVerifier : ISignatureVerifier, ITransientDependency
{
private readonly IDynamicParameterStore _paramStore;
public string HeaderName {
get; } = "X-Wxpay-Signature";
public WxSignatureVerifier(IDynamicParameterStore paramStore)
=> _paramStore = paramStore;
public string GetSecret(string provider)
=> _paramStore.GetOrNullAsync($"Webhook:Secret:{
provider}")
.GetAwaiter().GetResult()
?? throw new BusinessException("未配置签名 Secret");
public bool Verify(string payload, string signature)
{
var secret = GetSecret("Wxpay");
var expected = ComputeHmac(payload, secret);
return ConstantTimeEquals(expected, signature);
}
private static string ComputeHmac(string data, string key)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
return Convert.ToHexString(hmac.ComputeHash(Encoding.UTF8.GetBytes(data)))
.ToLowerInvariant();
}
private static bool ConstantTimeEquals(string a,

最低0.47元/天 解锁文章
3130

被折叠的 条评论
为什么被折叠?



