Общий принцип оплаты в интернет-магазине через платежную систему (HTTP)
Черновик — есть неточности
Если вам нужно будет организовать оплату на своем сайте и под ваш фреймворк или ЦМС нет готовых решений — его не сложно написать самому.
Общий принцип работы
Все платежные системы работают примерно по одной схеме — у них есть API, который работает в частности через HTTP. При оплате товара магазин отправляет запрос на нужный URL платежки с параметрами заказа.
Нужно несколько параметров, например некий ID заказа, стоимость (price), вспомогательные параметры (например lang(язык), currency (валюта) и т. д...)
Наша цель — редиректить наш заказ на этот адрес, например в контроллере при оплате:
return $this->redirect('https://merchant.ru/payment.aspx?' . http_puild_query([
'id' => $order->id,
'price' => $order->price,
]))
Когда сервер платежки получает запрос и пользователь оплачивает — происходят два варианта события: Success или Fail
Success — значит все отлично и происходит простой редирект назад в магазин.
При регистрации в системе своего проекта мы укзаываем successUrl — именно на него платежка и редиректит, например http://shop.dev/payment/success
Fail — происходит аналогично
URL для проверки заказа
Но при этом есть самый главный URL для взаимодействия — processUrl, этот URL интернет-магазина запрашивается «тайком» платежной системой тогда, когда осуществляется платеж.
Порядок работы:
- Оплата → (redirect) → merchant.ru/payment.aspx?id=123&price=1000
- Пользователь оплачивает
- Когда он нажимает оплатить, платежная система идет с запросом на processUrl, например на /payment/process (GET или POST), передавая параметры — чтобы проверить заказ.
- Наш сайт отвечает OK или не OK
- Если ОК → платежка списывает с человека деньги, и выводит примерно текст «Перейи на сайт магазина» (которая ведет на successUrl)
Сигнатура
Но если бы такая схема работала, то человек мог подменить к примеру цену, занизив ее, потому передают секретный ключ в параметре signature
https://merchant.ru/payment.aspx?id=123&price=1000&signature=dfg7fh6f54jhfgjh8ол65рро6
Например это мог бы быть некий хэш параметров:
md5($id . ':' . $price);
Но такой можно подменить или разгадать, потому делается чуть сложнее.
Платежки выдают пару ключей:
$password1= 'gfg5fh7677hjf';
$password2= '454545';
Почему нельзя обойтись одним — первый используется при кодировании нашых параметров, то есть
вместо md5($id . ’:’ . $price);
делают md5($id . ’:’ . $price . ’:’ . $password1);
После того как платеж оплачен во время редиректа платежка отправляет в запросе параметр сигнатуры на основе второго пароля, а мы проверяем.
Грубо говоря, через password1 мы подписываем запрос, а на сервере платежки идет проверка, когда платежка отправляет ответ — она подписывает его через password2. Так как данные ключи есть и у клиента и у платежки — это происходит безопасно и удобно.