Документация Clouden
Режим фокусировки

Создание модулей платежных систем

Платёжные методы интегрируют Clouden с внешними платёжными системами. Модуль платёжной системы отвечает за:

  • набор настроек подключения;
  • внешний вид формы настроек;
  • внешний вид и поведение формы оплаты на стороне клиента.

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

  • переадресация клиента на сайт платёжной системы для оплаты;
  • выставление счёта и ожидание, когда клиент проведёт оплату.

Общие сведения

Каталог установки: /usr/local/mgr5/paymethods/
XML-описание: /usr/local/mgr5/etc/xml/billmgr_mod_pm<имя>.xml

Управление: основной скрипт модуля (pmXXX) и CGI-скрипты.

Основной модуль pm<имя> вызывается только Clouden. У модуля нет данных о браузере пользователя, и он не возвращает HTML-код. Задачи модуля:

  • сообщить Clouden о поддерживаемых возможностях (--command config);
  • настроить и валидировать параметры метода оплаты (pmtune, pmvalidate);
  • выполнить оплату без редиректа или произвести подготовительные действия перед редиректом (crset);
  • проверить статус платежей ( checkpay);
  • выполнить возврат или перевод средств (rfset, tfset).

CGI-скрипты вызываются из браузера пользователя или платёжной системой по HTTP. Они работают как обычные веб-страницы и могут выдавать HTML-код. Задачи CGI-скриптов:

  • перенаправить пользователя на страницу оплаты платёжной системы (payment_script);
  • принять уведомление (webhook) от платёжной системы об изменении статуса платежа и вызвать payment.setpaid (скрипт результата);
  • показать страницу привязки карты для автоплатежей (recurring_script).

CGI-скрипты необязательны — если вся логика реализована в основном модуле (например, оплата по выставленному счёту без редиректа), они могут отсутствовать. Подробнее см. раздел CGI-скрипты модуля.

Механизм работы модуля

Этапы работы с модулем платёжной системы в Clouden:

  1. Первоначальная настройка:
    1. Установка модуля.
    2. Добавление подключения к платёжной системе.
  2. Процесс проведения платежа:
    1. Создание клиентом платежа.
    2. Оплата клиентом выставленного счёта.
    3. Зачисление или отмена платежа.

Установите модуль:

  • вручную, если он представлен набором файлов;
  • из стандартного репозитория при помощи пакетного менеджера.

После установки модуль становится доступен для выбора при создании метода оплаты в Clouden.

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

Структура модуля

Модуль платёжной системы состоит из двух и более файлов. Основные файлы — XML-описание модуля и скрипт, который передаёт конфигурацию модуля в платформу. Обычно используют два CGI-скрипта: для переадресации клиента на сайт платёжной системы и для получения оповещений об изменении статуса платежа от платёжной системы.

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

Стандартный набор файлов модуля выглядит следующим образом:

Имя файлаОписаниеОбязательныйПроизвольное имя
/usr/local/mgr5/etc/xml/billmgr_mod_pmXXX.xmlXML-описание модуля.ДаНет
/usr/local/mgr5/paymethods/pmXXXОсновной скрипт модуля.ДаНет
/usr/local/mgr5/cgi/XXXpaymentСкрипт оплаты.НетДа
/usr/local/mgr5/cgi/XXXresultСкрипт обработки оповещений.НетДа
/usr/local/mgr5/cgi/XXXrecurringСкрипт активации рекуррентной оплаты.НетДа
/usr/local/mgr5/cgi/XXXrecurringresultСкрипт обработки оповещений о рекуррентной оплате.НетДа

Где XXX — название модуля, которое указывается латиницей. Если название основного скрипта модуля содержит расширение файла, оно также включается в имя модуля. Например, если ваш скрипт называется pmpay.php, то имя модуля — pay.php, а не pay.

Описание XML

Наименование файла должно иметь вид billmgr_mod_pmXXX.xml, где XXX — имя модуля. Файл нужно скопировать в каталог /etc/xml относительно пути установки Clouden. Файл содержит описание самого модуля (описывается как плагин), а также описание дополнительных форм и сообщений.

