Итак, я пытаюсь отправить вызов API в Paypal, и вот правильный способ сделать это в соответствии с документами Paypal:
"items": [
{
"name": "hat",
"description": "Brown hat.",
"quantity": "5",
"price": "3",
"tax": "0.01",
"sku": "1",
"currency": "USD"
},
{
"name": "handbag",
"description": "Black handbag.",
"quantity": "1",
"price": "15",
"tax": "0.02",
"sku": "product34",
"currency": "USD"
}
]
получена ошибка:
{ Error: Response Status : 400
at IncomingMessage.<anonymous> (C:\Users\Kadiem\node_modules\paypal-rest-
sdk\lib\client.js:130:23)
at IncomingMessage.emit (events.js:187:15)
at endReadableNT (_stream_readable.js:1094:12)
at process._tickCallback (internal/process/next_tick.js:63:19)
response:
{ name: 'VALIDATION_ERROR',
details: [ [Object] ],
message: 'Invalid request - see details',
information_link: 'https://developer.paypal.com/docs/api/payments/#errors',
debug_id: 'b2698c8d3e7a4',
httpStatusCode: 400 },
httpStatusCode: 400 }
а вот отправленный запрос от Nodejs:
router.post('/pay', (req, res) => {
orderid = req.body.orderid;
var products = JSON.parse(req.body.products);
const create_payment_json = {
"intent": "sale",
"payer": {
"payment_method": "paypal"
},
"redirect_urls": {
"return_url": "",
"cancel_url": ""
},
"transactions": [{
"item_list": {
"items":
products.map((product) => {
return {
name: product.productname,
sku: product._id,
price: product.price,
currency: "USD",
quantity: product.quantity
}
})
},
"amount": {
"currency": "USD",
"total": "1.00"
},
"description": "Test"
}]
};
paypal.payment.create(create_payment_json, function (error, payment) {
if (error) {
console.info(error);
} else {
for(let i = 0;i < payment.links.length;i++){
if (payment.links[i].rel === 'approval_url'){
console.info('Link sent', payment.links[i].href);
res.json({data: payment.links[i].href});
}
}
}
});
});
Я получаю сообщение об ошибке 400, что это я делаю неправильно, потому что внутренние ошибки PayPal не ясны, я не могу точно определить, в чем ошибка
@ Адам Я знаю, что это означает неверный запрос, и проблема в items, потому что до этого момента все работало
Я не знаком с PayPal API. Но .map(...) вернет массив. И в вашем случае похоже, что вы будете возвращать массив внутри массива; поэтому, возможно, удалите [] вокруг вашего метода products.map.
Удалите [], окружающий вызов products.map().
@Adam Адам, это массив внутри массива, я опубликовал правильный способ сделать это из документации Paypal.
@ThatBrianDude тоже не сработает
Нет. То, что вы опубликовали, НЕ является массивом внутри массива. Это ОДИН массив, содержащий ваши продукты. Однако ваш код создает ДВА массива. Один из них представляет собой набор продуктов, который находится внутри другого. Сделайте, как мы предложили, и удалите [].
Можете ли вы также показать запрос, который производит 400?
@AndrewLohr Я добавил ошибку, проблема с API Paypal в том, что они не показывают внутренних ошибок
Это может быть полезно, но я говорил о коде, который вы используете для отправки запроса. Или вы отправляете http-запрос каким-то другим способом, не связанным с кодом?
@AndrewLohr Я добавил запрос
для вашей ошибки, вы можете попробовать сделать console.info(JSON.stringify(error));? и поделитесь результатом. Возможно, подробности в ошибке будут более полезными.
@AndrewLohr OMG, спасибо, ошибка была в общей стоимости, большое спасибо!!!
@SimpleWebDesigner нет проблем, рад помочь! Можете написать ответ на свой вопрос? так что другие, кто сталкивается с этим, тоже могут получить некоторую информацию



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Согласно документации вам необходимо удалить [] из вашего запроса. По сути, вы создаете массив (products.map) внутри массива ([]).
Попробуй это:
"items": products.map((product) => {
return {
name: product.productname,
sku: product._id,
price: product.price,
currency: "AED",
quantity: product.quantity
}
})
Yh, я только что заметил это, и я удалил [], но все еще не работает
Вот правильный запрос:
router.post('/pay', (req, res) => {
orderid = req.body.orderid;
const products = JSON.parse(req.body.products);
currency = req.body.currency;
total = req.body.total;
subtotal = req.body.subtotal;
shipping = req.body.shipping;
tax = req.body.tax;
const create_payment_json = {
"intent": "sale",
"payer": {
"payment_method": "paypal"
},
"redirect_urls": {
"return_url": "",
"cancel_url": ""
},
"transactions": [{
"item_list": {
"items":
products.map((product) => {
return {
name: product.productname,
sku: product._id,
price: product.price,
currency: "USD",
quantity: product.quantity
}
}),
},
"amount": {
"currency": "USD",
"total": total,
"details": {
"subtotal": subtotal,
"tax": tax,
"shipping": shipping,
}
},
"description": "Thank you for shopping from us.",
"invoice_number": orderid,
}]
};
paypal.payment.create(create_payment_json, function (error, payment) {
if (error) {
console.info(JSON.stringify(error));
} else {
for(let i = 0;i < payment.links.length;i++){
if (payment.links[i].rel === 'approval_url'){
res.json({data: payment.links[i].href});
}
}
}
});
});
Мне нужно было сопоставить общую стоимость продуктов с промежуточной суммой
Код ошибки 400 указывает на неверный запрос или неверный синтаксис. Таким образом, скорее всего, ваша полезная нагрузка JSON искажена, у вас отсутствуют поля или данные, которые вы отправляете, имеют неверный формат. Если вы можете прикрепить тело ответа и тело вашего запроса, мы могли бы помочь больше.