如何在Laravel Cashier中模拟发票金额且不更新Stripe订阅数量?
实现订阅数量变更前的金额预估(Laravel Cashier + Stripe)
可以通过Stripe原生API结合Laravel Cashier实现这个需求,以下是两种可行方案:
方案1:利用Stripe API精准计算预估金额
Stripe的Invoice.upcoming接口可以模拟订阅变更后的发票金额,自动处理税费、折扣、优惠券等复杂规则,结果完全匹配实际生成的发票。
代码示例
// 获取用户当前订阅实例 $subscription = $user->subscription('default'); $newQuantity = 5; // 用户想要变更到的新数量 // 调用Stripe upcoming invoice接口计算预估金额 \Stripe\Stripe::setApiKey(config('cashier.secret')); $upcomingInvoice = \Stripe\Invoice::upcoming([ 'customer' => $subscription->customer->stripe_id, 'subscription' => $subscription->stripe_id, 'subscription_items' => [ [ 'id' => $subscription->items->first()->stripe_id, 'quantity' => $newQuantity, ] ], ]); // 转换为实际货币单位(Stripe返回金额为分) $estimatedAmount = $upcomingInvoice->total / 100;
方案2:本地简易计算(适合无复杂定价规则场景)
如果你的订阅没有折扣、多级税费等复杂配置,可以直接基于订阅单价计算,实现更简单:
代码示例
$subscription = $user->subscription('default'); $newQuantity = 5; // 获取订阅单价(转换为元) $unitPrice = $subscription->items->first()->price->unit_amount / 100; $estimatedAmount = $unitPrice * $newQuantity; // 可选:手动计算税费(如果配置了Cashier税费) if ($taxRate = config('cashier.tax_rates')[0] ?? null) { $estimatedAmount += $estimatedAmount * ($taxRate['percentage'] / 100); }
用户确认后执行实际变更
当用户确认预估金额后,使用Laravel Cashier内置方法更新Stripe订阅数量:
$subscription->updateQuantity($newQuantity);
注意事项
- 若订阅包含多个订阅项,需遍历所有项分别调整数量并计算预估金额
- 调用Stripe API时需捕获异常,处理网络错误、参数无效等情况
- 仅对活跃状态的订阅能成功计算upcoming invoice
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

