Оплата
Платежных систем существует огромное количество, и у всех свои правила, поэтому интерфейс оплаты 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.