Оплата

13 января 2018, 14:49

Платежных систем существует огромное количество, и у всех свои правила, поэтому интерфейс оплаты msPaymentInterface требует реализации всего двух методов: send и receive. То есть, для отправки и приёма платежа.

В обоих методах требуется объект заказа msOrder. Вы должны получить его, проверить и отправить\принять платеж.

Создание операции и отправка на оплату

Как таковую операцию оплаты в базе данных создаёт класс заказа. И если к заказу прицеплен метод оплаты, то заказ вызывает из него обязательный метод send.

if ($payment = $this->modx->getObject('msPayment', array('id' => $order->get('payment'), 'active' => 1))) {
    $response = $payment->send($order);
    if (is_array($response)) {
        $response = json_encode($response, true);
    }

    exit($response);
}

Всё, с этого момента работа переходит в msPayment, который загружает класс, ответственный за обработку: либо стандартный, либо ваш расширенный - если вы подключили его и указали в параметре class метода оплаты. Теперь весь экшен уходит в этот класс и для наглядности я буду использовать PayPal.

При создании класса он проверяет системные настройки, нужные для работы (логины\пароли и пр.), они влияют на запросы к сервису и обработку оплаты.

Все запросы на paypal.com работают через дополнительный метод request. Практически у любого сервиса есть демо на PHP, и вы сможете найти там подобный метод.

Дальше, опять же, всё по документации: создаём массив параметров, набиваем данными и отправляем на paypal.com.

У этого сервиса работа устроена так, что он проверяет ваш запрос и выдаёт секретный токен, который его верифицирует. Дальше вы должны перенаправить юзера с этим токеном на удалённый сервер, чтобы он таки оплатил заказ.

Редирект

Редиректом заведует javascript по умолчанию, который проверяет ответ от сервера при создании заказа и, либо перезагружает текщую страницу с id заказа, либо отправляет покупателя, куда сказано.

Это значит, что для отправки покупателя нам нужно вернуть из метода send массив с ключом redirect и адресом отправки в значении. Лично я не люблю показывать юзеру, что в ходе работы по созданию заказа возникла ошибка, поэтому дефолтный класс PayPal всегда возвращает положительный ответ.

Но, при ошибке он пишет ее в лог и говорит перезагрузить страницу, а при нормальной работе выдает редирект на сервис. Класс заказа, по умолчанию, принимает массив и отдаёт его в javascript. Если же метод оплаты вернёт ошибку - будет перезагрузка страницы с id заказа.

Почему именно так? Потому что, покупателя не должны волновать ваши ошибки и проблемы; он делает заказ и видит, что купил. А вы дальше уже чините свой сайт, связываетесь с ним и предлагаете удобный способ оплатить покупку.

Если же вы не согласны с моей логикой - еще раз напоминаю, что это всё работа "по умолчанию" и вы можете изменить абсолютно все шаги, модифицируя сразу и класс заказа и оплаты, и даже javascript.

Приём платежа

Обычно для того, чтобы удалённый сервис мог вас уведомить о прохождении оплаты, он обращается к одной из страниц вашего сайта и передаёт данные.

Как правило, вы сами настраиваете, куда обращаться и как передавать. Поэтому, в настройках PayPal я указываю адрес sitename.com/assets/components/minishop2/payment/paypal.php, который запускает MODX в режиме API. По сути - это контроллер приёма оплаты.

Чтобы загрузить расширенные классы используется метод loadCustomClasses(), который принимает тип классов. Дальше происходит запуск класса, и запрос на paypal.com, для получения информации об опрерации оплаты по полученному токену.

Токен это единственное, что передает PayPal, при перенаправлении покупателя обратно на сайт, поэтому тут и нужен еще один запрос. У других платежных систем может быть иначе, но в любом случае, ваша задача - установить номер заказа и проверить, оплатил ли его юзер.

Дальше я проверяю соответствие суммы заказа у меня, и у PayPal. Если они совпадают, то можно запускать метод receive из класса PayPal.

Этот метод проверяет нужные параметры и переключает статус заказа методом miniShop2::changeOrderStatus(), а тот уже сам обо всём позаботится, включая отправку писем об оплате.

После этого идёт редирект на страницу успешной оплаты или отказа. Их можно указать в настройках, а если нет - будет просто главная страница сайта.

Всё, оплата получена, заказ обработан.

Заключение

Мы рассмотрели цепочку оплаты, в которой вы можете изменить любое звено, под любую платежную систему или сервис.

Обратите внимание, что вы можете купить массу уже готовых методов оплаты на modstore.pro.


Следующий документ
Подключение