Создайте не редактируемые типы платежей для систем платежей. id типов платежей можно узнать также в справочнике. id нужно будет указать в конфигурации.
Проинсталируйте модуль на сервер. Затем создайте экземпляр модуля. Создайте в редакторе конфигурации модуля новую конфигурацию по нижеприведённому примеру и сделайте ее активной.
Для всех систем платежей рекомендуется использовать только https-порт.
Здесь и далее "ПС" - платёжная система.
Возможные параметры конфигурации модуля:
В поле mps.1.protocol.ext можно указать расширения, если их несколько - через запятую:
osmpPrefix - означает, что тип поиска может быть передан как префикс в поле account. Расширение работает для протоколов ОСМП, Empay, Pegas, Rapida, Comepay.
noBaseAuth - означает, что в запросе не проверяется Base-аутентификация, т.е. параметры конфига mps.1.login и mps.1.passw не нужны.
payOnCheck - означает, что платеж проводится сразу при запросе на проверку.
addBalanceInfo - в ответ добавляется текущий баланс в поле account_balance (ОСМП, Empay, Pegas, Rapida, Comepay).
URL для платежных систем формируется из шаблона https://хост[:port]/контекст/mpsexecuter/<mid>/<mpsid>,
где контекст - по умолчанию bgbilling, <mid> - id модуля MPS, <mpsid> - код системы платежей, т.е. для вышеописанной конфигурации у CyberPlat mpsid=1.
Например, https://server:8443/bgbilling/mpsexecuter/10/1
Типы поиска :
- login - поиск по логину модулей DialUp или Voip (необходимо указать id модуля (mid)):
mps.1.search.mode=login
mps.1.search.mid=3
- contract - поиск по названию договора (например NK-0012; Здесь можно указать шаблон преобразования):
mps.1.search.mode=contract
mps.1.search.pattern=NK-$NUMBER - для поиска клиенту нужно будет ввести только 0012
или
mps.1.search.pattern=\A((?:\d\d\d\d\d\d)|(?:\d\d\d\d\d\d\d)|(?:\d\d\d\d\d))(\d\d)\z:::КФ$1-$2
(в последнем случае, если пришли 7, 8 или 9 цифр преобразовываем их к виду КФ$1-$2, т.е значения КФ12345-12 и 12345612 будут эквивалентны)
- phone - поиск по номеру телефона модуля phone (необходимо указать id модуля (mid));
- parameter - поиск по параметру договора (необходимо указать код типа параметра (pid)):
mps.1.search.mode=parameter
mps.1.search.pid=9
- mps_login - логин модуля MPS. Его выбирает себе клиент на странице статистики. Один для всех систем платежей.
- inet_login - логин модуля Inet (необходимо указать mid модуля Inet)
Для протоколов, не поддерживающих передачу типа поиска, реализована передача типа поиска через префикс x_идентификатор клиента (например, для ОСМП в поле account для поиска по search.1 логина 13 в запросе должно приходить: account=1_13). Для поддержки этого режима нужно установить mps.x.protocol.ext=1.
В комментарии ответа (если такой поддерживается протоколом) можно передать номер, комментарий, параметр и/или баланс договора
mps.1.comment=$contract_title ($contract_comment) [$contract_param(4)] $contract_balance
Модификация ответа сервера биллинга на запросы от ПС
Для некоторых протоколов возможно модификация ответа сервера, например добавить дополнительные теги.
Для пртокола OSMP есть возможность дополнять ответ на запрос, например тегом <recsum> с программным выставлением значения рекомендованной суммы платежа.
Цель:
<response> <result>0</result> <osmp_txn_id>122</osmp_txn_id> <comment>3#0034586 (Для платежей Телевидение)</comment> <account_balance>0</account_balance> <recsum>1000</recsum> </response>
это можно реализовать в скрипте при обработке события MPSBeforeRequestEvent
public class AddRecsum extends EventScriptBase<MPSBeforeRequestEvent> { @Override public void onEvent( MPSOSMPRequestEvent event, Setup setup, ConnectionSet set ) throws Exception { event.getResponse().getParameters().put( "recsum", 1000 ); // event.setProcessed( true ); } }
С версии 7.2+ доступно событие MPSBeforeResponseEvent (поддерживается не всеми протоколами, есть в osmp, cp, kaspi, quickpay)
public class MPSResponseScript extends EventScriptBase<MPSBeforeResponseEvent> { @Override public void onEvent( MPSBeforeResponseEvent mpsBeforeResponseEvent, Setup setup, ConnectionSet connectionSet ) throws Exception { Contract contract = mpsBeforeResponseEvent.getResponse().getContract(); if ( contract != null ) { MPSResponse response = mpsBeforeResponseEvent.getResponse(); try( ContractParameterManager contractParameterManager = new ContractParameterManager( connectionSet.getConnection() ); ) { ContractAddressParamValue contractAddressParamValue = contractParameterManager.getAddressParam( contract.getId(), PARAM_ADDRESS_ID ); if ( contractAddressParamValue != null ) { address = contractAddressParamValue.getAddress(); } } Map<String, String> responseParameters = new HashMap<>(); if ( address != null ) { responseParameters.put( "add", "address: " + address ); } if ( !responseParameters.isEmpty() ) { response.getParameters().put( MPSTransactionManager.KEY_RESPONSE_PARAMETERS, responseParameters ); } } } }