Laravel Cashier集成Stripe:按用量计费订阅立即收费问题
解决Laravel Cashier + Stripe计量订阅立即收费问题
问题根源
Stripe计量订阅默认会在计费周期结束时才累计已上报的使用量并生成发票,因此刚创建订阅时生成的初始发票金额为0,你上报的成员数量会被计入下一个计费周期,导致首月无法立即收费。
解决方案
在创建订阅并上报初始使用量后,调用Cashier的invoiceNow()方法强制生成即时发票,收取当前未结算的使用量费用。
修改后的代码
private function createSubscriptionForGoldPlan(Company $company): void { $pricing = $this->subscriptionService->getGoldMonthlyPricingId(); $numberMembers = $company->members()->count(); // 创建计量型订阅 $subscription = $company ->newSubscription('default') ->meteredPrice($pricing) ->create(); // 上报初始成员数量作为使用量 $subscription->reportUsageFor($pricing, $numberMembers); // 立即生成发票并自动扣费 $subscription->invoiceNow(); }
关键说明
- 为什么
quantity()参数会报错:计量订阅的使用量只能通过reportUsageFor()上报,不能直接用quantity()设置,二者互斥,因此会触发Stripe API错误。 invoiceNow()的作用:该方法会强制Stripe生成一张包含当前所有未结算使用量的即时发票,跳过默认的周期等待逻辑,实现订阅创建后立即扣费。- 后续计费逻辑:首月费用收取后,后续每个计费周期Stripe会自动累计你上报的使用量并生成发票,无需再次调用
invoiceNow()。
注意事项
- 确认Stripe后台的Gold套餐价格是**计量型(Metered)**的月度 recurring价格。
- 确保用户绑定的支付方式有效,否则
invoiceNow()会触发付款失败,需要通过Stripe Webhook处理这类异常场景。
内容的提问来源于stack exchange,提问作者Bruno Francisco
相关产品推荐
相关产品推荐

