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

使用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."
}

问题原因及修复方案

核心问题

  1. 异步操作未等待:Stripe所有API调用都是异步的,返回的是Promise对象。你直接将stripe.customers.create()的结果赋值给createdUser,此时它还不是实际客户数据,而是未完成的Promise。后续访问createdUser.id会报错,导致代码崩溃。
  2. 错误处理无效:try/catch仅包裹同步代码,异步操作的错误无法被捕获,服务会直接崩溃而非返回错误响应。
  3. 敏感数据处理违规:直接在后端接收卡号、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:33:22