集成Stripe API后,如何在重定向至成功页时确认支付成功?
解决Stripe支付成功后验证支付状态的方法
Stripe重定向到成功页面时,会在URL中附带session_id参数(基于Checkout Sessions流程),这是验证支付状态的核心依据,以下是两种可靠的验证方式:
方法一:后端查询Checkout Session状态(实时验证)
前端数据易被篡改,必须通过后端完成可信验证:
- 成功页面加载时,从URL中提取
session_id(比如通过window.location.search解析查询参数) - 将
session_id发送到你的后端接口 - 后端使用Stripe服务端SDK调用
stripe.checkout.sessions.retrieve(session_id)接口 - 检查返回Session对象的
payment_status字段:- 若为
paid,确认支付成功,可执行更新订单状态、发送确认邮件等操作 - 若为
unpaid或其他状态,说明支付未完成,跳转至失败页面或提示用户
- 若为
示例Node.js后端代码:
const stripe = require('stripe')('你的Stripe密钥'); app.get('/verify-payment', async (req, res) => { const sessionId = req.query.session_id; try { const session = await stripe.checkout.sessions.retrieve(sessionId); if (session.payment_status === 'paid') { // 处理支付成功逻辑:更新数据库、发送通知等 res.json({ success: true, orderId: session.metadata.order_id }); } else { res.json({ success: false, message: '支付未完成' }); } } catch (error) { res.status(500).json({ success: false, message: '验证失败' }); } });
方法二:使用Stripe Webhooks(异步兜底)
若用户关闭页面或网络异常导致前端未触发验证,Webhooks可确保你收到支付成功通知:
- 在Stripe后台配置Webhook端点(比如你的后端
/stripe-webhook) - 勾选
checkout.session.completed事件(支付成功时Stripe会主动触发该事件) - 后端收到请求后,先验证签名(防止伪造请求),再处理订单状态更新
- 该方式不依赖前端重定向,即使用户未返回成功页面,也能同步支付状态
示例Node.js后端Webhook验证代码:
const stripe = require('stripe')('你的Stripe密钥'); const endpointSecret = '你的Webhook签名密钥'; app.post('/stripe-webhook', express.raw({type: 'application/json'}), (req, res) => { const sig = req.headers['stripe-signature']; let event; try { event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret); } catch (err) { return res.status(400).send(`Webhook Error: ${err.message}`); } // 处理支付成功事件 if (event.type === 'checkout.session.completed') { const session = event.data.object; console.log('支付成功,关联订单ID:', session.metadata.order_id); // 执行更新订单、发送邮件等操作 } res.json({received: true}); });
关键注意事项
- 禁止仅依赖前端状态判断支付结果,必须通过后端验证,避免恶意伪造支付成功的情况
- 若使用自定义支付流程(非Checkout),可通过
PaymentIntent的status字段验证,调用stripe.paymentIntents.retrieve(paymentIntentId)检查状态是否为succeeded - 留存Stripe返回的Session或PaymentIntent对象,作为支付成功的凭证
内容的提问来源于stack exchange,提问作者Chief Jalal
相关产品推荐
相关产品推荐

