如何在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
相关产品推荐
相关产品推荐

