Как отправить IPN Paypal в функцию Google Cloud? - PullRequest
0 голосов
/ 05 декабря 2018

Я прочитал здесь , что можно отправлять IPN напрямую в облачную функцию Google.У меня есть функции Google Cloud, работающие на Firebase для файла index.js.

Я настроил свои кнопки Paypal для отправки IPN на страницу в моем веб-приложении.

Вот пример одной из функций, которые я запускаю из облачных функций Google / Firebase:

// UPDATE ROOMS INS/OUTS
exports.updateRoomIns = functions.database.ref('/doors/{MACaddress}').onWrite((change, context) => {
    const beforeData = change.before.val(); 
    const afterData = change.after.val(); 
    const roomPushKey = afterData.inRoom; 
    const insbefore = beforeData.ins; 
    const insafter = afterData.ins; 
    if ((insbefore === null || insbefore === undefined) && (insafter === null || insafter === undefined) || insbefore === insafter) {
        return 0;
    } else {
        const updates = {};
        Object.keys(insafter).forEach(key => {
            updates['/rooms/' + roomPushKey + '/ins/' + key] = true;
        });
        return admin.database().ref().update(updates); // do the update} 
    }   
    return 0;
});

Теперь вопрос:

1) Я хочу добавить еще одну функцию для обработки IPN из Paypal, как только у меня будет транзакция.Как бы я пошел по этому поводу?

Я отмечу ответ как правильный, если решу этот первый вопрос.

2) как будет выглядеть эта облачная функция Google?

Я создам еще один вопрос, если вы сможете решить этот вопрос.

Примечание. Я использую Firebase (никаких других баз данных и PHP).

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

На основе ответа @Eliya Cohen:

на ваших функциях Firebase создайте такую ​​функцию, как:

exports.ipn = functions.https.onRequest((req, res) => {
    var reqBody = req.body;
    console.log(reqBody);
    // do something else with the req.body i.e: updating a firebase node with some of that info
    res.sendStatus(200);
});

Когда вы развернете свои функции, перейдите в консольный проект Firebase и проверьте свои функции,У вас должно быть что-то вроде этого:

enter image description here

Скопируйте этот URL, перейдите на PayPal, отредактируйте кнопку, которая вызывает покупку, прокрутите вниз до шага 3 ивнизу введите:

notify_url = вставьте сюда этот URL

Сохраните изменения.

Теперь вы можете проверить свою кнопку и проверить req.body в облачных функциях Firebase на вкладке Журнал.

0 голосов
/ 13 августа 2019

Благодаря ответам здесь, и особенно этой сути: https://gist.github.com/dsternlicht/fdef0c57f2f2561f2c6c477f81fa348e,

.. наконец-то разработали решение для проверки запроса IPN в облачной функции:

let CONFIRM_URL_SANDBOX = 'https://ipnpb.sandbox.paypal.com/cgi-bin/webscr';

exports.ipn = functions.https.onRequest((req, res) => {

    let body = req.body;
    logr.debug('body: ' + StringUtil.toStr(body));

    let postreq = 'cmd=_notify-validate';

    // Iterate the original request payload object
    // and prepend its keys and values to the post string
    Object.keys(body).map((key) => {
        postreq = `${postreq}&${key}=${body[key]}`;
        return key;
    });

    let request = require('request');

    let options = {
        method: 'POST',
        uri   : CONFIRM_URL_SANDBOX,
        headers: {
            'Content-Length': postreq.length,
        },
        encoding: 'utf-8',
        body: postreq
    };

    res.sendStatus(200);

    return new Promise((resolve, reject) => {

        // Make a post request to PayPal
        return request(options, (error, response, resBody) => {

            if (error || response.statusCode !== 200) {
                reject(new Error(error));
                return;
            }

            let bodyResult = resBody.substring(0, 8);
            logr.debug('bodyResult: ' + bodyResult);

            // Validate the response from PayPal and resolve / reject the promise.
            if (resBody.substring(0, 8) === 'VERIFIED') {
                return resolve(true);
            } else if (resBody.substring(0, 7) === 'INVALID') {
                return reject(new Error('IPN Message is invalid.'));
            } else {
                return reject(new Error('Unexpected response body.'));
            }
        });

    });

});

Также благодаря:

Чтобы получить данные сообщения IPN от PayPal, ваш слушатель должен выполнить следующую последовательность запросов-ответов:

Ваш слушатель прослушивает сообщения HTTPS POST IPN, которые PayPal отправляет с каждым событием.После получения сообщения IPN от PayPal ваш слушатель возвращает пустой ответ HTTP 200 в PayPal.В противном случае PayPal повторно отправляет сообщение IPN.Ваш слушатель отправляет полное сообщение обратно в PayPal, используя HTTPS POST.

Добавьте префикс возвращенного сообщения к переменной cmd = _notify-validate, но не изменяйте поля сообщения, порядок полей или кодировку символовиз исходного сообщения.

0 голосов
/ 05 декабря 2018

IPN - это просто сервер, который пытается достичь заданной конечной точки.

Во-первых, вы должны убедиться, что ваш план firebase поддерживает запросы третьих сторон (он недоступен в бесплатном плане).

После этого вам нужно создать конечную точку http, например:

exports.ipn = functions.http.onRequest((req, res) => {
    // req and res are instances of req and res of Express.js
    // You can validate the request and update your database accordingly.
});

Она будет доступна в https://www.YOUR -FIREBASE-DOMAIN.com / ipn

...