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

使用Next.js 13 API与Stripe时订阅创建触发重复事件问题

解决Stripe创建订阅时同时触发两个Webhook事件的问题

Stripe在创建订阅时,若涉及付款确认、订阅状态即时变更(比如从incomplete转为active),会同时触发customer.subscription.created和customer.subscription.updated事件,这是平台的正常行为,无法直接阻止Stripe发送该更新事件,但可以通过代码过滤掉这类属于创建流程的更新操作,只处理真正的订阅创建逻辑。

解决方案:过滤创建流程中的更新事件

在处理customer.subscription.updated事件时,添加判断逻辑,识别出属于订阅创建过程的更新并跳过处理,只保留真正的订阅更新操作(比如用户升级/降级计划、暂停订阅等)。修改后的代码如下:

event = stripe.webhooks.constructEvent(buf, sig, webhookSecret)

switch (event.type) {
case 'customer.subscription.created':
    console.log('subscription created');
    // 在这里执行你的订阅创建处理逻辑
    break
case 'customer.subscription.updated':
    const subscription = event.data.object;
    // 判断是否是订阅创建流程中触发的更新事件
    // 逻辑1:订阅创建时间与更新时间间隔极短(小于5秒)
    const isCreatedUpdate = (subscription.updated - subscription.created) < 5;
    // 逻辑2:更新前无状态记录(说明是刚创建后的首次更新)
    const hasNoPreviousStatus = !event.data.previous_attributes?.status;
    
    if (isCreatedUpdate || hasNoPreviousStatus) {
        // 跳过创建流程附带的更新事件
        console.log('Skipping subscription update from creation flow');
        break;
    }
    // 这里处理真正的订阅更新逻辑
    console.log('subscription updated');
    break
default:
    console.warn(`Unhandled event type: ${event.type}`);
    break
}

额外说明

如果你完全不需要处理任何订阅更新操作,也可以直接删除customer.subscription.updated的case分支,但这样会漏掉用户后续主动修改订阅的场景,因此更推荐上述过滤方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:42:12