Laravel Cashier invoicePrice()无效,无法生成Stripe发票并扣费
解决Laravel Cashier + Stripe 扣费并生成可管理发票的问题
问题根源
你使用的invoicePrice()方法是针对订阅场景的(比如生成订阅周期的发票),并非用于单次即时扣费+发票生成的场景,所以单独调用不会触发扣费,也不会生成有效记录。
另外:
charge()是直接发起单次扣费,不会生成Cashier可通过$user->invoices()管理的发票记录;invoiceFor()仅创建发票(添加自定义金额项),不会自动执行扣费,需手动触发支付。
正确实现步骤
要实现「即时扣费+生成可管理发票」,需要创建发票并立即支付,具体代码如下:
1. 确保用户有默认支付方式
扣费需要使用用户的默认支付方式,所以先检查并设置:
if (!$user->hasDefaultPaymentMethod()) { // 先添加支付方式,再设为默认 $user->addPaymentMethod($paymentMethod); $user->updateDefaultPaymentMethod($paymentMethod); }
2. 创建发票并立即支付
使用invoice()方法添加Stripe价格项目,然后调用pay()触发扣费:
try { // 创建包含指定价格的发票 $invoice = $user->invoice( [ 'price_xxxxxxx' => 1, // 你的Stripe价格ID + 购买数量 ], [ 'description' => 'this is a dummy description', 'receipt_email' => 'john@doe.com', 'currency' => 'usd', ] ); // 立即支付该发票 $invoice->pay(); // 此时可通过$user->invoices()获取到该发票记录 } catch (\Exception $e) { // 捕获并输出错误信息,排查问题 dd($e->getMessage()); }
额外排查点
- 确认
.env文件中STRIPE_KEY、STRIPE_SECRET配置正确; - 确认用户表已添加Cashier所需字段(运行过
php artisan cashier:install迁移); - 检查Stripe后台的产品/价格是否处于激活状态;
- 确保
$paymentMethod是有效的Stripe支付方式ID(如pm_xxxxxxx)。
内容的提问来源于stack exchange,提问作者Tammy06
相关产品推荐
相关产品推荐

