решение для meteor:
ставим следующие пакеты (поддержка node пакетов и роутинг на серверной стороне).
meteor add meteorhacks:npm
meteor add meteorhacks:picker
в корне проекта появится файл packages.json, дописываем в него следующие модули.
{
"paypal-ipn" : "3.0.0",
"body-parser": "1.14.1"
}
на серверной стороне проекта создаем файл в котором конфигурируем роутинг.
const bodyParser = Meteor.npmRequire('body-parser');
Picker.middleware(bodyParser.urlencoded({ extended: false }));
Picker.middleware(bodyParser.json());
можно в этом же или в новом файле на серверной стороне, определяем пути и настраиваем сам listener.
Picker.route('/ipn', function(params, req, res, next) {
res.writeHead(200);
const ipn = Meteor.npmRequire("paypal-ipn");
// создаем обертку функции верификации
// можно так же верифицировать синхронно
const wrappedVerify = Async.wrap(ipn,"verify");
let verified = false;
//обрабатывать только пост запросы
if (req.method === "POST") {
// PayPal ждет от нас пересылки IPN сообщения
// делаем это первым:
try {
//второй аргумент в продакшене не нужен и по умалчанию false
verified = wrappedVerify(req.body, {"allow_sandbox" : true});
} catch (err) {
// код при ошибке
}
if (verified === 'VERIFIED') {
let payment = req.body;
// код если все успешно
}
}
res.end();
});