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事件实现
按以下步骤关联查询就能拿到促销码信息:
- 从
payment_intent.succeeded事件的返回对象中,取出PaymentIntent的ID(pi_开头格式) - 调用Stripe接口查询Checkout Session列表,传入过滤参数
payment_intent: <你拿到的pi_xxx ID>,就能匹配到本次支付对应的Checkout Session - 从查到的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
相关产品推荐
相关产品推荐

