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

如何用Stripe CLI触发指定客户的invoice.payment_failed事件并获取邮箱

解决Stripe invoice.payment_failed事件测试与Webhook处理问题

一、测试指定客户的invoice.payment_failed事件

直接用--add invoice:customer参数无法生效,因为Stripe Trigger生成invoice时依赖关联的订阅对象,customer字段会从订阅继承,不能直接修改。正确做法如下:

  1. 先创建指定客户的测试订阅
    用Stripe CLI创建一个关联目标客户的测试订阅:

    stripe subscriptions create --customer="YOUR_CUSTOMER_ID" --price="YOUR_TEST_PRICE_ID"
    

    替换YOUR_CUSTOMER_ID为你的目标客户ID,YOUR_TEST_PRICE_ID为测试用的价格ID(可在Stripe后台创建测试价格)。

  2. 触发关联该订阅的支付失败事件
    用刚创建的订阅ID触发事件,生成的invoice会自动关联目标客户:

    stripe trigger invoice.payment_failed --add invoice:subscription="YOUR_SUBSCRIPTION_ID"
    
  3. Fixture修改方案
    若要通过Fixture调整,需修改invoice fixture中的subscription字段为目标订阅ID,而非直接修改customer字段。Stripe Trigger会基于订阅自动填充对应customer信息。

二、从invoice.payment_failed事件中获取用户信息并更新状态

invoice.payment_failed事件的Invoice对象没有customer_details字段,但有两种可靠方式获取用户信息:

方式1:直接使用Invoice对象的customer_email字段

Invoice对象本身包含customer_email字段(若发票来自Checkout流程),可直接提取使用:

case 'invoice.payment_failed': {
    const { customer_email } = event.data.object;
    await User.findOneAndUpdate({ email: customer_email }, { status: 'pastMember' });
    break;
}

方式2:通过客户ID关联元数据(更可靠)

在checkout.session.completed中你已给Stripe客户添加mongoId元数据,直接通过客户ID查询元数据定位用户,避免邮箱变更导致匹配失败:

case 'invoice.payment_failed': {
    const { customer: customerId } = event.data.object;
    // 检索Stripe客户信息
    const customer = await instance.customers.retrieve(customerId);
    const mongoId = customer.metadata.mongoId;
    if (mongoId) {
        await User.findByIdAndUpdate(mongoId, { status: 'pastMember' });
    }
    break;
}

注意:确保instance是已正确初始化的Stripe客户端实例,且服务器具备检索客户信息的权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:56:12