如何通过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
相关产品推荐
相关产品推荐

