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

使用Stripe API如何从payment_intent.succeeded webhook获取对应结账会话的session_id

Stripe 结账会话与支付记录关联官方推荐实现方案

核心逻辑

你当前的关联问题根源是监听了支付层级的payment_intent.succeeded类事件,这类事件默认不携带结账会话ID,Stripe官方推荐优先监听checkout.session.completed事件实现关联,该方案完全适配你现有「生成会话成功后才存储数据」的流程,无额外复杂度,不需要提前生成自定义唯一ID。

checkout.session.completed是用户成功完成支付后,Stripe主动推送的事件,payload 中同时包含完整的结账会话对象、关联的支付意图ID,可直接完成两类数据的关联。

具体实现步骤

  1. 登录Stripe后台,在Webhook配置页添加checkout.session.completed事件的监听权限。
  2. 在该事件的处理逻辑中直接提取两个核心关联字段:
    • 结账会话ID:$event->data->object->id,可直接匹配你本地存储的结账会话记录
    • 支付意图ID:$event->data->object->payment_intent,对应你要存储的支付记录ID
  3. 业务逻辑中先根据结账会话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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:54:11