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

如何用Node.js的paypal-rest-sdk给PayPal结账加多个商品 解决400报错

PayPal多商品支付400错误修复方案

核心错误原因

  • 现有代码的items数组硬编码仅支持单个商品,没有做多商品的遍历生成逻辑
  • 所有商品的(单价*数量)累加值必须和transactions.amount.total完全一致,差值超过0.01就会触发400错误
  • 每个商品的sku字段不能重复,现有代码硬编码为C001,新增商品重复会报错
  • 冗余的序列化/反序列化操作没有实际作用,且仅读取了单商品参数,没有处理多商品数组参数
  • PayPal要求金额必须为保留两位小数的字符串格式,传递数字类型或者超过两位小数的数值会报错

修复后代码

router.post('/payment/paypal/:id', (req, res) => {
    const subscription_id = req.params.id;
    const url = 'https://v1.qalamnet.com/dashboard/'

    // 假设前端传递商品数组字段为goods,每个元素包含c_name、price_unit、quantity、sku字段
    const goodsList = req.body.goods || []
    let totalAmount = 0
    const items = []

    // 遍历生成商品列表,同时计算总金额
    goodsList.forEach(good => {
        // 格式化单价为两位小数字符串
        const unitPrice = Number(good.price_unit).toFixed(2)
        items.push({
            name: good.c_name,
            sku: good.sku, // 确保每个商品sku唯一
            price: unitPrice,
            currency: "USD",
            quantity: good.quantity
        })
        // 累加总金额
        totalAmount += Number(unitPrice) * Number(good.quantity)
    })
    // 总金额也格式化为两位小数字符串
    totalAmount = totalAmount.toFixed(2)

    const create_payment_paypal_json = {
        "intent": "sale",
        "payer": {
            "payment_method": "paypal"
        },
        "redirect_urls": {
            "return_url": url + "transaction_success",
            "cancel_url": url + "transaction_canceled"
        },
        "transactions": [{
            "item_list": {
                "items": items
            },
            "amount": {
                "currency": "USD",
                "total": totalAmount
            },
            "description": "Subscription"
        }]
    };
    
    paypal.payment.create(create_payment_paypal_json, function (error, payment) {
        if (error) {
            // 打印PayPal返回的详细错误信息,方便后续排查
            console.error('PayPal error details:', JSON.stringify(error.response, null, 2))
            res.status(400).send('Payment creation failed')
            return
        }
        const approvalUrl = payment.links.find(link => link.rel === 'approval_url')?.href
        if (approvalUrl) {
            res.redirect(approvalUrl)
        } else {
            res.status(500).send('Approval URL not found')
        }
    });
});

额外排查建议

如果修改后仍有问题,可以查看控制台打印的PayPal详细错误信息,里面会明确标注错误触发的具体字段和原因。

内容的提问来源于stack exchange,提问作者Mohamed Ben Salma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:36:03