如何从Stripe预构建结账页面获取客户ID等数据并存入MySQL数据库
Stripe 结账功能获取客户ID并存库解决方案
步骤1:调整结账会话创建配置
你当前注释掉的success_url配置自带Stripe官方的{CHECKOUT_SESSION_ID}占位符,Stripe会在用户完成支付后自动填充真实的会话ID到跳转链接中,先把你的success_url调整为带该参数的版本:
\Stripe\Stripe::setApiKey('sk_test_51J...........esLwtMQx7IXNxp00epljtC43'); header('Content-Type: application/json'); $YOUR_DOMAIN = 'mydomain.com'; $checkout_session = \Stripe\Checkout\Session::create([ 'payment_method_types' => ['card'], 'line_items' => [[ 'price'=>"price_1Jt.....vImqj", 'quantity'=>1, ]], 'mode' => 'subscription', // 调整为带会话ID的成功页跳转地址 'success_url' => $YOUR_DOMAIN . '/success.php?session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => $YOUR_DOMAIN . '/cancel.html', ]);
步骤2:在success.php中获取客户ID并写入数据库
用户支付完成跳转回你的站点后,通过GET参数拿到会话ID,再调用Stripe接口检索会话详情即可获取客户ID,参考代码如下:
<?php // 引入Stripe SDK,初始化密钥 \Stripe\Stripe::setApiKey('sk_test_51J...........esLwtMQx7IXNxp00epljtC43'); $session_id = $_GET['session_id'] ?? ''; if (empty($session_id)) { header('Location: /error.html'); exit; } try { // 检索结账会话,加expand参数可直接返回完整客户信息,无需二次请求 $checkout_session = \Stripe\Checkout\Session::retrieve([ 'id' => $session_id, 'expand' => ['customer'] ]); // 校验支付状态,避免恶意请求 if ($checkout_session->payment_status === 'paid') { // 你需要的客户ID $stripe_customer_id = $checkout_session->customer->id; // 可额外获取客户其他信息 $customer_email = $checkout_session->customer->email; $subscription_id = $checkout_session->subscription; // 此处编写你的MySQL写入逻辑,将上述字段存入对应表即可 // 示例:$db->execute("INSERT INTO 你的表名 (stripe_customer_id, email, subscription_id) VALUES (?, ?, ?)", [$stripe_customer_id, $customer_email, $subscription_id]); } } catch (\Exception $e) { error_log('Stripe会话检索失败: ' . $e->getMessage()); header('Location: /error.html'); exit; } // 后续展示支付成功页面内容 ?>
推荐优化方案
仅依赖成功页跳转存在数据漏存风险:如果用户支付完成后直接关闭页面,未等待跳转回你的站点,就会触发不到success.php的逻辑。推荐搭配Stripe Webhook实现,监听checkout.session.completed事件,Stripe会在支付完成后主动推送事件通知到你配置的接口,不管用户是否跳转都能稳定拿到客户ID完成存库。
内容的提问来源于stack exchange,提问作者user13800891
相关产品推荐
相关产品推荐