Пример XML-файла

Элемент <plugin> отвечает за описание самого модуля. Свойство name совпадает с именем модуля платёжной системы. Внутри элемента может быть один элемент group со значением payment_method, который указывает, что данный модуль используется для методов оплаты, и несколько элементов msg. Свойство lang у элемента указывает, к какому языку относится сообщение, атрибут name может иметь следующие значения:

  • desc_short — краткое описание модуля. Отображается при выборе модуля в Clouden;
  • desc_full — полное описание модуля. Отображается при построении списка установленных модулей в COREmanager.

Элемент metadata с именем paymethod.edit.XXX отвечает за дополнительные поля модуля при добавлении и настройке метода оплаты. Формируется согласно стандартному описанию XML-формы. Разместите поля в элементе <page name="methodprops"></page> для корректного размещения полей на формах в Clouden. Поддерживается атрибут private, который запрещает вывод данного атрибута в XML при печати счёта по созданному платежу. Используется для секретных данных, таких как пароль или секретный ключ. Элемент   recurring описывает настройки рекуррентных платежей, элемент   refundpage — настройку отмены платежей.

Элемент metadata с именем payment.edit.XXX отвечает за дополнительные поля, которые клиент видит при совершении оплаты. Описывается согласно стандартной схеме для XML-форм в Clouden. Подробнее см. в статье Модули. Общие принципы.

Элемент metadata с именем paymethod.transfer.XXX отвечает за дополнительные поля, отображаемые при переводе средств обратно клиенту. Описывается согласно стандартной схеме описания XML-форм в Clouden.

Элемент lang содержит переводы наименований полей на форме согласно стандартной схеме описания переводов. Раздел <messages name="label_paymethod"> отвечает за подпись наименования модуля платёжной системы в списке методов оплаты.

Основной скрипт модуля

Основной скрипт модуля платёжной системы передаёт в платформу информацию о поддерживаемых функциях и обрабатывает некоторые из них. При работе с модулем Clouden выполняет файл скрипта со следующими параметрами:

paymethods/pmxxx --command cmd [--payment id [--amount amnt]]

Где:

  • cmd — управляющая команда;
  • id — код платежа;
  • amnt — сумма в валюте метода оплаты (используется при возврате и переводе денежных средств).

Обязательная команда:

  • config — возвращает XML-файл с <feature> (список поддерживаемых возможностей) и <param> (пути к CGI-скриптам или recurring).

Основные команды (вызываются в зависимости от заявленных <feature>):

  • pmtune или pmvalidate — настройка и проверка параметров метода оплаты;
  • crtune или crvalidate или crset — настройка формы оплаты, проверка данных, выполнение платежа;
  • crdelete — удаление платежа;
  • rftune или rfvalidate или rfset — настройка, проверка и выполнение возврата (refund);
  • tftune или tfvalidate или tfset — настройка, проверка и выполнение перевода (transfer);
  • rctune или rcvalidate или rcset или rcpay или rcdelete — рекуррентные (автоматические) платежи (recurring);
  • checkpay — проверка статуса платежей.

Возможные <feature> в ответе config:

  • refund;
  • transfer;
  • recurring;
  • redirect;
  • noselect;
  • notneedprofile;
  • pmtune;
  • pmvalidate;
  • crtune;
  • crvalidate;
  • crset;
  • crdelete;
  • rftune;
  • rfvalidate;
  • rfset;
  • tftune;
  • tfvalidate;
  • tfset;
  • rctune;
  • rcvalidate;
  • rcset;
  • rcpay;
  • rcdelete.
Пример вызова платёжного метода
/usr/local/mgr5/paymethods/pmnowpayments --command config

Команда

Параметры

Вход (stdin)

Выход

Примечание

config

—

—

XML-файл с <feature> и <param>

Обязательная команда.

pmtune

—

XML-файл формы настроек.

Изменённая форма.

—

pmvalidate

—

XML-файл введённых данных.

<doc/> или ошибка.

—

crtune

—

XML-файл формы оплаты.

