forum.bitel.ru http://forum.bitel.ru/ |
|
Модификация ответа сервера биллинга на запросы от ПС http://forum.bitel.ru/viewtopic.php?f=18&t=13538 |
Страница 1 из 1 |
Автор: | Cobra57 [ 03 фев 2020, 16:49 ] | ||
Заголовок сообщения: | Модификация ответа сервера биллинга на запросы от ПС | ||
В документации пишется о возможности: Модификация ответа сервера биллинга на запросы от ПС Даже приведен пример. Только у меня компилятор постоянно ошибку выдает... Что не так делаю то? Может его не в динамический код? Тогда куда добавить что значит: в скрипте при обработке события MPSBeforeRequestEvent? Информация о версии: Клиент: 7.2.273 / 30.01.2020 20:20:42 os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_51 Сервер: 7.2.1139 / 30.01.2020 20:23:07 os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_111 bill: 7.2.347 / 30.01.2020 20:23:29 card: 7.2.207 / 23.01.2020 03:53:42 inet: 7.2.682 / 30.01.2020 01:41:57 mps: 7.2.192 / 30.01.2020 20:23:47 npay: 7.2.179 / 10.11.2019 00:53:36 reports: 7.2.221 / 21.01.2020 03:37:43 robokassa: 7.2.25 / 22.01.2020 21:09:21 rscm: 7.2.170 / 30.01.2020 01:42:01 ru.bitel.bgbilling.plugins.dispatch: 7.2.48 / 23.01.2020 03:54:10 Окружение: Клиент: os: Windows 7 amd64, 6.1 java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_51 jre home: C:\Program Files\Java\jre1.8.0_51 memory (use/total/max): 37M/212M/455M default tz: 03.02.2020 13:43 MSK +0300 (Europe/Moscow) user tz: 03.02.2020 13:43 MSK +0300 (Europe/Moscow) locale: ru_RU Сервер: os: Linux amd64, 4.9.0-8-amd64 java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_111 jre home: /opt/java/jdk1.8.0_111/jre default tz: 03.02.2020 13:43 MSK +0300 (Europe/Moscow) memory (use/total/max): 207M/791M/1820M db time: master: 03.02.2020 13:43 MSK db charset: connection: utf8(utf8_unicode_ci), database: utf8(utf8_unicode_ci) locale: ru_RU uptime: Started: 01.02.2020 21:49:12 Uptime: 1 d 15:53:55
|
Автор: | dimOn [ 03 фев 2020, 17:34 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
эвенты разные в тайпинге генерика и в перегруженном методе onEvent |
Автор: | Cobra57 [ 03 фев 2020, 21:08 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Все получилось. В доке ошибка, или опечатка... это факт. На всякий случай поделюсь опытом. Самая путевая инструкция здесь. Допишу только самое главное, последовательность, что и где
mps.1.protocol.ext=osmpField 2. Автоматизация->Сервис->Управление динамическим кодом пишем обработчик: 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; //код параметра договора Адрес private static final int ADR_PID = 2; @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( "fio:" + cpm.getStringParam( contract.getId(), FIO_PID ) + ";" ); sb.append( "address:" + cpm.getStringParam( contract.getId(), ADR_PID ) + ";" ); sb.append( "ballance:" + Utils.formatBigDecimalSumm( saldo ) + ";" ); event.getParameters().put( "fields", sb.toString() ); } } Сохраняем и компилируем. 3. Заходим в Сервис->Автоматизация->Глобальные функции поведения. На закладке Классы Java, добавляем в обработчик "Перед обработкой запроса ОСМП" Класс обработчика: наш OSMPRequestHandler. И сохряняем. Алле ОП! Все просто... все работает... |
Автор: | dimOn [ 04 фев 2020, 00:41 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
в доке копипастом видимо копировали и недосмотрели |
Автор: | Phricker [ 04 фев 2020, 01:12 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Код: 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); и получаем фигу для договоров у которых не было движений по балансу в текущем месяце. |
Автор: | Cobra57 [ 04 фев 2020, 11:29 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Цитата: Код: 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); и получаем фигу для договоров у которых не было движений по балансу в текущем месяце. Совершенно верно. Поэтому упростим скрипт, усложним запрос, и опять - Улле -ОП! import java.math.BigDecimal; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; 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; //код параметра договора Адрес private static final int ADR_PID = 2; @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 ); //исходящий остаток абонента 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); String query = "select summa1 + summa2 - summa3 - summa4 as saldo from contract_balance CB where CB.cid=" + contract.getId() + " and CB.yy=(select max(yy) from contract_balance where cid=CB.cid) and CB.mm=(select max(mm) from contract_balance where cid=CB.cid and yy=CB.yy)"; 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( "fio:" + cpm.getStringParam( contract.getId(), FIO_PID ) + ";" ); sb.append( "address:" + cpm.getStringParam( contract.getId(), ADR_PID ) + ";" ); sb.append( "ballance:" + Utils.formatBigDecimalSumm( saldo ) + ";" ); event.getParameters().put( "fields", sb.toString() ); } } |
Автор: | Phricker [ 04 фев 2020, 12:26 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Использовать deprecated эвенты может быть себе дороже. Так лучше на мой взгляд Код: import org.apache.log4j.Logger;
import ru.bitel.bgbilling.kernel.container.managed.ServerContext; import ru.bitel.bgbilling.kernel.contract.api.common.bean.Contract; import ru.bitel.bgbilling.kernel.contract.api.common.service.ContractService; import ru.bitel.bgbilling.kernel.contract.balance.common.BalanceService; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.modules.mps.server.events.MPSBeforeRequestEvent; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; import java.math.BigDecimal; import java.sql.Connection; import java.util.Calendar; public class OSMPRequestHandler extends EventScriptBase<MPSBeforeRequestEvent> { private final static Logger logger = Logger.getLogger(OSMPRequestHandler.class); @Override public void onEvent(MPSBeforeRequestEvent event, Setup setup, ConnectionSet connectionSet) throws Exception { Calendar now = Calendar.getInstance(); ServerContext serverContext = ServerContext.get(); ContractService contractService = serverContext.getService(ContractService.class, 0); BalanceService balanceService = serverContext.getService(BalanceService.class, 0); Contract contract = contractService.contractGet(event.getContractId()); BigDecimal balance = balanceService.contractBalanceGet(contract.getId(), now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1).toBalance(); StringBuilder sb = new StringBuilder(); sb.append("fio:" + contractService.contractParameterGet(contract.getId(), FIO_PID) == null ? "" : contractService.contractParameterGet(contract.getId(), FIO_PID).toString() + ";"); sb.append("address:" + contractService.contractParameterGet(contract.getId(), ADR_PID) == null ? "" : contractService.contractParameterGet(contract.getId(), ADR_PID).toString() + ";"); sb.append("ballance:" + Utils.formatBigDecimalSumm(balance) + ";"); event.getParameters().put("fields", sb.toString()); } } |
Автор: | Cobra57 [ 04 фев 2020, 16:02 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Да, отлично. Проверил тоже работает. Хорошая реализация Код: import org.apache.log4j.Logger;
import ru.bitel.bgbilling.kernel.container.managed.ServerContext; import ru.bitel.bgbilling.kernel.contract.api.common.bean.Contract; import ru.bitel.bgbilling.kernel.contract.api.common.service.ContractService; import ru.bitel.bgbilling.kernel.contract.balance.common.BalanceService; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.modules.mps.server.events.MPSBeforeRequestEvent; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; import ru.bitel.common.Utils; import java.math.BigDecimal; import java.sql.Connection; import java.util.Calendar; public class OSMPRequestHandler2 extends EventScriptBase<MPSBeforeRequestEvent> { //код параметра договора ФИО private static final int FIO_PID = 1; //код параметра договора Адрес private static final int ADR_PID = 2; private final static Logger logger = Logger.getLogger(OSMPRequestHandler.class); @Override public void onEvent(MPSBeforeRequestEvent event, Setup setup, ConnectionSet connectionSet) throws Exception { Calendar now = Calendar.getInstance(); ServerContext serverContext = ServerContext.get(); ContractService contractService = serverContext.getService(ContractService.class, 0); BalanceService balanceService = serverContext.getService(BalanceService.class, 0); Contract contract = contractService.contractGet(event.getContractId()); BigDecimal balance = balanceService.contractBalanceGet(contract.getId(), now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1).toBalance(); StringBuilder sb = new StringBuilder(); sb.append("fio:" + contractService.contractParameterGet(contract.getId(), FIO_PID) == null ? "" : contractService.contractParameterGet(contract.getId(), FIO_PID).toString() + ";"); sb.append("address:" + contractService.contractParameterGet(contract.getId(), ADR_PID) == null ? "" : contractService.contractParameterGet(contract.getId(), ADR_PID).toString() + ";"); sb.append("ballance:" + Utils.formatBigDecimalSumm(balance) + ";"); event.getParameters().put("fields", sb.toString()); } } |
Автор: | skn [ 04 фев 2020, 16:56 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
есть событие MPSBeforeResponseEvent оно тут уместнее было бы из него доступен MPSResponse а в нем есть Contract... |
Автор: | Phricker [ 04 фев 2020, 19:17 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Тоже как вариант. Не пользуюсь и брал из доки по MPS событие. |
Автор: | darkringfire [ 08 апр 2020, 11:58 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Здравствуйте. Подключаю MPS к Сбербанку, протокол sbrf. при использовании в конфигурации Код: mps.2.protocol=sbrf mps.2.param.keys=sum,fio,address mps.2.sum=300.00 mps.2.fio=2 mps.2.address=3 в ответ добавляются теги Код: <FIO>Тестовый клиент</FIO> <ADDRESS>Адрес подключения тестового клиента</ADDRESS> <SUM>300</SUM> в документации написано, что <SUM> можно менять программно в обработчике события, но при использовании протокола sbrf не вызываются события MPSBeforeRequestEvent и MPSBeforeResponseEvent (в протоколе osmp вызывается только MPSBeforeResponseEvent) каким образом можно поменять значение рекомендуемой суммы в протоколе sbrf? версии: Информация о версии: Клиент: 8.0.306 / 27.03.2020 18:25:19 os: Windows 10; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_231 Сервер: 8.0.1175 / 27.03.2020 18:25:19 os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_152 bill: 8.0.361 / 27.03.2020 18:25:19 card: 8.0.209 / 13.02.2020 22:31:25 inet: 8.0.700 / 27.03.2020 18:25:20 mps: 8.0.195 / 25.02.2020 01:05:17 npay: 8.0.182 / 10.03.2020 18:04:19 reports: 8.0.231 / 18.03.2020 03:31:42 rscm: 8.0.173 / 04.03.2020 20:24:51 sberbank: 8.0.52 / 12.02.2020 18:00:19 yamoney: 8.0.67 / 24.03.2020 13:32:31 Окружение: Клиент: os: Windows 10 amd64, 10.0 java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_231 jre home: C:\Program Files\Java\jre1.8.0_231 memory (use/total/max): 87M/235M/1820M default tz: 08.04.2020 13:54 IRKT +0800 (Asia/Irkutsk) user tz: 08.04.2020 13:54 IRKT +0800 (Asia/Irkutsk) locale: en_US Сервер: os: Linux amd64, 3.10.0-693.11.6.el7.x86_64 java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_152 jre home: /usr/java/jdk1.8.0_152/jre default tz: 08.04.2020 13:53 IRKT +0800 (Asia/Irkutsk) memory (use/total/max): 238M/491M/491M db time: master: 08.04.2020 13:53 +08 db charset: connection: utf8(utf8_general_ci), database: utf8(utf8_unicode_ci) ВНИМАНИЕ: кодировки в коннекшене к БД не соответствуют кодировкам БД locale: en_US uptime: Started: 02.04.2020 10:45:07 Uptime: 6 d 03:08:27 |
Автор: | Phricker [ 09 апр 2020, 00:20 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Код: db charset: connection: utf8(utf8_general_ci), database: utf8(utf8_unicode_ci) ВНИМАНИЕ: кодировки в коннекшене к БД не соответствуют кодировкам БД Плохо же вот это вот. Мой вам совет исправить пока не поздно. В протоколе sbrf надо привязываться к MPSSbrfSumEvent Оно в Сервис - Автоматизация - Функции глобальных событий |
Автор: | darkringfire [ 10 апр 2020, 12:10 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
Phricker писал(а): В протоколе sbrf надо привязываться к MPSSbrfSumEvent Спасибо, событие работает, но я не могу понять как получить в нём договор, чтобы вытащить из него месячную абонплату и подставить её в ответ |
Автор: | dimOn [ 10 апр 2020, 15:38 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
.getContractId() же |
Автор: | darkringfire [ 11 апр 2020, 06:21 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
dimOn писал(а): .getContractId() же Метод возвращает 0 или -1, сейчас не могу точно посмотреть. Но не актуальный договор |
Автор: | dimOn [ 11 апр 2020, 16:28 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
туда действительно не передаётся актуальный cid, может недоступен в том контексте, надо смотреть, пишите в HD |
Автор: | skn [ 12 апр 2020, 05:42 ] |
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС |
а с чего вы решили что в sbrf не события MPSBeforeResponseEvent? |
Автор: | darkringfire [ 13 апр 2020, 09:49 ] | ||
Заголовок сообщения: | Re: Модификация ответа сервера биллинга на запросы от ПС | ||
skn писал(а): а с чего вы решили что в sbrf не события MPSBeforeResponseEvent? эмпирически. есть класс Код: public class MPSBeforeResponseScript extends EventScriptBase<MPSBeforeResponseEvent> { protected static final Logger log = Logger.getLogger( MPSBeforeResponseEvent.class ); @Override public void onEvent( MPSBeforeResponseEvent event, Setup setup, ConnectionSet set ) throws Exception { log.info("~~~~~~~~~~~~~~~~~~~ Resp! ~~~~~~~~~~~~~~~~~~~~~~~"); } } есть привязка к событию скриншот во вложении при использовании протокола osmp в логах вижу сообщение, при использовании sbrf - нет
|
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |