ОСМП/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
#Empay
mps.<mpsId>.protocol=empay
#Pegas
mps.<mpsId>.protocol=pegas
#Rapida
mps.<mpsId>.protocol=rapida
#Comepay
mps.<mpsId>.protocol=comepay
Пример конфигурации:
mps.<mpsId>.mode=
1
mps.<mpsId>.title=ОСМП
mps.<mpsId>.protocol=osmp
# Поддержка передачи типа поиска через префикс
# дополнительно можно указать osmpFields noBaseAuth osmpSubBalance (черз пробел или запятую)
mps.<mpsId>.protocol.ext=osmpPrefix
mps.<mpsId>.login=
mps.<mpsId>.passw=
mps.<mpsId>.pid=
#Тип поиска
0
(по умолчанию)
mps.<mpsId>.search.mode=contract
#Тип поиска
1
(1_12345608)
mps.<mpsId>.search.
1
.mode=contract
#Шаблон преобразования перед поиском - pattern:::result
mps.
1
.search.
1
.pattern=\A((?:\d{
5
})|(?:\d{
6
})|(?:\d{
7
}))(\d{
2
})\z:::NK$
1
-$
2
#Будут находиться только договора входящие в группу с id=
12
mps.
1
.search.
1
.allow.contract.groups=
12
#Регулярное выражение проверки значения поля account
mps.
1
.numberPattern=\A\d{
7
,
9
}\z
#
mps.
1
.cert=
1
mps.
1
.cert.pem=3bab58c...
# Ограничения на пополняемую сумму
# минимальная. По умолчанию -
0
.
mps.
1
.min.summ=
0
# максимальная. По умолчанию -
1000000
mps.
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
OSMPRequestHandler
extends
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 );
}
}