Stripe支付成功后重定向失败:Cannot get /success问题求助
问题分析与解决方案
1. 修复Stripe会话创建的语法错误
你的Server.js里创建Stripe会话的代码存在语法错误,导致cancel_url未被正确传入会话配置,同时可能引发其他异常:
// 错误代码 const session = await stripe.checkout.sessions.create({ line_items: lineItems , mode: 'payment', success_url: `${success}` }), // 此处多了右括号和逗号,导致cancel_url不在配置对象内 cancel_url: `${cancel}`, });
修正为:
const session = await stripe.checkout.sessions.create({ line_items: lineItems, mode: 'payment', success_url: success, cancel_url: cancel // 将cancel_url移入配置对象内部 });
2. 解决Cannot get /success路由问题
出现该错误是因为Express服务器未对/success和/cancel路径提供对应资源,分两种场景处理:
场景一:使用静态HTML页面
在项目的public文件夹下创建success.html和cancel.html文件,确保express.static('public')能正确返回这些页面。
场景二:React单页应用(SPA)
如果是React项目,需要配置Express支持SPA路由 fallback,让所有非API请求都返回React入口文件(通常是public/index.html):
- 安装依赖:
npm install connect-history-api-fallback
- 修改Server.js:
require('dotenv').config() const stripe = require('stripe')(process.env.REACT_APP_STRIPE_SECRET_KEY); const express = require('express'); const history = require('connect-history-api-fallback'); const app = express(); // 先配置history fallback,再处理静态文件 app.use(history()); app.use(express.json()) app.use(express.static('public')); const success = 'http://localhost:3000/success'; const cancel = 'http://localhost:3000/cancel'; app.post('/create-checkout-session', async (req, res) => { const lineItems = req.body console.log(req.body) const session = await stripe.checkout.sessions.create({ line_items: lineItems, mode: 'payment', success_url: success, cancel_url: cancel }); return res.json({url: session.url}); }); app.listen(3000, () => console.log('Running on port 3000'));
额外检查点
- 若使用React Router,确认项目中已创建
/success和/cancel对应的路由组件。 - 若需要后续异步通知,可检查Stripe控制台的Webhook配置,但当前重定向问题主要由上述两点解决。
内容的提问来源于stack exchange,提问作者Gabriel Ribeiro
相关产品推荐
相关产品推荐

