使用Node.js+Express实现Stripe支付:客户未创建且代码崩溃求助
Node.js + Express 集成Stripe支付问题:返回成功但后台无客户且代码崩溃
我用Node.js和Express实现Stripe支付功能,接口运行后返回成功信息,但Stripe后台未创建客户,同时Node代码出现崩溃,求帮忙。
我的代码
const express = require('express') const app = express() const { stripecard } = require('../../schemas') var stripe = require("stripe")("sk_test_51LM4hdClyoITdq3ZfTfLdVZjmLKskcWAV17Yef5fGAjKFBReC82bstJOP7VyuauMiHFVGvHgyfQdSLsfcQHTzb9w00s65S9CT6") const CreateCard = app.post('/payment', function(req, res) { const { id, duration, cardNumber, expMM, expYY, cvv, email, name } = req.body; const createdUser = stripe.customers.create({ email: email || 'testUser@gmail.com', name: name || "123" }) //console.log("createdUser", createdUser) if (createdUser) { try { const token = stripe.tokens.create({ card: { number: cardNumber, exp_month: expMM, exp_year: expYY, cvc: cvv } }) //console.log("token : ", token) const AddingCardToUser = stripe.customers.createSource(createdUser.id, { source: token.id }) return res.status(201).json({ success: true, AmountCharged: req.body.charge, message: "Payment Charged Successfully and also a mail has been sent to User as well as Admin." }); } catch (error) { return res.status(501).json({ success: false, message: `Error in ${error.type} and error is : ${error.message}` }); } } }) module.exports = CreateCard
Postman输出
{ "success": true, "AmountCharged": "1200", "message": "Payment Charged Successfully and also a mail has been sent to User as well as Admin." }
问题原因及修复方案
核心问题
- 异步操作未等待:Stripe所有API调用都是异步的,返回的是Promise对象。你直接将
stripe.customers.create()的结果赋值给createdUser,此时它还不是实际客户数据,而是未完成的Promise。后续访问createdUser.id会报错,导致代码崩溃。 - 错误处理无效:try/catch仅包裹同步代码,异步操作的错误无法被捕获,服务会直接崩溃而非返回错误响应。
- 敏感数据处理违规:直接在后端接收卡号、CVV等敏感信息,不符合PCI合规要求,存在安全风险。
修复后的代码
const express = require('express') const app = express() const { stripecard } = require('../../schemas') const stripe = require("stripe")("sk_test_51LM4hdClyoITdq3ZfTfLdVZjmLKskcWAV17Yef5fGAjKFBReC82bstJOP7VyuauMiHFVGvHgyfQdSLsfcQHTzb9w00s65S9CT6") // 将路由处理函数改为async函数,支持await等待异步操作 const CreateCard = app.post('/payment', async function(req, res) { const { cardNumber, expMM, expYY, cvv, email, name } = req.body; try { // 等待客户创建完成,拿到实际客户对象 const createdUser = await stripe.customers.create({ email: email || 'testUser@gmail.com', name: name || "123" }) // 等待卡片token创建完成 const token = await stripe.tokens.create({ card: { number: cardNumber, exp_month: expMM, exp_year: expYY, cvc: cvv } }) // 等待将卡片添加到客户账户完成 await stripe.customers.createSource(createdUser.id, { source: token.id }) return res.status(201).json({ success: true, AmountCharged: req.body.charge, message: "支付成功,已向用户和管理员发送邮件通知。" }); } catch (error) { // 捕获所有异步操作错误,返回友好响应 return res.status(500).json({ success: false, message: `错误类型:${error.type},错误信息:${error.message}` }); } }) module.exports = CreateCard
额外建议
- 合规优化:不要在后端处理卡号、CVV等敏感数据,改用Stripe官方前端组件(如Stripe Elements)收集卡片信息,生成
payment_method或token后传给后端,后端仅用该标识关联客户和完成支付,避免PCI合规风险。 - 日志调试:添加日志打印(如
console.log(createdUser)),方便排查Stripe API返回结果,确认操作是否成功。
内容的提问来源于stack exchange,提问作者Rimsha Riaz
相关产品推荐
相关产品推荐

