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 7 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
# Поддержка передачи типа поиска через префикс
# дополнительно можно указать 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 );
    }
}
  • No labels