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

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

В протоколе ОСМП/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
#Поддержка передачи типа поиска через префикс
mps.<mpsId>.protocol.ext=1
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.<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() );
	}

}
  • No labels