创建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处理逻辑要这么做:- 先查询本地数据库是否存在对应
AccountId的StripeAccount实体; - 如果不存在,不要返回错误,而是暂存事件(比如存入待处理队列)或定期重试查询数据库,直到实体创建完成后再处理;
- 如果实体已存在,直接根据事件更新对应数据即可。
- 先查询本地数据库是否存在对应
- 优化本地数据保存流程:可以在调用Stripe的
CreateAsync后,先创建仅包含AccountId、UserId等核心字段的基础StripeAccount实体并提交保存,之后再补充其他字段。这样能大幅缩短Webhook到达时本地实体不存在的时间窗口,减少待处理事件的情况。 - 用Stripe事件ID做幂等键:每个Stripe事件都有唯一的
id,可以在数据库中记录已处理的事件ID,避免重复处理同一事件,这是Webhook处理的标准操作。
内容的提问来源于stack exchange,提问作者chuckd
相关产品推荐
相关产品推荐

