Я пытаюсь интегрировать услугу 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'));