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
相关产品推荐
相关产品推荐

