Nodejs Paypal API

Итак, я пытаюсь отправить вызов 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 не ясны, я не могу точно определить, в чем ошибка

Код ошибки 400 указывает на неверный запрос или неверный синтаксис. Таким образом, скорее всего, ваша полезная нагрузка JSON искажена, у вас отсутствуют поля или данные, которые вы отправляете, имеют неверный формат. Если вы можете прикрепить тело ответа и тело вашего запроса, мы могли бы помочь больше.

Adam 01.02.2019 16:53

@ Адам Я знаю, что это означает неверный запрос, и проблема в items, потому что до этого момента все работало

Kadiem Alqazzaz 01.02.2019 16:56

Я не знаком с PayPal API. Но .map(...) вернет массив. И в вашем случае похоже, что вы будете возвращать массив внутри массива; поэтому, возможно, удалите [] вокруг вашего метода products.map.

Adam 01.02.2019 16:58

Удалите [], окружающий вызов products.map().

ThatBrianDude 01.02.2019 17:00

@Adam Адам, это массив внутри массива, я опубликовал правильный способ сделать это из документации Paypal.

Kadiem Alqazzaz 01.02.2019 17:00

@ThatBrianDude тоже не сработает

Kadiem Alqazzaz 01.02.2019 17:01

Нет. То, что вы опубликовали, НЕ является массивом внутри массива. Это ОДИН массив, содержащий ваши продукты. Однако ваш код создает ДВА массива. Один из них представляет собой набор продуктов, который находится внутри другого. Сделайте, как мы предложили, и удалите [].

ThatBrianDude 01.02.2019 17:03

Можете ли вы также показать запрос, который производит 400?

Andrew Lohr 01.02.2019 17:11

@AndrewLohr Я добавил ошибку, проблема с API Paypal в том, что они не показывают внутренних ошибок

Kadiem Alqazzaz 01.02.2019 17:17

Это может быть полезно, но я говорил о коде, который вы используете для отправки запроса. Или вы отправляете http-запрос каким-то другим способом, не связанным с кодом?

Andrew Lohr 01.02.2019 17:18

@AndrewLohr Я добавил запрос

Kadiem Alqazzaz 01.02.2019 17:39

для вашей ошибки, вы можете попробовать сделать console.info(JSON.stringify(error));? и поделитесь результатом. Возможно, подробности в ошибке будут более полезными.

Andrew Lohr 01.02.2019 22:01

@AndrewLohr OMG, спасибо, ошибка была в общей стоимости, большое спасибо!!!

Kadiem Alqazzaz 02.02.2019 08:32

@SimpleWebDesigner нет проблем, рад помочь! Можете написать ответ на свой вопрос? так что другие, кто сталкивается с этим, тоже могут получить некоторую информацию

Andrew Lohr 04.02.2019 15:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
14
704
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Согласно документации вам необходимо удалить [] из вашего запроса. По сути, вы создаете массив (products.map) внутри массива ([]).

Попробуй это:

"items": products.map((product) => {
        return {
          name: product.productname,
          sku: product._id,
          price: product.price,
          currency: "AED",
          quantity: product.quantity
        }
      })

Yh, я только что заметил это, и я удалил [], но все еще не работает

Kadiem Alqazzaz 01.02.2019 17:07
Ответ принят как подходящий

Вот правильный запрос:

    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});
        }
      }
  }
});

});

Мне нужно было сопоставить общую стоимость продуктов с промежуточной суммой

Другие вопросы по теме