仅在支付成功时创建Stripe Invoice的技术需求咨询
解决方案:先完成支付再创建Stripe Invoice
Stripe默认的发票流程确实是先创建发票再发起支付,但可以通过以下两种方案实现「支付成功后才生成有效发票」的需求:
方案一:先用Payment Intent完成支付,再创建关联的Invoice
这是最直接的实现方式,先完成支付动作,确认成功后再生成发票并关联已完成的支付记录:
创建并确认Payment Intent
先发起支付流程,创建PaymentIntent并完成用户端的支付确认,确保支付状态为成功:# Python示例代码 payment_intent = stripe.PaymentIntent.create( amount=1000, # 金额单位:分 currency='usd', payment_method_types=['card'], ) # 前端完成支付确认后,后端监听`payment_intent.succeeded` webhook事件支付成功后创建Invoice并关联支付记录
收到payment_intent.succeeded事件后,创建Invoice并关联已成功的Payment Intent,直接将发票标记为已支付状态:# 支付成功后执行 invoice = stripe.Invoice.create( customer='cus_XXX', auto_advance=False, # 禁用自动推进支付流程 collection_method='charge_automatically', ) # 添加发票明细项(按需添加) stripe.InvoiceItem.create( customer='cus_XXX', invoice=invoice.id, amount=1000, currency='usd', description='商品X', ) # 关联已完成的Payment Intent并完成发票支付 stripe.Invoice.pay( invoice.id, payment_intent=payment_intent.id, )此方式生成的发票直接处于
paid状态,不会产生作废的发票记录。
方案二:使用Stripe Quote(报价单)触发支付后生成发票
如果业务需要先展示报价再完成支付,Quote可实现「支付成功后自动生成有效发票」的逻辑:
创建Quote
创建包含商品项的Quote,设置支付成功后自动生成发票:quote = stripe.Quote.create( customer='cus_XXX', line_items=[ { 'price': 'price_XXX', 'quantity': 1, }, ], collection_method='charge_automatically', expires_at=1735689600, # 设置报价单过期时间 )确认Quote并发起支付
前端展示Quote的支付链接,用户完成支付后,Stripe会自动生成已支付状态的Invoice;若支付失败,则不会生成任何发票记录。
关键注意事项
- 必须通过webhook事件触发发票创建,不要依赖前端回调,避免网络异常或前端篡改导致的状态不一致。
- 创建Invoice时需禁用
auto_advance,防止Stripe自动发起支付流程,确保支付动作在前、发票创建在后。 - 若需给用户发送发票通知,可在Invoice创建完成后调用
stripe.Invoice.send_invoice()方法。
内容的提问来源于stack exchange,提问作者Kashif Rasheed
相关产品推荐
相关产品推荐

