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

Laravel+Stripe实现订阅与普通商品同时结账可行性问询

当然可行!Stripe完美支持混合结账场景

我之前刚好做过类似的需求——把订阅商品和普通一次性商品放在同一购物车完成结账,Stripe提供了直接的方案来实现,具体思路如下:

核心实现方式:用Stripe Checkout创建混合商品会话

你只需要在创建Checkout Session时,同时传入订阅价格ID和普通商品价格ID,Stripe会自动处理两种类型的商品结算:

示例代码(Node.js)

const stripe = require('stripe')('your_secret_key');

const createMixedCheckoutSession = async (req, res) => {
  const session = await stripe.checkout.sessions.create({
    payment_method_types: ['card'],
    // 同时包含订阅和一次性商品的商品项
    line_items: [
      {
        price: 'price_subscription_monthly', // 你的订阅价格ID
        quantity: 1,
      },
      {
        price: 'price_one_time_tshirt', // 普通一次性商品的价格ID
        quantity: 2,
      },
    ],
    mode: 'subscription', // 必须设为subscription,因为会话包含订阅
    success_url: 'https://your-app.com/success?session_id={CHECKOUT_SESSION_ID}',
    cancel_url: 'https://your-app.com/cancel',
  });

  res.json({ url: session.url });
};

关键细节说明

  • 当mode设为subscription时,一次性商品会被当作订阅的初始附加费用,用户结账时会一次性支付「订阅首周期费用 + 一次性商品总金额」,之后订阅会按设定的周期自动扣费。
  • 如果你的场景是用户可能只买一次性商品,也可能混合购买,后端可以根据购物车内容动态设置mode:如果包含订阅就设为subscription,否则设为payment。

后续事件处理:用Webhook同步状态

结账完成后,你需要监听Stripe的Webhook事件来同步自己系统的数据:

  • checkout.session.completed:这个事件会返回完整的会话信息,包括订阅ID、一次性付款的charge ID,你可以用它来更新订单状态、激活用户订阅。
  • customer.subscription.created:订阅成功创建时触发,用来处理订阅相关的后续逻辑(比如给用户开通会员权限)。
  • charge.succeeded:一次性商品付款成功时触发,用来更新普通商品的订单发货状态等。

前端购物车的适配

在你的购物车页面里,只需要把订阅商品和普通商品统一展示,用户选择后收集对应的price_id和quantity,传给后端创建Checkout Session即可——不需要做特殊区分,Stripe Checkout页面会自动展示两种商品的明细,包括订阅的计费周期说明。

注意事项

  • 确保你的Stripe账户已经启用订阅功能(默认是开启的,可在Stripe后台「产品」板块确认)。
  • 订阅价格要设置正确的计费周期(月/年等),一次性商品的价格类型要选「一次性」而非「重复」。
  • 优惠券的适用范围:如果要给混合结账用优惠券,需要创建适用「所有产品」的优惠券,否则可能只生效在订阅或一次性商品上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:00:52