Изменённая форма.

—

crvalidate

—

XML-файл введённых данных.

<doc/> или ошибка.

—

crset

--payment

—

—

—

crdelete

--payment

—

—

—

rftune

—

XML-файл формы возврата.

Изменённая форма.

—

rfvalidate

—

XML-файл введённых данных.

<doc/> или ошибка.

—

rfset

--payment, --amount

XML-файл с данными возврата.

—

—

tftune

—

XML-файл формы перевода.

Изменённая форма.

—

tfvalidate

—

XML-файл введённых данных.

<doc/> или ошибка

—

tfset

—

XML-файл с данными перевода.

—

—

rctune

—

XML-файл формы рекуррентных платежей.

Изменённая форма.

—

rcvalidate

—

XML-файл введённых данных.

<doc/> или ошибка

—

rcset

—

—

—

—

rcpay

--payment

—

—

—

rcdelete

--recurring , --payment

—

—

—

checkpay

—

—

—

Команда собирает записи платежей из базы данных и проверяет, изменился ли статус во внешней системе.

Пояснения к XML-файлу

В параметр --command могут быть переданы следующие значения:

  • config — запрос конфигурации модуля. В ответ модуль должен вернуть в стандартный поток вывода XML-документ:
    Пример XML-документа

Элемент feature содержит список возможностей модуля платёжной системы. Если возможность не поддерживается, она не должна присутствовать в выводе результата выполнения команды.

Список допустимых значений:

  • refund — указывает на поддержку отмены платежей, возврата средств. Без этой возможности обработка команд rftune, rfvalidate, rfset не требуется;
  • transfer — указывает на поддержку перевода средств со счёта в платёжной системе на счёт клиента. Без этой возможности обработка команд tftune, tfvalidate, tfset не требуется;
  • recurring — указывает на поддержку рекуррентных платежей. Без этой возможности параметры recurring_script и recurring_type можно не указывать;
  • redirect — указывает, что для совершения оплаты с помощью платёжной системы модуль переадресует клиента в платёжную систему;
  • noselect — метод оплаты не будет отображаться в списке при выборе клиентом. Используется в случае, если для оплаты не требуется предварительное создание платежа в Clouden. Например, при оплате через терминал;
  • notneedprofile — указывается, если для совершения платежа указание плательщика не обязательно. Однако, если метод оплаты будет подключён к компании, система запросит у клиента создание или выбор плательщика;
  • pmtune — указывается, если для корректного отображения формы настройки метода оплаты нужно выполнить дополнительные действия. Подробнее см. в описании команды pmtune;
  • pmvalidate — если указано, при сохранении параметров метода оплаты будет вызван модуль для проверки введённых значений;
  • crtune — указывается, если для корректного отображения формы оплаты требуется выполнение дополнительных действий. Подробнее см. в описании команды crtune;
  • crvalidate — если указано, при сохранении введённых клиентом значений будет вызван модуль для проверки ;
  • crset — указывается, если:
    • перед переадресацией на оплату требуется выполнение модулей каких-либо действий;
    • оплата совершается без перехода в платёжную систему;
    • при оплате необходим ввод данных клиентом;
  • crdelete — указывается, если для корректного удаления платежа необходимо выполнение действий на стороне платёжной системы;
  • rftune — аналогично crtune, но при возврате средств;
  • rfvalidate — аналогично crvalidate, но при возврате средств;
  • rfset — обязательная возможность для возврата средств. При вызове команды модуль выполняет все необходимые действия для возврата;
  • rctune — аналогично crtune, но при рекуррентных платежах;
  • rcvalidate — аналогично crvalidate, но при рекуррентных платежах;
  • rcset — аналогично crset, но при настройке рекуррентных платежей со стороны клиента. Используется для настройки рекуррентных платежей со стороны платёжной системы;
  • rcpay — вызывается при создании в Clouden рекуррентного платежа. Используется для вызова оплаты со стороны платёжной системы;
  • rcdelete — указывается, если для корректного удаления профиля автоплатежа необходимо выполнение действий на стороне платёжной системы;
  • tftune — аналогично crtune, но при переводе средств;
  • tfvalidate — аналогично crvalidate, но при переводе средств;
  • tfset — обязательная возможность для перевода средств. При вызове команды модуль выполняет все необходимые действия для перевода;
  • checkpay — вызов Clouden для проверки статуса платежей во внешней системе.

