Stripe一次性支付:如何生成带自定义明细的收据/发票?
问题1:给PaymentIntent生成的邮件收据添加商品明细
直接调用PaymentIntent接口完成扣款时,默认的系统收据不会包含商品行项目——因为PaymentIntent仅负责资金流转,不关联商品明细信息。要实现带明细的收据,推荐通过Invoice + PaymentIntent的组合方案,步骤如下:
创建草稿Invoice并添加商品行项目
基于你在Stripe后台创建的商品(T恤、牛仔裤),先生成草稿Invoice,再添加对应行项目:// 1. 创建草稿Invoice const invoice = await stripe.invoices.create({ customer: customerId, collection_method: 'charge_automatically', currency: 'usd', }); // 2. 添加2件T恤的行项目(替换为你实际的T恤Price ID) await stripe.invoiceItems.create({ customer: customerId, invoice: invoice.id, price: 'price_xxxxxx', quantity: 2, }); // 3. 添加1条牛仔裤的行项目(替换为你实际的牛仔裤Price ID) await stripe.invoiceItems.create({ customer: customerId, invoice: invoice.id, price: 'price_yyyyyy', quantity: 1, });确认Invoice并关联支付完成扣款
确认Invoice后,Stripe会自动生成对应的PaymentIntent,你可以用现有支付方式完成确认:// 确认Invoice,生成关联的PaymentIntent const confirmedInvoice = await stripe.invoices.finalizeInvoice(invoice.id); // 用指定支付方式确认PaymentIntent完成扣款 const paymentIntent = await stripe.paymentIntents.confirm(confirmedInvoice.payment_intent, { payment_method: defaultPaymentMethod, return_url: process.env["WEBURL"], });这种方式下,Stripe发送的邮件收据会自动包含所有商品行项目。
问题2:使用Invoice时自行指定最终金额,而非Stripe计算
要跳过Stripe基于行项目的自动计算,直接控制最终金额(比如首单优惠后从30美元改为20美元),可以通过以下两种方式实现:
方式1:添加调整项(推荐)
在Invoice中添加负数调整项,直接抵扣金额,调整项会显示在收据上:
// 在创建Invoice后、确认前,添加首单优惠调整项(抵扣10美元,单位为分) await stripe.invoiceItems.create({ customer: customerId, invoice: invoice.id, amount: -1000, currency: 'usd', description: '首单立减10美元', }); // 确认Invoice后,最终金额为3000 - 1000 = 2000分(20美元) const confirmedInvoice = await stripe.invoices.finalizeInvoice(invoice.id);
方式2:设置自定义金额(适用于完全跳过行项目计算的场景)
如果不需要依赖商品行项目的金额计算,直接指定Invoice的最终应收金额,同时仍可添加行项目用于收据展示:
// 创建指定自定义金额的Invoice const invoice = await stripe.invoices.create({ customer: customerId, collection_method: 'charge_automatically', currency: 'usd', custom_amounts: { amount_due: 2000, // 最终应收20美元(单位为分) amount_paid: 2000, amount_remaining: 0, }, auto_advance: true, }); // 添加商品行项目(仅用于收据展示,不影响金额计算) await stripe.invoiceItems.create({ customer: customerId, invoice: invoice.id, price: 'price_xxxxxx', quantity: 2, }); await stripe.invoiceItems.create({ customer: customerId, invoice: invoice.id, price: 'price_yyyyyy', quantity: 1, }); // 确认Invoice并完成支付 const confirmedInvoice = await stripe.invoices.finalizeInvoice(invoice.id); const paymentIntent = await stripe.paymentIntents.confirm(confirmedInvoice.payment_intent, { payment_method: defaultPaymentMethod, return_url: process.env["WEBURL"], });
补充说明
- 无论采用哪种方案,通过Invoice完成支付后,Stripe的系统邮件收据都会自动包含所有行项目和调整项明细。
- 如果坚持直接使用
PaymentIntent而不通过Invoice,只能通过自定义收据实现:关闭Stripe自动收据功能,自行开发包含明细的邮件模板并发送,这种方式需要额外的邮件开发成本,不如Invoice方案高效。
内容的提问来源于stack exchange,提问作者user24602006
相关产品推荐
相关产品推荐

