Создайте нередактируемые не редактируемые типы платежей для систем платежей. id типов платежей можно узнать также в справочнике, выделив нужный тип платежа и нажав Ctrl+i. id нужно будет указать в конфигурации.
Проинсталируйте модуль на сервер, обновите клиент биллинга. Затем создайте экземпляр модуля. Cоздайте Создайте в редакторе конфигурации модуля новую конфигурацию по нижеприведённому примеру и сделайте ее активной.
Для всех систем платежей рекомендуется использовать только https-порт.
Здесь и далее "псПС" - платёжная система.
Возможные параметры конфигурации модуля:
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
# параметр задает список конфигураций ПС, если не указан, то по умолчанию mps.ids=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 mps.ids=<mpsId_1>[,<mpsId_2>][,<mpsId_3>]...[,<mpsId_N>] # Системы платежей добавляются как mps.<mpsId>.параметры, где <mpsId> - порядковыйуникальный номер ключ в пределах данной конфигурации # Вкл/выкл - 1/0 - принимать или нет платежи для этой псПС mps.<mpsId>.mode=1 # Название mps.<mpsId>.title=CyberPlat # Используемый протокол для общения псПС с биллингом mps.<mpsId>.protocol=cp # Логин/пароль пс. Должен различаться для различных систем mps.<mpsId>.login= mps.<mpsId>.passw= # id типа платежа, с которым добавляется платёж в договор, при проведении с этой псПС mps.<mpsId>.pid= # # Комментарий, возвращающийся в ответе на проверку статуса/проведение платежа # (если в протоколе есть комментарий ответа) #mps.comment=$CONTRACT ($COMMENT) # # Сертификаты # Проверять клиентский сертификат (рекомендуется, если позволяет протокол псПС) mps.<mpsId>.cert=1 # Клиентский сертификат (открытый ключ) # (для протокола eport открытый ключ указывается здесь же, а mps.1.cert=0) # возможно указать через modulus и exponent: #mps.<mpsId>.cert.mod= #mps.<mpsId>.cert.exp= # или в encoded(байты в 16-ричном представлении) #mps.<mpsId>.cert.encoded= # или в pem (base64), без header/footer (-----*** PUBLIC KEY-----) и переносов строк mps.<mpsId>.cert.pem= # кодировка параметров входящих запросов, например utf-8, cp1251 #mps.<mpsId>.request.encoding= # Поиск договора для проведения платежа. # В некоторых системах возможны типы поиска - дополнительное поле. # Если их больше 1, то с дополнительным индексом. Если он отсутствует, используется тип поиска 0, # т.е. используются параметры поиска из mps.1.search.xxx (для mps.1.search.mode). # Если присутствует то, например, параметры поиска будут из mps.1.search.1.xxx (для mps.1.search.1.mode) # Обратите внимание, что если если задано без индекса (...search.mode=), то и остальные параметры должны # соответствовать (...search.pattern=) и для остальных индексов аналогично. # # Поддержка передачи типа поиска через префикс # (т.е. если ищется договор x0000 c типом поиска 1, то в поле account протокола osmp передаётся 1_x0000) #mps.<mpsId>.protocol.ext=osmpPrefix # Отключение Base-аутентификации #mps.<mpsId>.protocol.ext=noBaseAuth # Если используется несколько расширений, их нужно прописать через запятую: #mps.<mpsId>.protocol.ext=noBaseAuth, osmpPrefix # # Тип поиска (mps_login|contract|login|voice|email|phone|parameter|inet_login|custom) mps.<mpsId>.search.mode= # Код модуля для поиска (необходим для типов поиска login, phone) #mps.<mpsId>.search.mid= # Включение "множественного поиска", то есть проверка всего списка regex # при влючении этого режима возможно задание нескольких условий поиска в формате #mps.1<mpsId>.search.multi=1 #mps.<mpsId>.search.1.mode=contract #mps.<mpsId>.search.1.pattern=afsdfaf #mps.<mpsId>.search.2.mode=parameter #mps.<mpsId>.search.2.pid=4 #mps.<mpsId>.search.3.mode=phone #mps.<mpsId>.search.3.mid=5 # Шаблон преобразования - pattern:::result, если пришедшее значение подходит под regexp, то # оно преобразуется перед поиском, если нет - остаётся без изменений, по умолчанию - без изменений. # Например, \A((?:\d{5})|(?:\d{6})|(?:\d{7}))(\d{2})\z:::NK$1-$2 # если пришедший номер для поиска представляет собой 12345608, то он будет преобразован в NK123456-08, # и уже по нему будет произведён поиск договора #mps.<mpsId>.search.pattern= # пользовательский класс реализующий поиск, должен реализовывать интерфейс ru.bitel.bgbilling.modules.mps.server.bean.FindContract #mps.<mpsId>.search.custom= # regexp названий договоров, для которых возможен поиск. Если название договора не совпадает с regexp, # то он не будет найден для системы платежей для этого типа поиска #mps.<mpsId>.search.allow.contract.regexp=NK-.* # Группы договоров, для которых возможен поиск для этого типа поиска #mps.<mpsId>.search.allow.contract.groups=4,2,5,3 # # Ограничения на пополняемую сумму # минимальная. По умолчанию - 0. mps.<mpsId>.min.summ= # максимальная. По умолчанию - 1000000 mps.<mpsId>.max.summ= # # Разница во времени в минутах между сервером биллинга и системой платежей (например система работает по московскому времени, биллинг # по уфимскому +2 часа - 180) #mps.<mpsId>.timeoffset= # промежуток времени между временем платежа и реальным временем, с поправкой на timeoffset. # если задано и промежуток оказался больше то платёж не пройдёт #mps.<mpsId>.paytime= # # Параметры логина mps (может использоваться для поиска договора при проведении платежа) # Формат вывода значения числового логина mps (на web-статистике) #mps.mps_login.format= # regexp проверки введённого значения #mps.mps_login.regexp= # Ошибка, выводимая в web-статистике при несовпадении введённого логина mps с regexp #mps.mps_login.regexp.error= # #mps.<mpsId>.request.encoding=utf-8 #mps.<mpsId>.response.encoding=utf-8 |
В поле mps.1.protocol.ext можно указать расширения, если их несколько - через запятую:
...
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)):
...
- 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 );
}
}
}
} |