Clouden передаёт пути к скриптам через ответ команды config в секции <param>. Clouden использует эти пути для формирования ссылок, по которым браузер пользователя или платёжная система будут обращаться к скриптам.

Элемент param содержит список параметров метода оплаты. Поддерживаются:

  • payment_script — путь к скрипту переадресации на оплату относительно домена установки Clouden. Например, если скрипт находится по адресу http://domain.com/cgi/pullpayment.php , укажите /mancgi/pullpayment.php;
  • recurring_script — путь к скрипту переадресации на подтверждение активации рекуррентных платежей. Например, если скрипт находится по адресу http://domain.com/cgi/pullrecurringpayment.php , укажите /mancgi/pullrecurringpayment.php;
  • recurring_type — битовая маска поддерживаемых возможностей рекуррентных платежей. Каждому пункту ниже соответствует позиция бита: чтобы получить значение флага, нужно сдвинуть 1 влево на указанное количество позиций (1 << N). Итоговое значение параметра — результат объединения нужных флагов через побитовое ИЛИ. 
    • 1 (значение 2) — платёж создаётся отдельно по каждой услуге;
    • 2 (значение 4) — платёж создаётся по нескольким услугам;
    • 7 (значение 128) — платёж создаётся по всем услугам;
    • 8 (значение 256) — для регистрации платежа требуется указание максимальной суммы;
    • 20 (значение 1 048 576) — для подтверждения рекуррентного платежа требуется переадресация в платёжную систему;
    • 21 (значение 2 097 152) — для подтверждения необходимо выполнение клиентом дополнительных действий. 
  • Пример

*tune (pmtune, crtune, rftune, tftune, rctune) — вход и выход

Вход — стандартная XML-форма Clouden.
Выход — изменённый XML-файл формы.

*validate (pmvalidate, crvalidate, rfvalidate, tfvalidate, rcvalidate) — вход и выход

Вход: XML-форма с данными, введёнными пользователем на форме.

<doc>
<field1>value1</field1>
<field2>value2</field2>
</doc>

Выход: при успехе — <doc/>; при ошибке — XML-форма ошибки.

rfset — вход (stdin)

Принимает данные об исходном либо созданном для возврата платеже. Например:

  • сумму возврата;
  • описание причины возврата;
  • параметры метода оплаты.
Пример принимаемых данных
  

tfset — вход (stdin)

Принимает данные о созданном для перевода платеже. Например:

  • сумму перевода;
  • параметры метода оплаты.
Пример принимаемых данных

CGI-скрипты модуля

CGI-скрипты — необязательная часть модуля платёжной системы. Они могут отсутствовать, если вся логика реализована в основном модуле. Например, при оплате через ЮMoney-кошелёк, счёт выставляется пользователю основным скриптом модуля и его оплата проверяется по расписанию.

Возможны также случаи, когда модуль содержит несколько CGI-скриптов:

  • оплаты;
  • получения уведомлений об изменении статуса платежа;
  • другие скрипты, которые требует платёжная система.

Например, для интеграции с ЮMoney реализован дополнительный CGI-скрипт, выполняющий проверку введённых клиентом данных на стороне ЮMoney. Для этого платёжная система вызывает скрипт и передаёт ему введённые клиентом данные, а также параметр, отвечающий за тип операции — check.

CGI-скрипты могут располагаться на отличном от Clouden сервере, либо на другом IP-адресе или домене. Все зависит от требований разработчика модуля и платёжной системы. Например, существуют схемы, при которых авторизация при отправке уведомления об изменении статуса платежа выполняется по клиентскому сертификату. В этом случае требуется размещение скрипта на отдельном VirtualHost с настройкой обработки клиентских сертификатов. Если специфика в интеграции отсутствует, для упрощения поддержки модуля платёжной системы рекомендуется размещать CGI-скрипты в стандартном каталоге Clouden — /usr/local/mgr5/cgi

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

