WiFi-портал с оплатой картой через assist
Материал из BiTel WiKi
Stark (Обсуждение | вклад) |
Stark (Обсуждение | вклад) |
||
(1 промежуточная версия не показана) | |||
Строка 11: | Строка 11: | ||
</source> | </source> | ||
- | 2. Добавить обработчик глобальных функций поведения на событие "WiFi" активация модуля Inet. Обработчик создает договор по конкретному шаблону договора, в котором указано, что нужно создавать сервис модуля inet определенного типа. В самом типе сервиса настроена автоматическая генерация логина/пароля. Так же в шаблоне указано время жизни договора ( имеет значение с точки зрения экономии лицензий, закрытый договор не потребляет лицензию). | + | 2. Добавить обработчик глобальных функций поведения на событие "WiFi" активация модуля Inet. Обработчик создает договор по конкретному шаблону договора, в котором указано, что нужно создавать сервис модуля inet определенного типа. В самом типе сервиса настроена автоматическая генерация логина/пароля. Так же в шаблоне указано время жизни договора ( имеет значение с точки зрения экономии лицензий, закрытый договор не потребляет лицензию). Далее обработчик перенаправляет абонента в личный кабинет, на страницу отправки в assist( как будто клиент уже ввел сумму в личном кабинете и нажал кнопку оплатить ). Для клиента все это выглядит так как будто он на портале ввел телефон и сумму, и его перекинуло на сайт assist. Так же скрипт передает &url_ok и &url_no, которые передаются в assist ( перетирают те, которые указаны в конфигурации assist). Это для того, чтобы после оплаты assist перекинул на портал с сообщением об успехе или неудаче. |
+ | |||
+ | |||
Вот сам класс обработчика : | Вот сам класс обработчика : | ||
Строка 158: | Строка 160: | ||
} | } | ||
} | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | 3. Добавить скрипт на событие приход платежа. Скрипт отправляет логин/пароль сервиса по смс. | ||
+ | |||
+ | <source lang="java"> | ||
+ | package ru.bitel.saha.script.contract; | ||
+ | |||
+ | import ru.bitel.bgbilling.kernel.event.Event; | ||
+ | import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; | ||
+ | import ru.bitel.bgbilling.server.util.Setup; | ||
+ | import ru.bitel.common.sql.ConnectionSet; | ||
+ | import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment; | ||
+ | import bitel.billing.server.contract.bean.ContractManager; | ||
+ | import bitel.billing.server.contract.bean.Contract; | ||
+ | import java.util.List; | ||
+ | import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ; | ||
+ | import ru.bitel.bgbilling.kernel.container.managed.ServerContext; | ||
+ | import ru.bitel.bgbilling.modules.inet.api.common.service.InetServService; | ||
+ | import ru.bitel.bgbilling.kernel.network.sms.Smsc; | ||
+ | import bitel.billing.server.contract.bean.ContractParameterManager; | ||
+ | import ru.bitel.common.Utils; | ||
+ | |||
+ | |||
+ | |||
+ | public class PaymentEvent | ||
+ | extends EventScriptBase | ||
+ | { | ||
+ | static final int ASSIST_PAYMENT_TYPE = 4; | ||
+ | private static final int INET_MODULE_ID = 1; | ||
+ | private static final String SMSC_LOGIN = ""; | ||
+ | private static final String SMSC_PASSWORD = ""; | ||
+ | private static final int PHONE_PARAM_ID = 5; | ||
+ | |||
+ | |||
+ | @Override | ||
+ | public void onEvent( Event event, Setup setup, ConnectionSet connectionSet ) | ||
+ | throws Exception | ||
+ | { | ||
+ | print( "payment" ); | ||
+ | |||
+ | |||
+ | ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent payEvent = (ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent) event; | ||
+ | Payment payment = payEvent.getPayment(); | ||
+ | if ( payment.getTypeId() == ASSIST_PAYMENT_TYPE ) | ||
+ | { | ||
+ | print( "assist payment" ); | ||
+ | |||
+ | } | ||
+ | ContractManager contractManager = new ContractManager( connectionSet.getConnection() ); | ||
+ | |||
+ | Contract contract = contractManager.getContractById( event.getContractId() ); | ||
+ | |||
+ | ServerContext context = ServerContext.get(); | ||
+ | InetServService wsServ = context.getService( InetServService.class, INET_MODULE_ID ); | ||
+ | |||
+ | List<InetServ> servList = wsServ.inetServList( contract.getId() ); | ||
+ | //Сервис с логином пароля настроен уже в шаблоне договора, его не надо создавать | ||
+ | if ( servList.size() == 0 ) | ||
+ | { | ||
+ | print( "сервиса нет на договоре" ); | ||
+ | //event.setError( "Ошибка, обратитесь к администратору" ); | ||
+ | return; | ||
+ | } | ||
+ | InetServ serv = servList.get( 0 ); | ||
+ | |||
+ | |||
+ | Smsc smsc = new Smsc( SMSC_LOGIN, SMSC_PASSWORD ); | ||
+ | |||
+ | String message = "WI-FI логин: " + serv.getLogin() + ", пароль: " + serv.getPassword(); | ||
+ | |||
+ | |||
+ | |||
+ | ContractParameterManager paramManager = new ContractParameterManager( connectionSet.getConnection()); | ||
+ | String phone = paramManager.getStringParam( contract.getId(), PHONE_PARAM_ID ); | ||
+ | if ( Utils.isEmptyString( phone ) ) | ||
+ | { | ||
+ | print( "телефон на задан на договоре" ); | ||
+ | } | ||
+ | |||
+ | if ((phone.length() == 10 && phone.charAt(0) == '9')) | ||
+ | { | ||
+ | phone = "7" + phone; | ||
+ | } | ||
+ | |||
+ | if ((phone.length() == 11 && phone.charAt(0) == '8')) | ||
+ | { | ||
+ | phone = "7" + phone.substring(1); | ||
+ | } | ||
+ | |||
+ | if ((phone.charAt(0) == '+' && phone.charAt(1) == '7' && phone.charAt(2) == '9')||(phone.charAt(0) == '7'&& phone.charAt(1) == '9')) | ||
+ | { | ||
+ | String[] results = smsc.send_sms( phone, message, 0, "", "", 0, "", "" ); | ||
+ | for( int i = 0; i < results.length; i++ ) | ||
+ | { | ||
+ | print( "result " + i + " = " + results[i] ); | ||
+ | } | ||
+ | |||
+ | if ( results.length == 4 ) | ||
+ | { | ||
+ | print( "id = " + results[0] ); | ||
+ | print( "sms count = " + results[1] ); | ||
+ | print( "cost = " + results[2] ); | ||
+ | print( "balance = " + results[3] ); | ||
+ | |||
+ | } | ||
+ | else if ( results.length == 2 ) | ||
+ | { | ||
+ | print( "Ошибка при отправке смс" ); | ||
+ | print( "id = " + results[0] ); | ||
+ | print( "error code = " + results[1] ); | ||
+ | } | ||
+ | } | ||
+ | } | ||
} | } | ||
</source> | </source> |
Текущая версия на 05:31, 21 марта 2017
1. В конфигурации портала ставим
portal.activate=1 portal.activate.parameter.1.type=text portal.activate.parameter.1.name=phone portal.activate.parameter.1.title=телефон portal.activate.parameter.2.type=text portal.activate.parameter.2.name=sum portal.activate.parameter.2.title=сумма
2. Добавить обработчик глобальных функций поведения на событие "WiFi" активация модуля Inet. Обработчик создает договор по конкретному шаблону договора, в котором указано, что нужно создавать сервис модуля inet определенного типа. В самом типе сервиса настроена автоматическая генерация логина/пароля. Так же в шаблоне указано время жизни договора ( имеет значение с точки зрения экономии лицензий, закрытый договор не потребляет лицензию). Далее обработчик перенаправляет абонента в личный кабинет, на страницу отправки в assist( как будто клиент уже ввел сумму в личном кабинете и нажал кнопку оплатить ). Для клиента все это выглядит так как будто он на портале ввел телефон и сумму, и его перекинуло на сайт assist. Так же скрипт передает &url_ok и &url_no, которые передаются в assist ( перетирают те, которые указаны в конфигурации assist). Это для того, чтобы после оплаты assist перекинул на портал с сообщением об успехе или неудаче.
Вот сам класс обработчика :
package ru.bitel.saha.script.wifi; import ru.bitel.bgbilling.kernel.event.Event; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; import ru.bitel.bgbilling.kernel.wifi.common.event.WiFiActivateEvent; import ru.bitel.bgbilling.common.BGException; import bitel.billing.server.contract.bean.ContractManager; import bitel.billing.server.contract.bean.Contract; import java.util.Date; import java.util.Calendar; import org.apache.log4j.Logger; import ru.bitel.bgbilling.kernel.container.managed.ServerContext; import ru.bitel.bgbilling.modules.inet.api.common.service.InetServService; import java.util.List; import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ; import bitel.billing.server.contract.bean.ContractParameterManager; import java.sql.PreparedStatement; import bitel.billing.common.TimeUtils; import java.sql.ResultSet; import ru.bitel.bgbilling.kernel.event.events.ContractParamChangedEvent; import bitel.billing.server.contract.bean.CommentPatternManager; import ru.bitel.bgbilling.kernel.network.sms.Smsc; import ru.bitel.common.Utils; import java.math.BigDecimal; import bitel.billing.server.util.PswdGen; import ru.bitel.bgbilling.server.util.Setup; import java.net.URLEncoder; public class Activation extends EventScriptBase<WiFiActivateEvent> { static final Logger logger = Logger.getLogger( Activation.class ); private static final int CONTRACT_PATTERN_GOROD_ID = 6; private static final int INET_MODULE_ID = 1; private static final int PHONE_PARAM_ID = 5; //private static final int FIO_PARAM_ID = 4; private static final Object mutexGorod = new Object(); // private static String STAT_PATH = "http://host/bgbilling/webexecuter"; private static String PORTAL_PATH = "http://host:9090/auth/activate.do?"; private static String MESSAGE_SUCCESS = "Ваша оплата прошла успешно"; private static String MESSAGE_FAIL = "Возникли проблемы при оплате"; @Override public void onEvent( WiFiActivateEvent event, Setup setup, ConnectionSet connectionSet ) throws Exception { String phone = event.getParams().get( "phone" ); print( "phone=" + phone ); if ( phone == null || phone.trim().length() != 10 ) { event.setError( "Вы должны ввести 10-чный номер" ); return; } phone = "+7" + phone.trim(); activateGorod( event, connectionSet, phone/*, fio */); } private void activateGorod( WiFiActivateEvent event, ConnectionSet connectionSet, String phone/*, String fio */) { synchronized (mutexGorod ) { try { print( "WiFi Activation Gorod" ); String sumStr = event.getParams().get( "sum" ); BigDecimal sum = Utils.parseBigDecimal( sumStr, BigDecimal.ZERO ); if( sum == null || sum.equals(BigDecimal.ZERO) ) { event.setError( "Вы должны ввести сумму в рублях" ); return; } String passwd = PswdGen.generatePassword( Setup.getSetup() ); ContractManager contractManager = new ContractManager( connectionSet.getConnection() ); Contract contract = contractManager.createFromPattern( CONTRACT_PATTERN_GOROD_ID, null, Calendar.getInstance(), passwd ); if ( contract == null ) { print( "договор не создан" ); event.setError( "Ошибка, обратитесь к администратору" ); return; } ContractParameterManager paramManager = new ContractParameterManager( connectionSet.getConnection() ); if ( !Utils.isEmptyString( phone ) ) { paramManager.updateStringParam( contract.getId(), PHONE_PARAM_ID, phone, 0); //чтобы title договора поменялся new CommentPatternManager( connectionSet.getConnection() ).updateContractComment( contract.getId() ); } ServerContext context = ServerContext.get(); InetServService wsServ = context.getService( InetServService.class, INET_MODULE_ID ); List<InetServ> servList = wsServ.inetServList( contract.getId() ); //Сервис с логином пароля настроен уже в шаблоне договора, его не надо создавать if ( servList.size() == 0 ) { print( "сервис не создан" ); event.setError( "Ошибка, обратитесь к администратору" ); return; } InetServ serv = servList.get( 0 ); print( "Contract created with title = " + contract.getTitle() + ";id=" + contract.getId() ); String payUrl = STAT_PATH + "?action=Pay&mid=6&module=assist&contractId=" + contract.getId() + "&user=" + contract.getTitle() +"&pswd=" + contract.getPswd() + "&midAuth=0&summ=" + sum + "&url_ok=" + URLEncoder.encode( PORTAL_PATH + "method=remoteSuccess&message=" + MESSAGE_SUCCESS, "utf8" ) + "&url_no=" + URLEncoder.encode( PORTAL_PATH + "method=remoteSuccess&message=" + MESSAGE_FAIL, "utf8") ; print( "url=" + payUrl ); event.setPayUrl( payUrl ); } catch( Exception ex ) { logger.error( ex.getMessage(), ex ); event.setError( "Ошибка, обратитесь к администратору" ); } } } }
3. Добавить скрипт на событие приход платежа. Скрипт отправляет логин/пароль сервиса по смс.
package ru.bitel.saha.script.contract; import ru.bitel.bgbilling.kernel.event.Event; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; import ru.bitel.bgbilling.kernel.contract.balance.common.bean.Payment; import bitel.billing.server.contract.bean.ContractManager; import bitel.billing.server.contract.bean.Contract; import java.util.List; import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ; import ru.bitel.bgbilling.kernel.container.managed.ServerContext; import ru.bitel.bgbilling.modules.inet.api.common.service.InetServService; import ru.bitel.bgbilling.kernel.network.sms.Smsc; import bitel.billing.server.contract.bean.ContractParameterManager; import ru.bitel.common.Utils; public class PaymentEvent extends EventScriptBase { static final int ASSIST_PAYMENT_TYPE = 4; private static final int INET_MODULE_ID = 1; private static final String SMSC_LOGIN = ""; private static final String SMSC_PASSWORD = ""; private static final int PHONE_PARAM_ID = 5; @Override public void onEvent( Event event, Setup setup, ConnectionSet connectionSet ) throws Exception { print( "payment" ); ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent payEvent = (ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent) event; Payment payment = payEvent.getPayment(); if ( payment.getTypeId() == ASSIST_PAYMENT_TYPE ) { print( "assist payment" ); } ContractManager contractManager = new ContractManager( connectionSet.getConnection() ); Contract contract = contractManager.getContractById( event.getContractId() ); ServerContext context = ServerContext.get(); InetServService wsServ = context.getService( InetServService.class, INET_MODULE_ID ); List<InetServ> servList = wsServ.inetServList( contract.getId() ); //Сервис с логином пароля настроен уже в шаблоне договора, его не надо создавать if ( servList.size() == 0 ) { print( "сервиса нет на договоре" ); //event.setError( "Ошибка, обратитесь к администратору" ); return; } InetServ serv = servList.get( 0 ); Smsc smsc = new Smsc( SMSC_LOGIN, SMSC_PASSWORD ); String message = "WI-FI логин: " + serv.getLogin() + ", пароль: " + serv.getPassword(); ContractParameterManager paramManager = new ContractParameterManager( connectionSet.getConnection()); String phone = paramManager.getStringParam( contract.getId(), PHONE_PARAM_ID ); if ( Utils.isEmptyString( phone ) ) { print( "телефон на задан на договоре" ); } if ((phone.length() == 10 && phone.charAt(0) == '9')) { phone = "7" + phone; } if ((phone.length() == 11 && phone.charAt(0) == '8')) { phone = "7" + phone.substring(1); } if ((phone.charAt(0) == '+' && phone.charAt(1) == '7' && phone.charAt(2) == '9')||(phone.charAt(0) == '7'&& phone.charAt(1) == '9')) { String[] results = smsc.send_sms( phone, message, 0, "", "", 0, "", "" ); for( int i = 0; i < results.length; i++ ) { print( "result " + i + " = " + results[i] ); } if ( results.length == 4 ) { print( "id = " + results[0] ); print( "sms count = " + results[1] ); print( "cost = " + results[2] ); print( "balance = " + results[3] ); } else if ( results.length == 2 ) { print( "Ошибка при отправке смс" ); print( "id = " + results[0] ); print( "error code = " + results[1] ); } } } }