如何使用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
- 常规订阅价格:创建每月自动续费的价格ID
- 第二步:调用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
相关产品推荐
相关产品推荐

