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

Stripe能否从payment_intent.succeeded对象获取使用的促销码?

问题原因

payment_intent.succeeded 事件返回的PaymentIntent对象默认不会直接挂载本次支付使用的促销码字段,不是你查找路径有误。Stripe的促销码关联关系默认绑定在Checkout Session、Invoice这类上层对象上,不会直接下沉到PaymentIntent层级。

实现方案

推荐方案:直接监听Checkout完成事件

没必要死磕payment_intent.succeeded事件,换成监听checkout.session.completed webhook事件是最省事的方案:

  • 该事件会在用户走完Checkout流程、支付状态确认成功后触发,和payment_intent.succeeded的状态一致性完全满足业务统计需求
  • 事件返回的Checkout Session对象自带discounts数组字段,数组内的promotion_code属性就是本次支付使用的促销码ID(pc_开头格式)
  • 拿到促销码ID后,你可以直接读取关联的促销码规则、码值信息,匹配到对应用户后执行兑换计数的递增操作即可

如果你必须基于payment_intent.succeeded事件实现

按以下步骤关联查询就能拿到促销码信息:

  1. 从payment_intent.succeeded事件的返回对象中,取出PaymentIntent的ID(pi_开头格式)
  2. 调用Stripe接口查询Checkout Session列表,传入过滤参数payment_intent: <你拿到的pi_xxx ID>,就能匹配到本次支付对应的Checkout Session
  3. 从查到的Checkout Session的discounts数组中,直接提取对应的促销码信息即可
注意事项
  • 如果你的Checkout场景是订阅支付,促销码信息同时也会挂载在PaymentIntent关联的Invoice对象的discounts字段下,路径为payment_intent.invoice.discounts[0].promotion_code,也可以直接取用
  • 做计数递增逻辑时务必加幂等校验,用Checkout Session ID作为唯一幂等键,避免webhook重复投递导致计数多算
  • 取促销码ID的字段路径参考:
// checkout.session.completed事件中提取促销码ID的路径
const promotionCodeId = event.data.object.discounts[0].promotion_code

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:51:29