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

Stripe支付成功后如何获取支付信息及支付ID?PHP代码场景

Stripe Checkout Session 支付ID获取及支付成功后信息获取方案

一、解决$session->id报错的问题

$session->id报错大概率是Checkout Session创建失败,或是参数/配置有误导致$session未生成预期对象,可按以下步骤排查解决:

  • 增加异常捕获,明确错误原因:
    try {
        \Stripe\Stripe::setApiKey(config('stripe.sk'));
        $session = \Stripe\Checkout\Session::create([
            'payment_method_types' => ['ideal'],
            'line_items' => [
                [
                    'price_data' => [
                        'currency' => 'eur',
                        'product_data' => [
                            'name' => $inputName . ' - ' . $inputSize,
                        ],
                        'unit_amount' => (int)($inputPrice * 100), // 修正为整数分单位
                    ],
                    'quantity' => 1,
                ],
            ],
            'mode' => 'payment',
            'success_url' => route('success', ['locale' => session('locale')]),
            'cancel_url' => route('failed', ['locale' => session('locale')]),
        ]);
        
        // 成功创建后可正常获取Session ID
        $sessionId = $session->id;
        // 可将Session ID存入会话或数据库,供后续使用
        session(['stripe_session_id' => $sessionId]);
        
        return redirect()->away($session->url);
    } catch (\Stripe\Exception\ApiErrorException $e) {
        // 打印或记录错误信息,快速定位问题(比如API密钥错误、参数格式非法)
        dd($e->getMessage());
        return redirect()->route('payment.error');
    }
    
  • 修正参数格式:unit_amount必须是整数(以货币最小单位为基准,比如欧元的分),避免字符串拼接导致的格式错误,直接用(int)($inputPrice * 100)转换。
  • 验证API密钥:确认config('stripe.sk')是Stripe的Secret Key(测试环境用sk_test_开头,生产环境用sk_live_开头)。

二、支付成功后获取Stripe支付信息

仅依赖success_url跳转不可靠(用户可能直接访问该链接),必须通过Stripe Webhook接收支付完成事件,这是获取支付信息的官方可靠方式:

1. 配置Stripe Webhook

在Stripe后台(开发者→Webhooks)添加端点(比如你的域名/stripe/webhook),选择监听checkout.session.completed事件,复制生成的签名密钥(Webhook Secret)。

2. 编写Webhook处理代码(Laravel示例)

// routes/web.php
Route::post('/stripe/webhook', [StripeController::class, 'handleWebhook']);

// StripeController 中的处理方法
public function handleWebhook(Request $request)
{
    \Stripe\Stripe::setApiKey(config('stripe.sk'));
    $webhookSecret = config('stripe.webhook_secret'); // 从Stripe后台复制的签名密钥
    $payload = $request->getContent();
    $sigHeader = $request->header('Stripe-Signature');

    try {
        $event = \Stripe\Webhook::constructEvent(
            $payload, $sigHeader, $webhookSecret
        );
    } catch (\UnexpectedValueException $e) {
        return response()->json(['error' => '无效请求体'], 400);
    } catch (\Stripe\Exception\SignatureVerificationException $e) {
        return response()->json(['error' => '无效签名'], 400);
    }

    // 处理支付完成事件
    if ($event->type === 'checkout.session.completed') {
        $session = $event->data->object;
        // 获取核心支付信息
        $paymentIntentId = $session->payment_intent; // 支付ID(即你需要的交易ID)
        $paymentMethodId = $session->payment_method; // 支付方式ID
        $totalAmount = $session->amount_total / 100; // 转换为欧元单位的总金额
        $customerEmail = $session->customer_details->email; // 客户邮箱

        // 这里可将信息存入数据库,更新订单状态等业务操作
        // 示例:Order::where('stripe_session_id', $session->id)->update(['status' => 'paid', 'payment_id' => $paymentIntentId]);
    }

    return response()->json(['status' => 'success']);
}

3. 可选:在成功页辅助展示支付信息

如果需要在前端成功页面展示支付详情,可在创建Session时将session_id携带到success_url:

'success_url' => route('success', [
    'locale' => session('locale'),
    'session_id' => $session->id
]),

然后在成功页控制器中查询Session及支付详情(仅做展示用,核心业务逻辑仍需依赖Webhook):

public function success(Request $request)
{
    $sessionId = $request->get('session_id');
    \Stripe\Stripe::setApiKey(config('stripe.sk'));
    $session = \Stripe\Checkout\Session::retrieve($sessionId);
    $paymentIntent = \Stripe\PaymentIntent::retrieve($session->payment_intent);
    
    return view('success', ['paymentInfo' => $paymentIntent]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:57:31