如何对账Stripe Checkout Session与Payment Intent及判断支付成功?
确认Stripe Checkout支付成功及对账方案
一、如何确认用户完成支付
你创建Checkout Session时拿不到Payment Intent ID没关系,核心靠Stripe Webhook事件确认支付状态,这是Stripe官方认可的可靠方式:
- 监听
checkout.session.completed事件:用户完成支付流程(跳转回成功页之前),Stripe会主动推送这个事件到你的Webhook端点。事件payload里的session.payment_intent字段就是对应Payment Intent ID,同时session.payment_status会显示为paid(即时付款场景)或unpaid(授权后付款场景,比如订阅)。 - 额外监听
payment_intent.succeeded事件:单次即时付款场景下,这个事件会和checkout.session.completed先后触发,双重确认支付成功更稳妥;授权付款场景中,后续实际扣款时会触发该事件。
注意:绝对不要只依赖前端成功页面跳转判断支付状态——用户可能中途关闭页面、篡改前端参数,只有Webhook事件是Stripe服务器主动推送的可信来源。
二、Checkout Session与Payment Intent的对账方法
对账的关键是把Stripe的两个对象和你的内部订单系统关联,步骤如下:
- 创建Session时绑定内部订单ID
调用checkout.sessions.create接口时,务必通过metadata字段带上你的内部订单ID,方便后续关联业务数据:
# 示例(Python) stripe.checkout.Session.create( payment_method_types=['card'], line_items=[{'price': 'price_xxx', 'quantity': 1}], mode='payment', success_url='https://your-domain.com/success', cancel_url='https://your-domain.com/cancel', metadata={'order_id': 'ORD-20240501-001'} # 你的内部订单ID )
- 处理Webhook时关联三方数据
收到checkout.session.completed或payment_intent.succeeded事件时,把以下信息存储到数据库:
- 内部订单ID(从
metadata中提取) - Checkout Session ID(事件中的
id字段) - Payment Intent ID(
session.payment_intent或payment_intent.id) - 支付金额、币种、状态等关键信息
- 定期对账流程
- 从Stripe后台导出Payment Intent交易记录,或用API调用
payment_intents.list批量获取所有成功支付的记录。 - 以Payment Intent ID为匹配键,和数据库中的订单支付记录核对:检查金额是否一致、支付状态是否匹配、关联的Session ID是否对应。
- 处理异常:如果出现
checkout.session.completed但payment_intent.succeeded未触发的情况,大概率是支付授权成功但未实际扣款(比如预授权场景),需到Stripe后台查看该Payment Intent的详细状态跟进。
内容的提问来源于stack exchange,提问作者JohnDoe123
相关产品推荐
相关产品推荐

