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

如何在Node.js+Stripe中点击购买按钮后动态传递Price ID至服务器

解决思路与示例代码

核心逻辑是前端只传递业务层面的商品标识(比如商品ID、SKU),后端通过这个标识映射到对应的Stripe Price ID,全程不让前端接触到敏感的Price ID。


步骤1:后端维护商品与Price ID的映射

可以用内存对象(小项目临时用)或者数据库(生产环境)存映射关系,绝对不要把Price ID暴露到前端。

后端代码示例(Express + Stripe)

require('dotenv').config();
const express = require('express');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const app = express();

// 解析JSON请求体
app.use(express.json());
app.use(express.static('public'));

// 商品映射:业务商品ID -> Stripe Price ID(生产环境建议存数据库)
const productPriceMap = {
  'product_001': 'price_123ABC', // 替换成你的Stripe Price ID
  'product_002': 'price_456DEF'
};

// 创建结账会话的接口
app.post('/create-checkout-session', async (req, res) => {
  const { productId } = req.body;
  // 先验证商品ID是否合法
  if (!productPriceMap[productId]) {
    return res.status(400).json({ error: '无效的商品ID' });
  }

  try {
    const session = await stripe.checkout.sessions.create({
      payment_method_types: ['card'],
      line_items: [
        {
          price: productPriceMap[productId],
          quantity: 1
        }
      ],
      mode: 'payment',
      success_url: `${process.env.SERVER_URL}/success.html`,
      cancel_url: `${process.env.SERVER_URL}/cancel.html`,
    });

    res.json({ url: session.url });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(3000, () => console.log('服务器运行在端口3000'));

步骤2:前端传递业务商品ID

前端按钮只需要携带业务层面的商品ID,点击后通过AJAX请求后端接口,拿到结账链接后跳转。

前端HTML + JS示例

<!-- public/index.html -->
<button class="buy-btn" data-product-id="product_001">购买商品1</button>
<button class="buy-btn" data-product-id="product_002">购买商品2</button>

<script>
document.querySelectorAll('.buy-btn').forEach(btn => {
  btn.addEventListener('click', async () => {
    const productId = btn.dataset.productId;
    try {
      const response = await fetch('/create-checkout-session', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ productId }),
      });
      const data = await response.json();
      if (data.url) {
        window.location.href = data.url;
      }
    } catch (error) {
      console.error('请求失败:', error);
    }
  });
});
</script>

关键注意事项

  • 绝对不要在前端模板(包括EJS)中直接输出Price ID,哪怕用dotenv也不行,因为模板渲染后会暴露在HTML源码里。
  • 生产环境下,商品与Price ID的映射建议存在数据库(比如PostgreSQL、MongoDB),而不是内存对象,方便动态更新商品信息。
  • 后端接口一定要验证前端传递的商品ID合法性,防止恶意请求不存在的商品ID。

内容的提问来源于stack exchange,提问作者Chamoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:05:13