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

如何使用Laravel Cashier/Spark 2.0实现Stripe差异化订阅定价?

Laravel Cashier/Spark 2.0 实现Stripe阶梯定价订阅方案

你需要的前3个月19.99美元/月、第4个月起39.99美元/月的订阅规则,可通过以下两种路径实现,优先推荐无需额外开发的Stripe原生优惠券方案:


方案1:基于Laravel Cashier实现

方法A:Stripe原生优惠券方案(最推荐)

该方案无需编写定时任务,所有扣费逻辑由Stripe原生处理,无计费误差风险:

  • 第一步:在Stripe后台创建两张资源
    • 常规订阅价格:创建每月自动续费的价格ID price_xxx_3999,金额39.99美元/月
    • 专属优惠券:创建固定金额减免优惠券,减免金额20美元,有效期设置为重复3个计费周期,获取优惠券ID coupon_xxx
  • 第二步:调用Cashier创建订阅时附带优惠券即可
$user->newSubscription('default', 'price_xxx_3999')
    ->withCoupon('coupon_xxx')
    ->create($paymentMethodId);

Stripe会自动在前3个计费周期每个月减免20美元,实扣19.99美元,第4个月起自动恢复39.99美元扣费。

方法B:手动调度价格切换

如果后续需要自定义更多计费规则,可以用Laravel任务调度主动切换价格:

  • 先在Stripe后台创建两个价格:优惠价price_xxx_1999(19.99美元/月)、常规价price_xxx_3999(39.99美元/月)
  • 用户首次订阅时默认关联优惠价
  • 在app/Console/Kernel.php中添加定时任务,每天检查订阅到期情况,自动切换价格:
$schedule->call(function () {
    \Laravel\Cashier\Subscription::where('stripe_price', 'price_xxx_1999')
        ->where('created_at', '<=', now()->subMonths(3))
        ->each(function ($subscription) {
            // 第二个参数关闭按天比例扣费,保持原有计费周期不变
            $subscription->swap('price_xxx_3999', ['prorate' => false]);
        });
})->daily();

方案2:基于Laravel Spark 2.0实现

Spark 2.0可以直接复用上述优惠券方案,仅需要在订阅创建钩子中注入优惠券参数即可:

  • 同样先在Stripe后台创建常规价price_xxx_3999和3周期有效期的20美元优惠券coupon_xxx
  • 在Spark服务提供者中重写订阅创建逻辑:
Spark::createSubscriptionsUsing(function ($billable, $plan, $paymentMethod, $options) {
    return $billable->newSubscription('default', $plan->stripeId)
        ->withCoupon('coupon_xxx')
        ->create($paymentMethod, $options);
});

注意事项

  • 所有Stripe资源ID(价格ID、优惠券ID)建议存放在.env配置文件中,不要硬编码在业务代码里
  • 如果需要支持用户升级/降级订阅,可在对应逻辑中判断订阅有效期,灵活调整优惠券或价格规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:09:02