如何在Laravel或Stripe API中阻止订阅创建/更新时使用客户余额(信用额)
问题
使用Stripe订阅服务与客户余额(信用额)功能时,默认会自动用客户的信用额抵扣下一张发票或订阅付款。但业务场景需要针对特定订阅创建/更新操作,完全跳过信用额,直接从客户默认支付方式(如银行卡)收取全额费用。例如客户有50美元信用额,创建100美元订阅时,需向银行卡收取全额100美元,而非扣除信用额后收50美元。
当前使用Laravel Cashier + Stripe PHP SDK的简化代码:
$subscription = $client->newSubscription('default', $planId) ->skipTrial() ->noProrate() ->create( $client->defaultPaymentMethod()->id, [], [ 'payment_behavior' => 'error_if_incomplete', 'metadata' => $metadata, ] );
查阅Stripe文档后未找到直接跳过信用额的参数。
解决方案
Stripe本身没有直接在订阅创建时跳过客户余额的顶层参数,但可以通过控制订阅生成的发票行为来实现需求:
- 在订阅创建的Stripe API参数中,通过
invoice_creation.invoice_data传递apply_customer_balance参数并设为false,这样生成的发票不会自动应用客户余额,付款时就只会从指定的支付方式全额扣款。
修改后的代码示例:
$subscription = $client->newSubscription('default', $planId) ->skipTrial() ->noProrate() ->create( $client->defaultPaymentMethod()->id, [], [ 'payment_behavior' => 'error_if_incomplete', 'metadata' => $metadata, 'invoice_creation' => [ 'enabled' => true, 'invoice_data' => [ 'apply_customer_balance' => false, ], ], ] );
- 原理说明:当创建订阅时,Stripe会自动生成对应的发票,
apply_customer_balance设为false会强制该发票忽略客户的可用信用额,完全依赖指定的支付方式完成付款。
如果是更新现有订阅,同样可以在update方法的参数中加入上述invoice_creation配置,确保后续生成的发票不应用客户余额。
内容的提问来源于stack exchange,提问作者Rosh
相关产品推荐
相关产品推荐

