You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:54:22