NextJS Получает ответ на транзакцию от Paypal

#paypal #next.js

Вопрос:

Я хочу написать конечную точку api, где вы можете поместить идентификатор заказа в запрос, и с помощью api PayPal я хочу проверить состояние состояния платежа.

Ссылка для разработчиков Paypal

Приведенная выше ссылка, по-видимому, является решением, но у них нет Next.JS пример. Я пытался следить за интеграцией узлов, но не могу заставить ее работать..

Сам платеж я выполняю с помощью «@paypal/react-paypal-js»: «^6.0.2», если эта информация полезна.

Это мой код, но я не получаю никакого заказа, он не определен на шаге 5…

 const checkoutNodeJssdk = require('@paypal/checkout-server-sdk');

const clientId = 'clientid';
const clientSecret = 'secret';
const environment = new checkoutNodeJssdk.core.SandboxEnvironment(clientId, clientSecret);
const payPalClient = new checkoutNodeJssdk.core.PayPalHttpClient(environment);


const handler = (req, res) => {

    // 2a. Get the order ID from the request body
  const orderID = '1243324';

  // 3. Call PayPal to get the transaction details
  let request = new checkoutNodeJssdk.orders.OrdersGetRequest(orderID);

  let order;
  try {
    order = payPalClient.execute(request);
  } catch (err) {

    // 4. Handle any errors from the call
    console.error(err);
    return res.send(500);
  }

  // 5. Validate the transaction details are as expected
  if (order.result.purchase_units[0].amount.value !== '220.00') {
    return res.send(400);
  }

    
    
    return res.status(200).json({ message: JSON.stringify(order.result)})
}

export default handler;
 

Я не могу преобразовать его в Next.js Может ли кто-нибудь показать мне пример для Next.js?

Редактировать:

Если я утешу.зарегистрируйте мой запрос, который я получаю:

 OrdersGetRequest {
  path: '/v2/checkout/orders/9JS050507F3815039?',
  verb: 'GET',
  body: null,
  headers: { 'Content-Type': 'application/json' }
}
 

И после этого под номером 5 появляется сообщение об ошибке:

 TypeError: Cannot read property 'purchase_units' of undefined
    at handler (webpack-internal:///./pages/api/hi.js:26:20)
    at apiResolver .. UnhandledPromiseRejectionWarning: Error: {"error":"invalid_client","error_description":"Client Authentication failed"}
    at IncomingMessage.<anonymous> (/Users/Development/nextjs/uploadcloudinary/node_modules/@paypal/paypalhttp/lib/paypalhttp/http_client.js:136:22)
    at IncomingMessage.emit (events.js:327:22)
    at endReadableNT (_stream_readable.js:1221:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)
(node:47190) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 10)
 

Ответ №1:

Наконец-то у меня все получилось! Для всех, кто хочет быстрое и надежное Next.JS решение о том, как проверить детали транзакций с помощью paypal api, может использовать мой код:

 const checkoutNodeJssdk = require('@paypal/checkout-server-sdk');

const clientId = 'your client id';
const clientSecret = 'your client secret';
const environment = new checkoutNodeJssdk.core.SandboxEnvironment(clientId, clientSecret);
const payPalClient = new checkoutNodeJssdk.core.PayPalHttpClient(environment);


export default async (req, res) => {

    // 1. Get the order ID from the request body
    const orderID = 'orderid';

    // 2. Call PayPal to get the transaction details
    let request = await new checkoutNodeJssdk.orders.OrdersGetRequest(orderID);
    
    let order;
    try {
        order = await payPalClient.execute(request);
    } catch (err) {

        // 3. Handle any errors from the call
        console.error(err);
        return res.send(500);
    }

    // 4. Validate the transaction details are as expected
    // Here you can do your own checks on the order
      if (order.result.purchase_units[0].amount.value !== '220.00') {
        return res.send(400);
      }

    // return whatever you want. If you check the order.result you can see the whole return from paypal
    // with all the fields you also can use in 4. for your own checks
    return res.status(200).json({ message: order.result })
}