Stripe Webhook 不是一次回调:Tuziyo 如何处理幂等与订阅状态同步
· 阅读需 12 分钟
最近在给 Tuziyo 接入 Stripe 订阅支付。
最开始的目标看起来很简单:用户选择套餐,跳转到 Stripe Checkout,支付成功后升级会员并发放 Credits。但真正开始处理续费、支付失败、取消订阅和年度套餐后,我发现支付成功页面只是整个流程中最轻的一部分。
真正决定这套系统能不能稳定运行的,是 Webhook。
Stripe 的事件可能延迟、乱序,也可能因为超时被重复投递。如果把每一次 Webhook 都当成只会执行一次的普通回调,最直接的后果就是重复发放 Credits,或者 Stripe 和本地数据库中的订阅状态不一致。
这篇文章记录 Tuziyo 当前订阅了哪些 Stripe 事件、每个事件做了什么,以及我如何用 Cloudflare Workers 和 D1 处理 Webhook 幂等与订阅状态同步。