ABP VNext + Webhook:订阅与异步回调

🚀 ABP VNext + Webhook:订阅与异步回调



🎯 一、背景切入:如何优雅地支持第三方回调?

在现代分布式系统中,Webhook 是实现系统解耦和异步通知的重要手段,广泛用于支付通知、审核结果返回、消息推送等场景。但在实践中,我们需要同时解决以下挑战:

  • 🔐 安全防护:如何防止伪造请求?
  • 🔄 幂等控制:如何避免重复处理同一事件?
  • ⚙️ 失败重试:如何确保最终一致性,并避免无限重试?
  • 💼 多厂商 & 多通道:如何优雅地支持不同支付/消息通道?
  • 📊 可观测 & 可运维:如何快速诊断、监控并手动补偿?

🏗 二、系统架构设计

支付厂商
🔐 签名验证
🔄 幂等校验
💾 日志持久化
💾 日志持久化
🔄 重试调度
📈 指标埋点
📈 指标埋点
📊 可视化
微信支付
支付宝
Stripe
Webhook 接收中心
签名验证服务
幂等校验服务
WebhookLog 存储
后台重试调度中心
Prometheus
Grafana

🔍 三、核心能力实现

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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kookoos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值