Laravel Cashier invoicePrice方法unit_amount金额过高问题求助
问题原因及修复方案
核心错误
你混淆了invoicePrice和invoiceFor的用法,并且错误传递了多余的金额参数:
invoicePrice仅需传入Stripe价格ID和选项数组,它会自动从Stripe价格对象中读取金额、货币等配置,不需要手动传金额。- 你传入的第二个参数
intval($productPrice->unit_amount)是Stripe返回的最小单位数值(比如£4.99对应499便士),但Cashier会把这个值当成英镑单位的金额,再结合你的数量设置,直接导致扣费金额被放大100倍,最终出现异常高额扣费。
修复后的代码
$productPrice = Cashier::stripe()->prices->retrieve($productOption->stripe_id); $user = Auth::user(); $user->createOrGetStripeCustomer(); $user->updateDefaultPaymentMethod($request->input('token')); $user->invoicePrice( $productOption->stripe_id, [ 'metadata' => [ 'created_at' => Carbon::now(), 'user_id' => $user->id, 'api_key_uuid' => $apiKey->uuid, 'quantity' => $productOption->quantity, 'apply_credit_balance' => true ], // 若价格按数量计费,可直接在这里指定数量(可选,无需放在metadata中) 'quantity' => $productOption->quantity ] );
额外说明
如果确实需要使用invoiceFor方法(比如自定义计费描述),需先把最小单位金额转换为英镑单位,代码示例:
$user->invoiceFor( '自定义产品描述', $productPrice->unit_amount / 100, // 将便士转换为英镑 [ 'currency' => 'gbp', 'metadata' => [ // 你的元数据配置 ] ] );
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

