Это не может быть безопасно обработано во внешнем интерфейсе.Как вы указали, кто-то может вручную вызвать эту функцию payment_completed_cb
.
Код, который вы используете, предназначен исключительно для пользовательского опыта.Кто-то нажимает «купить», они переходят на PayPal, покупают, перенаправляются обратно, и ваш сайт говорит «1004» «Спасибо» .Вот и все, что должна делать эта функция, обработать отображение некоторого приглашения с благодарностью.
Может показаться, что платеж прошел, но для его решения может потребоваться время.Таким образом, PayPal ответит сообщением «хорошо выглядит» и перенаправит клиента обратно на ваш сайт.А позже по-настоящему завершите передачу.Например, если во время обработки транзакции Paypal решает, что она выглядит мошеннической, они могут отменить платеж.
Чтобы обойти все это, фактическая обработка подтверждения платежа будет происходить на сервере.Вы можете настроить Paypal для проверки связи с сервером по вашему выбору, когда платеж фактически подтвержден (он также будет скрыт от клиента).Это называется мгновенным уведомлением о платеже (IPN)
Это изображение иллюстрирует ход транзакции.
Изображение из этого ipn вступительного сообщения
Вы можете сделать это с NodeJS и развернуть как Безсерверная функция на AWS (первый миллион запросов бесплатный).Или разверните бесплатный экземпляр Heroku .Оба эти варианта дешевы, но имеют малое время запуска, если сервер простаивает.По моему опыту, это было только 200-300 мсек, чтобы начать с доли секунды.Это слишком долго, чтобы отвечать на запрос HTML, но идеально подходит для обработки возможного пинга из некоторого фонового API.
Пример реализации узла от paypal ipn
var ipn = require('paypal-ipn');
ipn.verify(params, function callback(err, msg) {
if (err) {
console.error(err);
} else {
// Do stuff with original params here
if (params.payment_status == 'Completed') {
// Payment has been confirmed as completed
}
}
});
//You can also pass a settings object to the verify function:
ipn.verify(params, {'allow_sandbox': true}, function callback(err, mes) {
//The library will attempt to verify test payments instead of blocking them
});
Для подробного руководства по шагам интеграции Paypal имеет документацию Paypal IPN