Как перенаправить после выполнения платежа PayPal? - PullRequest
0 голосов
/ 07 октября 2019

Я следовал инструкциям по добавлению интеллектуальных кнопок оплаты из PayPal (https://developer.paypal.com/docs/checkout/integrate/) с помощью API SDK. Все работает нормально, за исключением того, что я не могу перенаправить покупателя после выполнения платежа.

Код JS на странице HTML выглядит следующим образом:

paypal.Buttons({
        createOrder: function (data, actions) {
            return actions.order.create({
                purchase_units: [{
                    amount: {
                        value: price
                    }
                }]
            });
        },
        onApprove: async function (data, actions) {
            return actions.order.capture().then(function (details) {
                alert('success!');
                return fetch('/paypal-transaction-complete', {
                    method: 'post',
                    headers: {
                        'content-type': 'application/json'
                    },
                    body: JSON.stringify({
                        orderID: data.orderID,
                    })
                });
            });
        }
    }).render('#paypal-button-container');

На стороне сервера я выполняю его с асинхронными функциями и жду обещания, используя функции стрелок:

app.post('/paypal-transaction-complete', function (req, res) {
    paypalRequestHandler.handleRequest(req, res)
        .then(() => {
            res.redirect('/'); // not working
        }).catch(err => {
        console.log(err);
        res.sendStatus(500);
    });
});

Мне интересно, почему он не перенаправляет, я могу сделать что-то вроде console.log (), но он просто не будет перенаправлять покупателя.

1 Ответ

0 голосов
/ 08 октября 2019

Чтобы ответить на мой собственный вопрос: после получения обещания на стороне сервера, код ответа должен быть возвращен клиенту, затем на стороне клиента местоположение страницы может быть изменено. Так что в моем случае это выглядит так на стороне сервера:

app.post('/paypal-transaction-complete', function (req, res) {
    paypalRequestHandler.handleRequest(req, res)
        .then(() => {
            res.sendStatus(200);
        }).catch(err => {
        console.log(err);
        res.sendStatus(500);
    });
});

На стороне клиента:

paypal.Buttons({
        createOrder: function (data, actions) {
            return actions.order.create({
                purchase_units: [{
                    amount: {
                        value: price
                    }
                }]
            });
        },
        onApprove: async function (data, actions) {
            return actions.order.capture().then(function (details) {
                alert('success!');
                const responsePromise = fetch('/paypal-transaction-complete', {
                    method: 'post',
                    headers: {
                        'content-type': 'application/json'
                    },
                    body: JSON.stringify({
                        orderID: data.orderID,
                    })
                });
                responsePromise.then(function (responseFromServer) {
                    if(responseFromServer.status === 200) {
                        location.href = 'success_page';
                    } else {
                        alert('smth went wrong');
                         location.href = '/';
                        })
                    }

                });
            });
        }
    }).render('#paypal-button-container');
...