使用Stripe API创建发票遇问题:金额为零且无法添加订单项
解决Stripe发票amount_due为0及添加订单项的问题
问题原因
Stripe发票的金额不是通过创建发票时的直接金额参数设置的,它的金额由关联的订单项(Invoice Item)或订阅自动计算生成。你现在创建的发票没有任何订单项,所以amount_due自然为0。
添加订单项的两种方法
方法1:创建发票时直接嵌入订单项
在创建发票的参数中加入lines数组,直接定义订单项的价格、数量等信息。如果没有预先创建Stripe Price对象,可以用price_data动态生成价格;如果已有Price ID,直接指定price即可。
修改后的代码示例:
$params = [ 'customer' => $stripeCustomer['stripeCustomerId'], 'auto_advance' => true, 'collection_method' => 'charge_automatically', 'currency' => Str::lower($record['CurrencyCode']), 'metadata' => $metaData, 'lines' => [ [ 'price_data' => [ 'currency' => Str::lower($record['CurrencyCode']), 'product_data' => [ 'name' => '产品名称', // 替换为你的产品名 ], 'unit_amount' => 1000, // 单位:分,这里代表10.00 SGD ], 'quantity' => 2, // 购买数量 ], // 可按需添加更多订单项 ], ]; $stripeInvoice = \Stripe\Invoice::create($params);
方法2:先创建独立的InvoiceItem,再生成发票
先为目标客户创建InvoiceItem,之后创建发票时,Stripe会自动将该客户的未结算InvoiceItem加入到发票中:
// 先创建订单项 \Stripe\InvoiceItem::create([ 'customer' => $stripeCustomer['stripeCustomerId'], 'price_data' => [ 'currency' => Str::lower($record['CurrencyCode']), 'product_data' => ['name' => '产品名称'], 'unit_amount' => 1000, ], 'quantity' => 2, ]); // 再创建发票 $params = [ 'customer' => $stripeCustomer['stripeCustomerId'], 'auto_advance' => true, 'collection_method' => 'charge_automatically', 'currency' => Str::lower($record['CurrencyCode']), 'metadata' => $metaData, ]; $stripeInvoice = \Stripe\Invoice::create($params);
效果验证
修改后生成的发票对象中,lines.data会包含你添加的订单项,amount_due、subtotal、total等字段也会自动计算出正确的金额。
内容的提问来源于stack exchange,提问作者502_Geek
相关产品推荐
相关产品推荐

