Page tree
Skip to end of metadata
Go to start of metadata

Создайте не редактируемые типы платежей для систем платежей. id типов платежей можно узнать также в справочнике. id нужно будет указать в конфигурации.

Проинсталируйте модуль на сервер. Затем создайте экземпляр модуля. Создайте в редакторе конфигурации модуля новую конфигурацию по нижеприведённому примеру и сделайте ее активной.

Для всех систем платежей рекомендуется использовать только 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.<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 можно указать расширения, если их несколько - через запятую:

osmpPrefix - означает, что тип поиска может быть передан как префикс в поле account. Расширение работает для протоколов ОСМП, Empay, Pegas, Rapida, Comepay.

noBaseAuth - означает, что в запросе не проверяется Base-аутентификация, т.е. параметры конфига mps.1.login и mps.1.passw не нужны.

payOnCheck - означает, что платеж проводится сразу при запросе на проверку.

addBalanceInfo - в ответ добавляется текущий баланс в поле account_balance (ОСМП, Empay, Pegas, Rapida, Comepay).

URL для систем платежей формируется из шаблона https://сервер/контекст/mpsexecuter/<mid>/<mpsid>, где <mid> - id модуля, <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 );
    	    }
	    }
	}
}
  • No labels