В услуге IPN платежного шлюза Paypal тело запроса уведомления не определено - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь интегрировать услугу IPN платежного шлюза Paypal в узел js, используя "paypal-rest-sdk" и "paypal-ipn". Все отлично работает, кроме услуги IPN. Когда IPN API попадает на мой сервер, тело запроса кажется неопределенным, оно выдает req.body - неопределенная ошибка. Я только что создал URL-адрес запроса IPN в моей учетной записи продавца в песочнице.

Шаги, которые я выполнил,

1) вошел в систему https://www.sandbox.paypal.com/in/signin

2) Нажмите на Профиль и настройки на вкладке меню.

3) Инструменты продажи -> Обновление уведомлений о мгновенных платежах ->

4) Нажмите кнопку «Выбрать настройки IPN»,

5) Включили сообщение IPN и введите URL

6) Нажал кнопку сохранения, вот и все

Я думаю, это все, что нам нужно сделать. не так ли?

Как я уже упоминал выше, я использую "paypal-ipn" для управления службой IPN. Поскольку я использую экспресс js, я следовал за конфигурацией, как упомянуто в следующем URL. https://www.npmjs.com/package/paypal-ipn

код

const express = require('express');
const ejs = require('ejs');
const paypal = require('paypal-rest-sdk');
const ipn = require('paypal-ipn');

paypal.configure({
  'mode': 'sandbox', //sandbox or live
  'client_id': 'XXXXXXXXXXXXXXXXXXXXXXXXXX',
  'client_secret': 'XXXXXXXXXXXXX'
});

const app = express();

app.set('view engine', 'ejs');

app.get('/', (req, res) => res.render('index_page'));

app.post('/pay', (req, res) => {
  const create_payment_json = {
    "intent": "sale",
    "payer": {
        "payment_method": "paypal"
    },
    "redirect_urls": {
        "return_url": "http://bef4cbb1.ngrok.io/success",
        "cancel_url": "http://bef4cbb1.ngrok.io/cancel",
    },
    "transactions": [{
        "item_list": {
            "items": [{
                "name": "Shirt",
                "quantity": "001",
                "price": "50.00",
                "currency": "USD",
                "quantity": 1
            }]
        },
        "amount": {
            "currency": "USD",
            "total": "50.00"
        },
        "description": "Hat for the best team ever"
    }]
};

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

});

app.get('/success', (req, res) => {
  const payerId = req.query.PayerID;
  const paymentId = req.query.paymentId;

  const execute_payment_json = {
    "payer_id": payerId,
    "transactions": [{
        "amount": {
            "currency": "USD",
            "total": "50.00"
        }
    }]
  };

  paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) {
    if (error) {
        console.log(error.response);
        throw error;
    } else {
        console.log("-------Response--------"+JSON.stringify(payment));
        res.redirect("/payment_success");
    }
});
});


app.post('/paymnet_details_notification', (req, res) => {
     console.log("-----success_notification-- start---");
     ipn.verify(req.body, function(error,payment){
        if (error) {
            console.log("-----success_notification-- error---");
            console.log(error.response);
            throw error;
        } else {
            console.log("-----success_notification- success----");
        }
     });
    return "Data notification received"
});



app.get('/payment_success', (req, res) => res.render('payment_success'));

app.get('/payment_failed', (req, res) => res.render('payment_failed'));

app.get('/cancel', (req, res) => res.render('cancel'));

app.listen(3000, () => console.log('Server Started'));
...