尝试通过一次交易购买多件商品时出错

Error when trying to purchase multiple items with one transaction

我已经使用 PayPal API 来处理一件商品,现在我正试图让它与整个“购物车”一起使用。我遇到了一个我不知道如何解决的错误。我怀疑它可能必须对代表整个交易总成本的 payment-jsons 总价值做些什么。但是我不知道该怎么办。

这里是错误:

Error: Response Status : 400
    at IncomingMessage.<anonymous> (E:\Users\willi\Documents\Node\Store\node_modules\paypal-rest-sdk\lib\client.js:130:23)
    at IncomingMessage.emit (events.js:327:22)
    at endReadableNT (internal/streams/readable.js:1327:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  response: {
    name: 'MALFORMED_REQUEST',
    message: 'Incoming JSON request does not map to API request',
    information_link: 'https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST',
    debug_id: '9e8898a463ee3',
    httpStatusCode: 400
  },
  httpStatusCode: 400
}

这里是有问题的代码

    const pay = (req, res) => {
    
    async function f() {

        items = [];
        req_items = req.body.body

        let itemsProcessed = 0

        req_items.forEach(item => {
            console.log(item.id)


            const param = item.id
            Item.find({ _id: param })
            .then((result) => {
                const item_body = {
                    "name": result[0].title,
                    "sku": "001",
                    "price": parseFloat(result[0].price),
                    "currency": "EUR",
                    "quantity": item.amount
                }
                items.push(item_body)
                itemsProcessed = itemsProcessed + 1 
            })
            .catch((err) => {
                console.log(err)
            })   
        })

        let promise = new Promise((resolve, reject) => {
          setTimeout(() => resolve("done!"), 1000)
        });
      
        let result = await promise; // wait until the promise resolves (*)
      
        console.log(items)

        const create_payment_json = {
            "intent": "sale",
            "payer": {
                "payment_method": "paypal"
            },
            "redirect_urls": {
                "return_url": "http://localhost:3000/success",
                "cancel_url": "http://localhost:3000/cancel"
            },
            "transactions": [{
                "item_list": {
                    "items": [items]
                },
                "amount": {
                    "currency": "EUR",
                    "total": parseFloat(req.body.subtotal) // 25
                },
                "description": "Purcahsed from the Store"
            }]
        };
        
        // console.log(req.body)
        // console.log(create_payment_json.transactions[0])

        paypal.payment.create(create_payment_json, function (error, payment) {
            if (error) {
                throw error;
            } else {
                for(let i = 0;i < payment.links.length;i++){
                if(payment.links[i].rel === 'approval_url'){
                    res.redirect(payment.links[i].href);
                }
                }
            }
        });
    }
      
    f();
}

API 弃用通知

您正在集成已弃用的 v1/payments PayPal API。您不应该为新的集成这样做;当前 API 是 v2/checkout/orders, documented here.

通常您会希望在自己的服务器上创建两个路由,'Create Order' 和 'Capture Order',调用时 return 它们自己的 JSON。然后您可以将这两条路线与以下批准流程配对:https://developer.paypal.com/demo/checkout/#/pattern/server


但是对于您的问题,如果您只是记录您的请求 JSON 以查看它的问题所在,那么调试这样的问题会简单得多。

如果这样做,您将看到您发送的“项目”数组在只有一个项目(另一个数组)的数组内部有一个数组。那个数组不应该在那里。

这似乎是罪魁祸首:

                "items": [items]

这里您决定创建一个数组,这在“items”是单个项目(无数组)时很有用。但是当 items 已经是一个数组时,您不应该将数组放入 new 数组中——结果 JSON 不会映射到 API请求,PayPal 将 return 出错。

您应该做的是去掉这些括号并确保在代码执行的这一点上,“items”已经是一个数组(如果之前不是的话)。