Скрипт оплаты (payment_script) получает через HTTP-запрос параметр elid (идентификатор платежа). С помощью функции payment.info скрипт запрашивает данные, необходимые для формирования формы оплаты. Стандартный способ — автоматическая отправка формы при загрузке страницы:

Пример формы
<html>
  <head>
    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
    <link rel='shortcut icon' href='billmgr.ico' type='image/x-icon' />
    <script language='JavaScript'>
      function submit() {
        document.frm.submit();
      }
    </script>
  </head>
  <body onload='submit()'>
    <form name='frm' action='https://paysystem/url' method='post'>
      <input type='hidden' name='shop_id' value='1'>
      <input type='hidden' name='amount' value='1.00'>
    </form>
  </body>
</html>

Функция возвращает ответ в формате XML или JSON:

Пример XML-ответа функции payment.info

К элементу payment добавляются дополнительные параметры, которые нужно указать клиентам при оплате. К элементу paymethod добавляются все параметры метода оплаты. Такой способ получения информации о платеже исключает прямое обращение к базе данных Clouden.

Скрипт получения уведомлений об изменении состояния платежа

Скрипт обработки оповещений об изменении статуса платежа от платёжной системы принимает HTTP-запрос от платёжной системы (webhook), проверяет подпись, сверяет данные и вызывает одну из функций изменения статуса платежа:

Функция Clouden

Параметры

Назначение

payment.setpaid

elid, info, externalid

Зачислить платёж.

payment.setinpay

elid, info, externalid

Пометить как оплачивающийся.

payment.setnopay

elid, info, externalid

Пометить как неоплаченный.

payment.setfraud

elid, info, externalid

Пометить как мошеннический.

Алгоритм работы скрипта результата:

  1. Выделяет код платежа из данных от платёжной системыиз  в BILLmana ger.
  2. По коду платежа получает информацию о платеже и параметрах метода оплаты:
    • из базы данных;
    • при помощи функции payment.info.
  3. Сравнивает данные, полученные от платёжной системы с данными, хранящимися в Clouden.
  4. При наличии у полученных данных контрольной подписи проверяет её с помощью секретного ключа.
  5. Изменяет статус платежа в Clouden в соответствии с полученными данными с помощью одной из функций, описанных ниже.
  6. При необходимости оповещает платёжную систему об успешной или неуспешной обработке входящего запроса.

Другие CGI-скрипты

Скрипт рекуррентных платежей (recurring_script)  показывает пользователю страницу привязки карты. После успешной привязки сохраняет токен и передаёт его в Clouden.

Функции Clouden

ФункцияОписаниеПараметры
payment.info Отображает всю доступную информацию о платеже.
  • elid — код платежа.

payment.setfraud

Помечает платёж как мошеннический.
  • elid — код платежа;
  • info — дополнительная информация;
  • externalid — код платежа в платёжной системе.

payment.setinpay 

Помечает платёж как оплачиваемый.
  • elid — код платежа;
  • info — дополнительная информация;
  • externalid — код платежа в платёжной системе.

payment.setnopay

Помечает платёж как неоплаченный.
  • elid — код платежа;
  • info — дополнительная информация;
  • externalid — код платежа в платёжной системе.

payment.setpaid

Зачисляет платёж.
  • elid — код платежа;
  • info — дополнительная информация;
  • externalid — код платежа в платёжной системе.

payment.success

Отображает страницу успешного завершения оплаты.
  • elid — код платежа;
  • module — имя модуля интеграции.

payment.fail

Отображает страницу ошибки при оплате.
  • elid — код платежа;
  • module — имя модуля интеграции.

Страницы возврата

После совершения оплаты для возврата клиента в Clouden используются стандартные функции:

Функция

Параметры

Назначение

payment.success

elid — код платежа, module — имя модуля

Страница успешного завершения оплаты.

payment.fail

elid — код платежа, module — имя модуля

Страница ошибки оплаты.

