尝试通过一次交易购买多件商品时出错
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”已经是一个数组(如果之前不是的话)。
我已经使用 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”已经是一个数组(如果之前不是的话)。