如何在Stripe结账页面同时支持订阅模式与一次性支付产品?
在Stripe结账会话中同时支持订阅与一次性支付的实现方案
你需要在同一Stripe结账页面中混合订阅型产品和一次性附加项,核心是利用Stripe Checkout的subscription模式支持混合订阅/一次性价格的特性,具体实现有两种可行方式:
方式一:通过Line Items混合订阅与一次性Price
这种方式适合有固定附加项的场景,需要先为一次性附加项创建**类型为one_time**的Price对象(可在Stripe后台或通过API创建),然后将其加入结账会话的line_items列表即可。
修改后的代码示例
// 初始化订阅产品的line item const lineItems = [ { price: priceId, // 99美元的订阅Price ID quantity: 1, } ]; // 根据用户选择,添加一次性附加项的line item if (userSelectedAddOn) { // 这里替换为你判断用户是否选择附加项的逻辑 lineItems.push({ price: oneTimeAddOnPriceId, // 10美元的一次性Price ID quantity: 1, }); } // 构建结账会话对象 const sessionObj = { mode: "subscription", line_items: lineItems, subscription_data: { metadata }, metadata, success_url: `${Meteor.settings.private.PUBLIC_SITE_URL}/contact-us`, cancel_url: `${Meteor.settings.private.PUBLIC_SITE_URL}/payment-failure`, payment_method_types: ["card"] } const stripeRes = await stripe.checkout.sessions.create(sessionObj);
方式二:通过订阅数据动态添加一次性费用
如果不需要提前创建一次性Price对象,可以通过subscription_data.add_invoice_items动态生成一次性收费项,适合需要动态计算金额的场景。
修改后的代码示例
const sessionObj = { mode: "subscription", line_items: [ { price: priceId, // 99美元的订阅Price ID quantity: 1, } ], subscription_data: { metadata, // 动态添加10美元的一次性附加项 add_invoice_items: [ { price_data: { currency: "usd", unit_amount: 1000, // 金额单位为分,对应10美元 product_data: { name: "10美元充值附加项" // 附加项名称,会显示在结账页面 } }, quantity: 1 } ] }, metadata, success_url: `${Meteor.settings.private.PUBLIC_SITE_URL}/contact-us`, cancel_url: `${Meteor.settings.private.PUBLIC_SITE_URL}/payment-failure`, payment_method_types: ["card"] } const stripeRes = await stripe.checkout.sessions.create(sessionObj);
关键说明
- Stripe会自动区分两种收费类型:订阅型Price会生成定期循环的订阅,一次性Price/附加项仅在首次结账时收取,不会进入后续订阅周期。
- 结账页面会清晰展示订阅金额和一次性金额的明细,用户可以明确看到费用构成。
内容的提问来源于stack exchange,提问作者Srushti Shah
相关产品推荐
相关产品推荐

