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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:27:05