Однажды занимался разработкой платёжного шлюза. По сути это был агрегатор платёжных системы.

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

  • Cyberplat
  • Rapida
  • A3
  • ФСГ

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

Протокол Cyberplat основан на обмене подписанными сообщениями. Предполагается, что Вы пообщались с представителями этой компании, прошли все круги бюрократического ада и получили заветные ключи для тестового и боевого контуров.


Ipriv

Все сообщения подписываются библиотекой Ipriv, разработанной специалистами Cyberplat-а. Библиотека реализована для различных платформ, для PHP в том числе.

В скомпилированном виде выдаётся под PHP5.3 (на момент разработки было так, возможно, что-то изменилось).

Допустим, Вы получили исходники. Придётся чуть-чуть в них поковыряться.

  • Найти файл ipriv.c
  • Найти строчку #define MAX_OVERHEAD 1024
  • Изменить на #define MAX_OVERHEAD 4096

Это обязательно делать для новых ключей (полученных в 2016 году). Иначе будете получать ошибку «Длина ключа не соответствует длине подписи».

Далее внимательно читайте README файлы и четко следуйте указаниям и процесс компиляции и сборки под любую версию PHP займет минут 15 (под windows; скачать исходники PHP, выполнить make/nmake и подождать).

Сборка под Linux:

  1. sudo yum install gcc-c++
  2. в папке с исходниками иприв:
  3. chmod u+x configure.sh ./utils/chk_openssl.sh
  4. ./configure.sh
  5. make -f Makefile.linux
  6. cd php/phpipriv/phpipriv/
  7. phpize
  8. ./configure --enable-ipriv
  9. vi Makefile
    в строке
    LDFLAGS =
    дописать -L../../../ -lipriv, должно получиться в итоге
    LDFLAGS = -L../../../ -lipriv
  10. vi ipriv.c
    изменить строку
    #define MAX_OVERHEAD 1024
    на
    #define MAX_OVERHEAD 4096
  11. make clean
  12. sudo make install
  13. проверить подпись:
    cd ../../
    php -d"extension=ipriv.so" test.php
  14. vi /etc/php.ini
    прописать extension=ipriv.so
  15. service httpd restart

После подключения будут доступны ф-ции:


Сообщение

Для получения данных от шлюзов Cyberplat или выполнения любых действий (проведение и отмена платежей) необходимо POST-запросом отправить подписанное сообщение следующего вида:

0000035401SM000000970000009700000121
api99 00000990
 00000000
BEGIN
SD=199
AP=72
OP=990
DATE=04.07.2015 10:34:12
SESSION=56567567100010000000
NUMBER=9998887766
ACCOUNT=
AMOUNT=500.00
AMOUNT_ALL=505.00
REQ_TYPE=1
PAY_TOOL=0
TERM_ID=12345
COMMENT=test
ACCEPT_KEYS=01015206
NO_ROUTE=1
END
BEGIN SIGNATURE
iQBRAwkBAAAD3j2r2NwBAeevAf4nvAG4rGAyAePHkyVKTt7wffzURhOckd3ctgmG
yQkKWkXh3CLpsbrExsllVUBlO6ih8qHozk2uttXApzHXQXoO
=+pch
END SIGNATURE

Кодировка cp1251, разделитель \r\n.

Некоторые параметры присутствуют всегда, а некоторые варьируются. Необходимый набор можно посмотреть по ссылке в конце статьи.

Формирование происходит следующим образом:

<?php

$clientParams = [
   'SD' => $this->getSD(),
   'AP' => $this->getAP(),
   'OP' => $this->getOP(),
   'SESSION' => $this->getSessionStr(),
   'REQ_TYPE' => $this->getReqType(),
   'PAY_TOOL' => $this->getPayTool(),
   'TERM_ID' => $this->getTermId(),
   'ACCEPT_KEYS' => $this->getAcceptedKeys(),
   'NO_ROUTE' => $this->getNoRoute()
];
foreach ($clientParams as $key => $value) {
   $result[] = $key.'='.$value;
}
 
$message = implode(\r\n, $clientParams);
 
$signedMessage = ipriv_sign(mb_convert_encoding($message, 'cp1251',
                'utf-8'), $this->getSecretKey(), $this->getSecretKeyPassword());
 
$inputMessage = 'inputmessage='.urlencode($signedMessage[1]);


Ответ приходит в следующем виде:

