ОСМП/Qiwi, Empay, Pegas, Rapida, Comepay
В протоколе ОСМП/Qiwi (Empay, Pegas, Rapida, Comepay) по умолчанию отсутствует параметр типа поиска, которым можно было бы разделить разные типы платежей. Однако его можно передавать в запросе дополнительным полем pay_type или же вложить префиксом в поле account, например 1_x0000, где
1 - это тип поиска, x0000 - это значение, по которому происходит поиск.
Параметр mps.x.numberPattern - регулярное выражение, которому должно удовлетворять значение поля account, иначе модуль возвращает ошибку 4 (не соответствие формата идентификатора абонента).
Аутентификация происходит по логину/паролю через BASE-AUTH протокола http и, если указана, по клиентскому сертификату, переданному при взаимодействии через протокол https.
В зависимости от типа протокола, необходимо указать соответствующий в конфигурации:
#ОСМПmps.<mpsId>.protocol=osmp#Empaymps.<mpsId>.protocol=empay#Pegasmps.<mpsId>.protocol=pegas#Rapidamps.<mpsId>.protocol=rapida#Comepaymps.<mpsId>.protocol=comepayПример конфигурации:
mps.<mpsId>.mode=1mps.<mpsId>.title=ОСМПmps.<mpsId>.protocol=osmp# Поддержка передачи типа поиска через префикс# дополнительно можно указать osmpFields noBaseAuth osmpSubBalance (черз пробел или запятую)mps.<mpsId>.protocol.ext=osmpPrefixmps.<mpsId>.login=mps.<mpsId>.passw=mps.<mpsId>.pid=#Тип поиска 0 (по умолчанию)mps.<mpsId>.search.mode=contract#Тип поиска 1 (1_12345608)mps.<mpsId>.search.1.mode=contract #Шаблон преобразования перед поиском - pattern:::resultmps.1.search.1.pattern=\A((?:\d{5})|(?:\d{6})|(?:\d{7}))(\d{2})\z:::NK$1-$2#Будут находиться только договора входящие в группу с id=12mps.1.search.1.allow.contract.groups=12#Регулярное выражение проверки значения поля accountmps.1.numberPattern=\A\d{7,9}\z#mps.1.cert=1mps.1.cert.pem=3bab58c...# Ограничения на пополняемую сумму# минимальная. По умолчанию - 0.mps.1.min.summ=0# максимальная. По умолчанию - 1000000mps.1.max.summ=15000#Если в системе имеется обработчик события "Перед занесением платежа",#который изменяет входящую сумму платежа (например, переводит в валюту#по курсу), то данный флаг позволяет заносить измененный платеж в таблицу#баланса договора, а оригинальную сумму платежа заносить в таблицу платежей#модуля mps.mps.1.store.original.sum=trueВ опции mps.<mpsId>.protocol.ext= можно указать расширение протокола osmpFields. Это расширение протокола позволяет добавить в ответ платежной системе (на любом этапе платежа: check, pay) специальный тег <fields> (см. документацию), в который с помощью динамического класса, реализующего обработчик глобального события "Перед обработкой запроса ОСМП", можно добавить произвольные параметры, которые будут отображены на экране, распечатаны на чеке, сохранены в ПС.
Пример обработчика события, который отображает фио на экране, распечатывает на чеке, показывает сумму долга и сумму для оплаты.
import java.math.BigDecimal;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import java.util.Calendar;import bitel.billing.server.contract.bean.Contract;import bitel.billing.server.contract.bean.ContractManager;import bitel.billing.server.contract.bean.ContractParameterManager;import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;import ru.bitel.bgbilling.modules.mps.server.events.MPSOSMPRequestEvent;import ru.bitel.bgbilling.server.util.Setup;import ru.bitel.common.Utils;import ru.bitel.common.sql.ConnectionSet;public class OSMPRequestHandlerextends EventScriptBase<MPSOSMPRequestEvent>{ //код параметра договора ФИО private static final int FIO_PID = 1; @Override public void onEvent( MPSOSMPRequestEvent event, Setup setup, ConnectionSet set ) throws Exception { String contractTitle = event.getRequest().getNumber(); Connection con = set.getConnection(); ContractParameterManager cpm = new ContractParameterManager( con ); ContractManager cm = new ContractManager( con ); //исходящий остаток абонента Calendar c = Calendar.getInstance(); Contract contract = cm.getContractByTitle( contractTitle ); BigDecimal saldo = BigDecimal.ZERO; String query = "select summa1 + summa2 - summa3 - summa4 as saldo from contract_balance where cid=" + contract.getId() + " and yy=" + c.get( Calendar.YEAR ) + " and mm=" + (c.get( Calendar.MONTH ) + 1); try(Statement st = con.createStatement();ResultSet rs = st.executeQuery( query )) { if(rs.next()) { saldo = rs.getBigDecimal( "saldo" ); } } //Формат строки name1:type1:value1;name2:type2:value2;...;nameN:typeN:valueN //тип можно не указывать, если предполагается, что поле должно отображаться на //экране терминала (т.е. тип disp), тогда формат name:value. Разделитель полей - ";", разделитель //компонентов поля - ":" StringBuilder sb = new StringBuilder(); sb.append( "sum_dolg:" + Utils.formatBigDecimalSumm( saldo ) + ";" ); sb.append( "oplata:" + Utils.formatBigDecimalSumm( saldo ) + ";" ); sb.append( "fio:" + cpm.getStringParam( contract.getId(), FIO_PID ) + ";" ); sb.append( "fio:ptr-data:" + cpm.getStringParam( contract.getId(), FIO_PID ) ); event.getParameters().put( "fields", sb.toString() ); }}В некоторых случаях бывает полезно изменить сумму платежа, которая заносится в БД. Например, в ситуации, когда баланс абонента ведется в некоторой валюте, а платежная система присылает сумму в местной валюте. Для такого варианта предусмотрено событие "Перед добавлением платежа", в обработчик которого передается сумма платежа в виде 123.45. Обработчик может установить свою сумму и вернуть ее в модуль. Событие называется ru.bitel.bgbilling.modules.mps.server.events.MPSBeforePaymentEvent и настраивается на вкладке Сервис->Автоматизация->Функции глобальных событий. Сумму платежа, пришедшую от платежной системы, можно получить с помощью метода getPaymetSum(), которая возвращает java.util.BigDecimal. Установить измененную сумму можно с помощью метода setPaymentSum(BigDecimal newSum).
Пример обработчика события:
package ru.bitel.bgbilling.modules.mps;import java.math.BigDecimal;import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;import ru.bitel.bgbilling.modules.mps.server.events.MPSBeforePaymentEvent;import ru.bitel.bgbilling.server.util.Setup;import ru.bitel.common.sql.ConnectionSet;public class ModifyPaymentSumm extends EventScriptBase<MPSBeforePaymentEvent>{ @Override public void onEvent( MPSBeforePaymentEvent event1, Setup setup2, ConnectionSet connectionSet3 ) throws Exception { BigDecimal sum = event1.getPaymentSum(); sum = sum.multiply( new BigDecimal( 1.18 ) ); event1.setPaymentSum( sum ); }}