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

如何区分Stripe退款发票与订阅生成的正常发票

核心结论

退款操作不会触发你正在监听的invoice.payment_succeeded和payment_intent.succeeded事件,这两个事件仅在正向收款成功时触发,退款场景会触发单独的charge.refunded、credit_note.created等事件,不会影响你现有授权逻辑的触发条件。

如果要额外增加防护逻辑,彻底排除退款关联的交易,可以按两个监听事件分别加判断条件:

处理invoice.payment_succeeded事件的区分方案

  • 判断发票的billing_reason字段:正常新订阅/订阅续期生成的发票,该字段值为subscription_create或subscription_cycle,退款关联的调整发票/贷项通知单关联的发票,该字段不会为以上两个值
  • 判断发票的credit_note_ids字段:如果是存在退款的发票,该字段会存储关联的贷项通知单ID数组,正常支付的订阅发票该字段为空数组,可加判断if(empty($response->data->object->credit_note_ids))过滤退款发票
  • 也可判断金额字段:正常支付成功的订阅发票amount_paid>0且amount_remaining=0,存在退款的发票amount_paid会小于原始应收金额,全额退款时为0

处理payment_intent.succeeded事件的区分方案

  • 你当前加的if(isset($response->data->object->payment_intent))判断属于冗余逻辑:payment_intent.succeeded事件返回的根对象本身就是PaymentIntent实例,不存在需要额外读取payment_intent属性的场景
  • 要排除已退款的支付,直接判断该PaymentIntent关联的支付单退款状态即可,加判断条件if($response->data->object->charges->data[0]->refunded === false),只有该值为false时才执行授权逻辑,即可完全过滤已退款的支付记录

额外最佳实践

如果后续需要实现退款后回收用户权限的逻辑,单独监听charge.refunded事件即可,拿到关联的PaymentIntent/Invoice ID后匹配对应用户执行权限回收操作,和现有授权逻辑完全隔离,不会互相干扰。

内容的提问来源于stack exchange,提问作者Mira chalak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 20:15:01