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

处理Stripe `charge.refunded` WebHook调用:如何关联自有订单

解决Stripe charge.refunded事件中获取关联Checkout Session信息的问题

方案1:将client_reference_id复制到Checkout Session的metadata

创建Checkout Session时,除了设置client_reference_id,同时把该值写入metadata字段,Stripe会自动将Session的元数据同步到关联的Charge对象中:

stripe.checkout.Session.create(
  payment_method_types=['card'],
  line_items=[...],
  mode='payment',
  success_url='...',
  cancel_url='...',
  client_reference_id='YOUR_ORDER_ID',
  metadata={
    'order_id': 'YOUR_ORDER_ID',  # 同步订单号到metadata
    'additional_info': '你的附加信息'
  }
)

触发charge.refunded事件时,直接从Charge对象的metadata中读取所需信息:

if event['type'] == 'charge.refunded':
  charge = event['data']['object']
  order_id = charge['metadata']['order_id']
  # 执行退款相关业务逻辑

方案2:通过Payment Intent关联到Checkout Session

如果不想修改metadata结构,可通过Charge关联的Payment Intent反向找到对应的Checkout Session:

  1. 从charge.refunded事件的Charge对象中获取payment_intent字段(即Payment Intent的ID)。
  2. 调用API检索该Payment Intent,其checkout_session字段对应关联的Checkout Session ID。
  3. 检索Checkout Session即可拿到client_reference_id和原metadata:
if event['type'] == 'charge.refunded':
  charge = event['data']['object']
  # 获取关联的Payment Intent
  payment_intent = stripe.PaymentIntent.retrieve(charge['payment_intent'])
  # 获取对应的Checkout Session
  checkout_session = stripe.checkout.Session.retrieve(payment_intent['checkout_session'])
  # 提取目标信息
  order_id = checkout_session['client_reference_id']
  additional_info = checkout_session['metadata']['additional_info']

是否需要存储Charge ID?

如果仅需满足退款事件的基础关联需求,上述两种方案都可避免存储Charge ID。但从业务稳定性和可维护性角度,推荐将Charge ID与自有订单关联存储:

  • 减少API调用次数,提升WebHook处理效率,避免因API延迟导致的逻辑阻塞。
  • 便于后续核对支付、退款明细,故障排查时Charge ID是关键的追踪凭证。
  • 可有效应对事件重复触发的场景,通过Charge ID去重,避免重复处理退款。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:52:51