如何在Node.js后端获取前端购物车列表用于Stripe结账?
解决方法
1. 通过表单POST请求传递
这是最直接的方式,适合需要页面跳转的结账流程:
前端把购物车数据转成JSON字符串,存入隐藏表单字段,提交表单到后端接口:
// 你的购物车数组 const cart = ["price_1LWgytARYjIsWfAV0lZI6mgW", "1", "price_1LWgytARYjIsWfAV0lZI6PXv", "3"]; // 动态创建表单 const checkoutForm = document.createElement('form'); checkoutForm.method = 'POST'; checkoutForm.action = '/create-checkout-session'; // 添加隐藏字段存储购物车数据 const cartField = document.createElement('input'); cartField.type = 'hidden'; cartField.name = 'cart'; cartField.value = JSON.stringify(cart); checkoutForm.appendChild(cartField); document.body.appendChild(checkoutForm); checkoutForm.submit();
后端(Express)解析表单数据,转换为Stripe需要的格式:
// 确保已配置express.urlencoded解析表单 app.use(express.urlencoded({ extended: true })); app.post('/create-checkout-session', async (req, res) => { const cart = JSON.parse(req.body.cart); // 把购物车数组转成Stripe要求的line_items格式 const lineItems = []; for (let i = 0; i < cart.length; i += 2) { lineItems.push({ price: cart[i], quantity: parseInt(cart[i + 1]), }); } // 创建Stripe结账会话 const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], line_items: lineItems, mode: 'payment', success_url: 'https://your-domain.com/success', cancel_url: 'https://your-domain.com/cancel', }); res.redirect(session.url); });
2. 通过Fetch API发送AJAX请求
适合不需要页面跳转的场景,前端异步发送购物车数据,后端返回Stripe结账链接后跳转:
前端代码:
const cart = ["price_1LWgytARYjIsWfAV0lZI6mgW", "1", "price_1LWgytARYjIsWfAV0lZI6PXv", "3"]; fetch('/create-checkout-session', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ cart }), }) .then(res => res.json()) .then(data => { window.location.href = data.url; }) .catch(err => console.error('结账请求失败:', err));
后端需要先配置JSON解析中间件,再处理请求:
app.use(express.json()); // 解析JSON请求体 app.post('/create-checkout-session', async (req, res) => { const cart = req.body.cart; // 转换line_items逻辑和上面一致 const lineItems = []; for (let i = 0; i < cart.length; i += 2) { lineItems.push({ price: cart[i], quantity: parseInt(cart[i + 1]), }); } const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], line_items: lineItems, mode: 'payment', success_url: 'https://your-domain.com/success', cancel_url: 'https://your-domain.com/cancel', }); res.json({ url: session.url }); });
3. 后端会话存储(适合登录用户)
如果用户已登录,可以把购物车数据存在后端Session中,前端每次修改购物车时同步到后端,结账时直接从Session读取:
前端同步购物车到后端:
// 购物车更新时调用此函数 function syncCartToSession(cart) { fetch('/update-cart', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ cart }), }); }
后端配置Session并处理:
const expressSession = require('express-session'); // 配置Session(生产环境需调整cookie的secure选项) app.use(expressSession({ secret: 'your-strong-secret-key', resave: false, saveUninitialized: true, cookie: { secure: process.env.NODE_ENV === 'production' } })); app.post('/update-cart', (req, res) => { req.session.cart = req.body.cart; res.json({ success: true }); }); app.post('/create-checkout-session', async (req, res) => { const cart = req.session.cart; // 后续Stripe结账逻辑同上 // ... });
内容的提问来源于stack exchange,提问作者Thomas Price
相关产品推荐
相关产品推荐

