使用Laravel Cashier创建Stripe发票总金额显示为0的问题排查
问题分析
你遇到的核心问题是invoicePrice方法的使用误区:这个方法仅负责将指定价格添加为用户的待处理发票项,并不会自动生成发票、完成支付流程。这就是为什么你会看到待处理发票项数量和0金额发票一一对应——系统没有触发发票的结算动作,只创建了空的发票框架。
解决方案
针对一次性收费场景,有两种更合适的实现方式:
方式一:直接使用charge方法(推荐)
charge方法会直接创建Stripe支付记录,同时自动生成对应金额的发票,一步完成流程:
public function purchase(Request $request, SubscriptionPlan $subscriptionPlan) { try { $user = auth()->user(); $user->createOrGetStripeCustomer(); $user->updateStripeCustomer([ 'address' => ['country' => 'CA'], 'preferred_locales' => ['fr-CA'] ]); // 直接发起一次性收费 $user->charge( $subscriptionPlan->stripe_price_id, $request->paymentMethod, [ 'receipt_email' => $user->email, ] ); } catch (\Exception $exception) { \Log::debug($exception->getMessage()); return back()->with('error', $exception->getMessage()); } return back()->with('success', 'Paiement effectué avec succès!'); }
方式二:补全发票结算流程(若需保留待处理项逻辑)
如果一定要通过invoicePrice添加待处理项,必须手动触发发票生成和支付:
public function purchase(Request $request, SubscriptionPlan $subscriptionPlan) { try { $user = auth()->user(); $user->createOrGetStripeCustomer(); $user->updateStripeCustomer([ 'address' => ['country' => 'CA'], 'preferred_locales' => ['fr-CA'] ]); $user->updateDefaultPaymentMethod($request->paymentMethod); // 添加待处理发票项 $user->invoicePrice($subscriptionPlan->stripe_price_id, 1); // 生成发票并完成支付 $invoice = $user->invoice(); $invoice->pay(); } catch (\Exception $exception) { \Log::debug($exception->getMessage()); return back()->with('error', $exception->getMessage()); } return back()->with('success', 'Paiement effectué avec succès!'); }
额外检查点
- 确认
$subscriptionPlan->stripe_price_id是有效的Stripe价格ID(格式为price_xxxxxx,而非产品ID) - 验证
$request->paymentMethod是已成功附加到用户Stripe客户的有效支付方式ID - 查看Stripe后台的日志,确认是否存在API调用的隐性错误(部分场景下Cashier可能不会抛出异常,但Stripe会记录错误)
内容的提问来源于stack exchange,提问作者coffeeman9
相关产品推荐
相关产品推荐

