You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅在支付成功时创建Stripe Invoice的技术需求咨询

解决方案:先完成支付再创建Stripe Invoice

Stripe默认的发票流程确实是先创建发票再发起支付,但可以通过以下两种方案实现「支付成功后才生成有效发票」的需求:

方案一:先用Payment Intent完成支付,再创建关联的Invoice

这是最直接的实现方式,先完成支付动作,确认成功后再生成发票并关联已完成的支付记录:

  1. 创建并确认Payment Intent
    先发起支付流程,创建PaymentIntent并完成用户端的支付确认,确保支付状态为成功:

    # Python示例代码
    payment_intent = stripe.PaymentIntent.create(
      amount=1000,  # 金额单位:分
      currency='usd',
      payment_method_types=['card'],
    )
    # 前端完成支付确认后,后端监听`payment_intent.succeeded` webhook事件
    
  2. 支付成功后创建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可实现「支付成功后自动生成有效发票」的逻辑:

  1. 创建Quote
    创建包含商品项的Quote,设置支付成功后自动生成发票:

    quote = stripe.Quote.create(
      customer='cus_XXX',
      line_items=[
        {
          'price': 'price_XXX',
          'quantity': 1,
        },
      ],
      collection_method='charge_automatically',
      expires_at=1735689600,  # 设置报价单过期时间
    )
    
  2. 确认Quote并发起支付
    前端展示Quote的支付链接,用户完成支付后,Stripe会自动生成已支付状态的Invoice;若支付失败,则不会生成任何发票记录。

关键注意事项

  • 必须通过webhook事件触发发票创建,不要依赖前端回调,避免网络异常或前端篡改导致的状态不一致。
  • 创建Invoice时需禁用auto_advance,防止Stripe自动发起支付流程,确保支付动作在前、发票创建在后。
  • 若需给用户发送发票通知,可在Invoice创建完成后调用stripe.Invoice.send_invoice()方法。

内容的提问来源于stack exchange,提问作者Kashif Rasheed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:16:04