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

如何通过Stripe API仅对首次订阅发票应用优惠券折扣

实现Stripe订阅首单仅应用优惠券的方案

要实现订阅首张发票用优惠券、后续按原价收费的需求,核心是不要将优惠券直接绑定到订阅上,而是仅针对订阅生成的首张发票单独应用优惠券。以下是两种可靠的实现方式:

方式一:创建订阅后立即修改首张发票

当你创建订阅时,Stripe会自动生成首张发票。你可以在创建订阅的同时获取到该发票,然后立即为其添加优惠券:

const stripe = require('stripe')('你的API密钥');

// 创建订阅
const subscription = await stripe.subscriptions.create({
  customer: 'cus_XXXXXX', // 目标客户ID
  items: [{ price: 'price_XXXXXX' }], // 订阅对应的价格ID
  payment_behavior: 'default_incomplete', // 让发票处于未支付状态,方便修改
  expand: ['latest_invoice'], // 展开获取首张发票信息
});

// 为首张发票应用优惠券
await stripe.invoices.modify(
  subscription.latest_invoice.id,
  { coupon: 'coupon_XXXXXX' } // 你的优惠券ID
);

// 可选:如果需要立即完成支付,确认发票支付
await stripe.invoices.pay(subscription.latest_invoice.id);

注意事项

  • 如果你的订阅是即时扣费(无试用),设置payment_behavior: 'default_incomplete'可以避免发票在你修改前就完成支付,确保优惠券能被正确应用。
  • 必须确保在发票处于draft或open状态时修改它,一旦发票支付完成就无法再添加优惠券。

方式二:通过Webhook监听首张发票并应用优惠券

如果订阅包含试用周期,首张发票会在试用结束后才生成,这时候用Webhook监听invoice.created事件更可靠:

// 处理Stripe Webhook请求的示例(Node.js)
app.post('/stripe-webhook', async (req, res) => {
  const event = req.body;

  if (event.type === 'invoice.created') {
    const invoice = event.data.object;
    // 判断是否是订阅的首张发票:sequence为1代表是该订阅的第一张发票
    if (invoice.sequence === 1) {
      await stripe.invoices.modify(invoice.id, {
        coupon: 'coupon_XXXXXX'
      });
    }
  }

  res.json({ received: true });
});

关键逻辑

  • invoice.sequence字段标识了该发票是订阅的第几张发票,值为1时即为首张发票。
  • 确保你的Webhook已正确注册invoice.created事件,并且验证了Stripe的签名,避免恶意请求。

禁止操作

不要直接在subscriptions.create()中传递coupon参数,因为这会让优惠券自动应用到该订阅的所有后续发票,不符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:10:45