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

Stripe客户账户余额及订阅变更后的退款操作问题咨询

嘿,咱们来拆解你遇到的这两个Stripe问题吧——我之前处理过类似的订阅退款流程,这就给你梳理解决方案:

问题一:计算包含账户余额的应退款金额

你观察得很准:stripe.Invoice.upcoming()确实不会考虑客户已有的账户余额。这个方法的核心作用是计算订阅变更(比如取消)会产生的计费变动额,它只聚焦订阅本身的周期计费,和账户里已存的信用余额是完全独立的两个模块。

所以直接把计算出的prorated_amount和customer.balance相加的方式是完全可行的,但要注意两个细节:

  • 确保两者都是以最小货币单位计算的(比如你这里的750和4500,对应7.5欧和45欧),单位统一就不会出错;
  • 获取customer.balance时一定要取实时值,避免在计算prorated金额和获取余额之间,客户账户发生其他变动(比如新增发票、手动添加的信用项)。

另外,还有一种更贴合Stripe原生流程的方式,能省去自己计算prorated金额的麻烦:
当你取消Professional订阅时,设置proration_behavior='create_proration',Stripe会自动计算未使用周期的prorated信用额,并直接加到客户的账户余额里。这时候你不需要手动计算,直接取customer.balance就是总可退款金额(45欧+7.5欧=52.5欧)。代码示例:

# 立即取消订阅,并自动生成proration信用加到账户余额
subscription = stripe.Subscription.modify(
    subscription.id,
    cancel_at_period_end=False,  # 立即取消而非到期取消
    proration_behavior='create_proration',
    prorate=True
)

# 获取实时的客户账户余额(已包含prorated信用)
customer = stripe.Customer.retrieve(customer.id)
total_refund_amount = customer.balance  # 这里会返回5250,对应52.5欧元

这种方式更省心,也能避免自己计算prorated金额可能出现的误差(比如不同计费周期、时区的影响)。

问题二:处理无charge/payment_intent的发票退款

你遇到的错误本质是:第二张发票完全用账户余额抵扣,没有产生实际的支付交易(也就是没有charge或payment_intent记录),而stripe.Refund.create()这个API是用来退款实际发生的支付交易的,自然无法处理纯余额抵扣的发票。

要把客户的账户余额退回到他们的支付方式,你需要用**客户余额交易(Customer Balance Transaction)**来处理,这是Stripe专门用来管理账户余额进出的API:

# 先确保prorated信用已加到账户余额(参考问题一的第二种方法)
customer = stripe.Customer.retrieve(customer.id)
total_refund_amount = customer.balance

# 创建余额退款交易,将余额退至客户的支付方式
stripe.Customer.create_balance_transaction(
    customer.id,
    amount=-total_refund_amount,  # 负号表示减少账户余额(即退款)
    type='refund',
    description='退款:未使用订阅周期金额 + 账户剩余余额'
)

这个API会自动尝试把余额退回到客户最近使用的有效支付方式(比如绑定的信用卡)。如果退款失败(比如支付方式过期、失效),Stripe会自动把金额重新加回客户的账户余额,你可以后续再通知客户更新支付方式后重试。

如果你确实需要针对订阅prorated部分单独退款(而非合并到余额),那前提是该订阅的发票必须是通过实际支付方式完成的,但在你的场景里第二张发票是纯余额抵扣,所以用余额交易退款是最适配的方案。

内容的提问来源于stack exchange,提问作者Alexander Nestorov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:37:50