Общий принцип оплаты в интернет-магазине через платежную систему (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 интернет-магазина запрашивается «тайком» платежной системой тогда, когда осуществляется платеж.

Порядок работы:

  1. Оплата → (redirect) → merchant.ru/payment.aspx?id=123&price=1000
  2. Пользователь оплачивает
  3. Когда он нажимает оплатить, платежная система идет с запросом на processUrl, например на /payment/process (GET или POST), передавая параметры — чтобы проверить заказ.
  4. Наш сайт отвечает OK или не OK
  5. Если ОК → платежка списывает с человека деньги, и выводит примерно текст «Перейи на сайт магазина» (которая ведет на 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. Так как данные ключи есть и у клиента и у платежки — это происходит безопасно и удобно.

Популярное