Next.js集成Stripe时遇AxiosError:状态码500请求失败
解决Stripe结账会话创建500错误的排查方案
第一步:捕获并查看具体错误信息
当前代码未处理Stripe请求的异常,导致只能看到500状态码,无法定位具体问题。先给API路由添加错误捕获,打印Stripe返回的详细错误:
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY); export default async (req, res) => { try { const { items, email } = req.body; const transformedItems = items.map((item) => ({ description: item.description, quantity: 1, price_data: { currency: 'usd', unit_amount: Math.round(item.price * 100), // 确保是整数 product_data: { name: item.title, images: [item.image], }, }, })); // 先打印转换后的商品数据,验证格式 console.log('Transformed Items:', transformedItems); const session = await stripe.checkout.sessions.create({ line_items: transformedItems, mode: 'payment', success_url: `${process.env.HOST}/success`, cancel_url: `${process.env.HOST}/checkout`, metadata: { email, images: JSON.stringify(items.map((item) => item.image)), }, }); res.status(200).json({ id: session.id }); } catch (error) { console.error('Stripe 错误详情:', error); res.status(error.statusCode || 500).json({ error: error.message }); } };
常见错误原因及修复
1. unit_amount 格式不符合要求
Stripe要求金额必须是整数(以分为单位),如果你的item.price是字符串、带多位小数的数字,会导致转换后不是整数。
- 修复:用
Math.round(item.price * 100)确保结果为整数,同时验证item.price是有效数字类型。
2. product_data.images 无效
Stripe要求图片必须是公开可访问的HTTP/HTTPS完整链接,不能用本地相对路径(比如/public/shoe.jpg)或未部署的本地URL。
- 修复:假数据里的图片换成Stripe测试用的公开图片(比如
https://picsum.photos/200/200),或者确保你的图片URL是线上可访问的完整地址。
3. 商品字段缺失或为空
如果假数据中某个商品的title、description、price存在undefined或空值,会触发Stripe的字段验证错误。
- 修复:检查
items数组中每个商品的必填字段是否完整,添加默认值兜底(比如description: item.description || '默认描述')。
4. 环境变量配置错误
- 确认
STRIPE_SECRET_KEY是测试密钥(格式为sk_test_xxx),不能用公钥; - 确认
HOST环境变量是完整的前端域名(比如http://localhost:3000),没有拼写错误。
5. Stripe日志排查
登录Stripe控制台,进入Developers → Logs,找到对应的请求记录,里面会有比控制台更详细的错误说明,比如字段格式错误、权限问题等。
额外验证步骤
- 前端请求时,确保Axios的
Content-Type为application/json,且items数组正确传递(可以在前端打印req.body确认数据格式); - 用Stripe官方的API测试工具(Postman或Stripe CLI)直接调用你的API路由,排除前端请求的问题。
内容的提问来源于stack exchange,提问作者nelakay
相关产品推荐
相关产品推荐