0000030301SM000000460000004600000121
0J0005 00064182
 00000000
BEGIN
DATE=04.07.2015 12:34:12
SESSION=56567567100010000000
ERROR=0
RESULT=0
OPNAME=ОАО МТС Москва
ACCOUNT=3335566
ERRMSG=
AUTHCODE=123456789012
TRANSID=1234567890123
ADDINFO=Оплата штрафа по постановлению №32
REST=477123.90
RESTLIMIT=46000.0
GATEWAY_IN=71
GATEWAY_OUT=435
END
BEGIN SIGNATURE
iQBRAwkBAAD6tj1BJ10BAYKxAfsHlQsEFnO2k6ry++W8O8AiJuv4gT+ZVCfZHsKk
c0CbZpP/W3vkljG3xNzMLiqjbwkNuIdwR9Dq7gHmH+ZQMhbT
=LonP
END SIGNATURE

Его нужно провалидировать ф-цией ipriv_verify, которая вернёт код ошибки (0, если подпись валидна) и само сообщение.

К сожалению, у меня так и не получилось нормально обработать ответ Киберплатовского шлюза, т.к. ipriv-функции всегда ругаются на ответ. И с тестовыми ключами и с боевыми.

Пример работы со шлюзом:

<?php

$driver = new \professionalweb\paymentdrivers\cyberplat\Cyberplat();
//Нужно установить все необходимые параметры
$driver
   ->setAP(CYBERPLAT_AP)
   ->setOP(CYBERPLAT_OP)
   ->setSD(CYBERPLAT_SD)
   ->setTermId(CYBERPLAT_TERM_ID)
   ->setSerial(CYBERPLAT_SERIAL)
   ->setSecretKey(file_get_contents(CYBERPLAT_PATH_TO_SECRET_KEY))
   ->setPublicKey(file_get_contents(CYBERPLAT_PATH_TO_PUBLIC_KEY))
   ->setSecretKeyPassword(CYBERPLAT_SSL_KEY_PASSWORD)
   ->setNoRoute(CYBERPLAT_NO_ROUTE)
   ->setPayTool(CYBERPLAT_PAY_TOOL)
   ->setAcceptedKeys(CYBERPLAT_ACCEPT_KEYS);
//У киберплата на каждую услугу свой урл
$driver->setUrl(CYBERPLAT_URL);
//установить параметры платежа
$driver->setParams([]);
// провести оплату
$responsePay = $driver->pay();
// проверить статус платежа
$responseStatus = $driver->checkStatus();
// отправить сообщение с произвольными параметрами
$response = $driver->sendMessage([]);

Общая дока по оплате через кибер: http://www.cyberplat.ru/download/API_CyberPlat.pdf

Условная дока по услугам и категориям: http://www.cyberwallet.ru/cgi-bin/zebra.cgi?cmd=help

Список категорий http://www.cyberwallet.ru/cgi-bin/zebra.cgi?cmd=get_category&hr=1&format=xml

Список услуг по айди http://www.cyberwallet.ru/cgi-bin/zebra.cgi?cmd=get_op&hr=1&format=xml&id=2

Список всех услуг: http://www.cyberwallet.ru/cgi-bin/zebra.cgi?cmd=get_op&hr=1&format=xml - в браузере открывать не рекомендую, повисает)

Примеры основаны на этой библиотеке.



Комментарии

добавить
Комментариев пока нет. Будете первым?
Чтобы комментировать, нужно авторизоваться

Советуем почитать


Федеральная система
Сергей 0

Федеральная система "Город" читать далее

В прошлый раз описал процесс работы с платёжной системой Cyberplat, теперь хочу поделиться опытом работы с ФСГ (Федеральная система город).

Разработано сие чудо ЦФТ. Старались делать все по ГОСТ, поэтому произвести интеграцию не так просто, как хотелось бы (рассматриваем PHP).

0 11.07.2016 17:40:15

PHP Управление строками
Максим 0

PHP Управление строками читать далее

Мало кто из разработчиков задумывается о том, как устроено ядро PHP и что происходит «под капотом». Действительно, на практике большинству редко бывают нужны подобные знания, тем не менее обладать ими будет полезно. Статья рассказывает о том, как устроены строки в PHP и о различиях работы с ними в PHP 5 и 7.


Это мой первый перевод подобной статьи, тем более технически не самой простой. Обо всех неточностях пишите в комментариях или лично мне.

0 04.05.2016 23:28:31