You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建Stripe Connect账户实体前收到AccountUpdated Webhook的处理问询

问题

我正在使用Stripe为用户添加Connect账户(银行账户),并已设置服务器监听传入的Webhook。在控制器中,我先创建Stripe Connect账户,再将新账户数据填充到自定义的StripeAccount实体中,代码如下:

// Stripe API call to create bank account
var service = new AccountService();
account = await service.CreateAsync(options);

// create a new entity in my db 
var stripeAccount = new StripeAccount {
    UserId = userFromRepo.Id,
    AccountId = account.Id;
    // fill in other fields...
};

_unitOfWork.Repository<StripeAccount>().Add(stripeAccount);
var success = await _unitOfWork.Complete();
if (success) {
    // send out email to user
}

Stripe会在我的服务器将新实体保存到数据库前,立即发送AccountUpdated Webhook。通常AccountCreated和AccountUpdated事件的时间戳相同。

请问:在监听Webhook的控制器中,我是否应检查实体是否已创建,若不存在则返回404状态码给Stripe,等待其重新发送?

补充说明:根据Stripe官方文档中关于内置重试机制的内容,他们建议返回200状态码,并且提到“如果Stripe未快速收到事件的2xx响应状态码,会将该事件标记为失败并停止尝试发送到你的端点。”

建议
  • 绝对不要返回404或非2xx状态码:按照Stripe官方要求,只要服务器成功接收Webhook事件,就必须返回2xx状态码。返回非2xx会让Stripe判定你的端点无法处理事件,直接停止重试,最终导致事件丢失。
  • 处理事件时做好幂等性保障:由于AccountCreated和AccountUpdated可能提前于本地StripeAccount实体创建到达,Webhook处理逻辑要这么做:
    1. 先查询本地数据库是否存在对应AccountId的StripeAccount实体;
    2. 如果不存在,不要返回错误,而是暂存事件(比如存入待处理队列)或定期重试查询数据库,直到实体创建完成后再处理;
    3. 如果实体已存在,直接根据事件更新对应数据即可。
  • 优化本地数据保存流程:可以在调用Stripe的CreateAsync后,先创建仅包含AccountId、UserId等核心字段的基础StripeAccount实体并提交保存,之后再补充其他字段。这样能大幅缩短Webhook到达时本地实体不存在的时间窗口,减少待处理事件的情况。
  • 用Stripe事件ID做幂等键:每个Stripe事件都有唯一的id,可以在数据库中记录已处理的事件ID,避免重复处理同一事件,这是Webhook处理的标准操作。

内容的提问来源于stack exchange,提问作者chuckd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:07:26