Чтобы дополнить формы, отображаемые функциями, укажите в XML-описании плагина:

<metadata name="payment.XXX.success" type="form">
<form>
<field name="success_description" noname="yes" formwidth="yes">
<textdata name="success_description"/>
</field>
</form>
</metadata>
<metadata name="payment.XXX.fail" type="form">
<form>
<field name="fail_description" noname="yes" formwidth="yes">
<textdata name="fail_description"/>
</field>
</form>
</metadata>

Пример модуля

Пример иллюстрирует реализацию модуля платёжной системы по PULL (REST) протоколу.

PHP

Модуль состоит из следующих основных файлов:

  • etc/xml/billmgr_mod_pmpull.php.xml — XML-описание;
  • paymethods/pmpull.php — основной скрипт;
  • cgi/pullpayment.php — CGI-скрипт перенаправления на оплату;
  • cgi/pullresult.php — CGI-скрипт получения уведомлений от платёжной системы.

А также вспомогательного файла:

  • include/php/bill_util.php

Функции bill_util.php

Перед включением в свой скрипт файла bill_util.php необходимо определить макрос __MODULE__, для формирования имени файла лога. 

Пример определения макроса __MODULE
set_include_path(get_include_path() . PATH_SEPARATOR . "/usr/local/mgr5/include/php"); 
define('__MODULE__', "pmXXX"); 
require_once 'bill_util.php';

Файл bill_util.php предоставляет следующие функции:

  • Debug($str) — выводит $str в качестве дополнительной информации в лог;
  • Error($str) — выводит $str в качестве сообщения об ошибке в лог;
  • LocalQuery($function, $param, $auth = NULL) — выполняет в Clouden функцию $function, передав ей параметры из массива $param и код сессии из $auth;
  • HttpQuery($url, $param, $requesttype = "POST", $username = "", $password = "", $header = array("Accept: application/xml")) — выполняет запрос к $url с параметрами из $param, используя тип запроса $requesttype и данные авторизации из $username и $password. Также можно передать дополнительные заголовки в $header;
  • CgiInput($skip_auth = false) — получает массив параметров, полученных скриптом в строке запроса или POST-данных. Параметр $skip_auth отвечает за получение параметра auth из cookie, если он отсутствует в полученных данных;
  • ClientIp() — получает IP-адрес, с которого вызван скрипт;
  • class Error — определяет класс ошибки, имитирующей поведение при ошибках в COREmanager.

С++ (с использованием библиотек Clouden)

Кроме приведённого примера вы можете изучить примеры из пакета разработчика Clouden. Clouden содержит библиотеки, необходимые для работы модулей на С++. Для разработки собственных модулей обработчиков:

  1. Подключитесь к серверу с платформой по SSH. Подробнее о подключении по SSH см. в статье Настройка рабочего места.
  2. Установите пакет ПО:
Ubuntu, AstraLinux:
apt-get install billmanager-corporate-dev
AlmaLinux:
dnf install billmanager-corporate-devel

После установки содержимое пакета будет доступно в следующих директориях:

ПутьСодержимое
/usr/local/mgr5/include/billmgr/Библиотеки для разработки.
/usr/local/mgr5/src/examples/Примеры модулей.

/usr/local/mgr5/src/template/xml/

Примеры XML-файлов.

С++

Пример модуля расположен по адресу https://github.com/ISPsystemLLC/interkassa. Модуль использует заголовочные файлы COREmanager и Clouden, и основан на примерах сборки собственных компонентов, описанных в статьях Сборка собственных компонентов и Взаимодействие на низком уровне, плагины с++.

Также при написании модулей могут быть полезны материалы из раздела Разработчику документации Clouden.

Структура модуля

Модуль состоит из обязательных файлов:

  • pminterkassa.cpp — код основного исполняемого файла модуля платёжной системы;
  • xml/billmgr_mod_pminterkassa.xml — XML-описание модуля.

Также в модуль входят CGI-скрипты:

  • скрипт переадресации на оплату в процессинговый центр;
  • скрипт приёма оповещений о зачислении платежей.