使用Stripe API如何从payment_intent.succeeded webhook获取对应结账会话的session_id
Stripe 结账会话与支付记录关联官方推荐实现方案
核心逻辑
你当前的关联问题根源是监听了支付层级的payment_intent.succeeded类事件,这类事件默认不携带结账会话ID,Stripe官方推荐优先监听checkout.session.completed事件实现关联,该方案完全适配你现有「生成会话成功后才存储数据」的流程,无额外复杂度,不需要提前生成自定义唯一ID。
checkout.session.completed是用户成功完成支付后,Stripe主动推送的事件,payload 中同时包含完整的结账会话对象、关联的支付意图ID,可直接完成两类数据的关联。
具体实现步骤
- 登录Stripe后台,在Webhook配置页添加
checkout.session.completed事件的监听权限。 - 在该事件的处理逻辑中直接提取两个核心关联字段:
- 结账会话ID:
$event->data->object->id,可直接匹配你本地存储的结账会话记录 - 支付意图ID:
$event->data->object->payment_intent,对应你要存储的支付记录ID
- 结账会话ID:
- 业务逻辑中先根据结账会话ID更新本地会话表的支付状态,再将两个ID同步存入支付信息表,即可完成关联。
PHP 示例代码
// 初始化Stripe SDK $stripe = new \Stripe\StripeClient('你的Stripe私钥'); // Webhook签名校验(必须开启,避免伪造请求) $payload = @file_get_contents('php://input'); $sigHeader = $_SERVER['HTTP_STRIPE_SIGNATURE']; $endpointSecret = '你的Webhook端点密钥'; try { $event = \Stripe\Webhook::constructEvent( $payload, $sigHeader, $endpointSecret ); } catch (\UnexpectedValueException $e) { http_response_code(400); exit(); } catch (\Stripe\Exception\SignatureVerificationException $e) { http_response_code(400); exit(); } // 处理结账会话完成事件 if ($event->type === 'checkout.session.completed') { $session = $event->data->object; // 提取关联字段 $checkoutSessionId = $session->id; $paymentIntentId = $session->payment_intent; $payAmount = $session->amount_total; $payCurrency = $session->currency; $customerInfo = $session->customer_details; // 你的业务逻辑 // 1. 用$checkoutSessionId查询本地结账会话表,确认记录存在 // 2. 更新会话表支付状态为成功 // 3. 支付信息表插入记录时同时存入$checkoutSessionId和$paymentIntentId完成关联 // 4. 其他后续业务处理 } http_response_code(200);
补充方案(需保留payment_intent.succeeded监听的场景)
如果你因业务需要必须监听payment_intent.succeeded事件,可通过支付意图ID反向查询关联的结账会话,代码示例如下:
// 从事件中的payment_intent对象提取支付意图ID $paymentIntentId = $event->data->object->id; // 查询关联的结账会话 $sessions = $stripe->checkout->sessions->all([ 'payment_intent' => $paymentIntentId, 'limit' => 1 ]); if (!empty($sessions->data)) { $checkoutSessionId = $sessions->data[0]->id; // 后续关联逻辑 }
该方案无需修改现有监听配置,仅多一次Stripe API调用,性能略低于直接监听checkout.session.completed。
你之前考虑的元数据同步方案不推荐使用:Checkout Session的metadata默认不会自动同步到关联的PaymentIntent对象,需要额外配置传递规则,反而会提升代码复杂度和故障风险,不符合官方最佳实践。
内容的提问来源于stack exchange,提问作者cazort
相关产品推荐
相关产品推荐

