WiFi-портал с активацией по sms
Материал из BiTel WiKi
Stark (Обсуждение | вклад) (Новая страница: «С версии 6.2 в WiFi-портале есть возможность активации с помощью sms. Это предназначено для нов…») |
Stark (Обсуждение | вклад) |
||
Строка 14: | Строка 14: | ||
</source> | </source> | ||
- | 2. Добавить обработчик глобальных функций поведения на событие "WiFi" активация модуля Inet. В качестве примера приводится обработчик, который проверяет правильность введенного номера . Далее пытается найти уже созданный договор с таким номером. Если договор найден, то скрипт берет у него логин/пароль сервиса и отправляет по смс на указанный номер. Если договор не найден, то он создается по конкретному шаблону договора, в котором указано, что нужно создавать сервис модуля inet определенного типа. В самом типе сервиса настроена автоматическая генерация логина/пароля. Далее после создания сервиса логин/пароль отправляется по sms. | + | 2. Добавить обработчик глобальных функций поведения на событие "WiFi" активация модуля Inet. В качестве примера приводится обработчик, который проверяет правильность введенного номера . Далее пытается найти уже созданный действующий договор с таким номером. Если договор найден, то скрипт берет у него логин/пароль сервиса и отправляет по смс на указанный номер. Если договор не найден, то он создается по конкретному шаблону договора, в котором указано, что нужно создавать сервис модуля inet определенного типа. В самом типе сервиса настроена автоматическая генерация логина/пароля. Далее после создания сервиса логин/пароль отправляется по sms. Так же в шаблоне указано время жизни договора ( имеет значение с точки зрения экономии лицензий, закрытый договор не потребляет лицензию). |
В качестве провайдера sms тут используется smsc.ru. | В качестве провайдера sms тут используется smsc.ru. | ||
Вот сам класс обработчика : | Вот сам класс обработчика : | ||
<source lang="java"> | <source lang="java"> | ||
+ | package ru.bitel.saha.scipt.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; | ||
+ | |||
+ | |||
+ | |||
+ | public class Activation | ||
+ | extends EventScriptBase<WiFiActivateEvent> | ||
+ | { | ||
+ | static final Logger logger = Logger.getLogger( Activation.class ); | ||
+ | |||
+ | //код шаблона договоров | ||
+ | private static final int CONTRACT_PATTERN_ID = 3; | ||
+ | //код модуля inet | ||
+ | private static final int INET_MODULE_ID = 1; | ||
+ | //код параметра договора с телефоном( параметр текстовый). | ||
+ | private static final int PHONE_PARAM_ID = 5; | ||
+ | //код параметра договора с ФИО | ||
+ | private static final int FIO_PARAM_ID = 4; | ||
+ | //логин на smsc.ru | ||
+ | private static final String SMSC_LOGIN = "xxx"; | ||
+ | //пароль на smsc.ru | ||
+ | private static final String SMSC_PASSWORD = "xxx"; | ||
+ | |||
+ | |||
+ | @Override | ||
+ | public void onEvent( WiFiActivateEvent event, Setup setup, ConnectionSet connectionSet ) | ||
+ | throws Exception | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | ServerContext context = ServerContext.get(); | ||
+ | print( "WiFi Activation2" ); | ||
+ | |||
+ | String fio = event.getParams().get( "fio" ); | ||
+ | String phone = event.getParams().get( "phone" ); | ||
+ | print( "fio=" + fio ); | ||
+ | print( "phone=" + phone ); | ||
+ | |||
+ | if ( phone == null || phone.trim().length() != 10 ) | ||
+ | { | ||
+ | event.setError( "Вы должны ввести 10-чный номер" ); | ||
+ | return; | ||
+ | } | ||
+ | phone = "+7" + phone.trim(); | ||
+ | |||
+ | Date now = new Date(); | ||
+ | |||
+ | ContractManager contractManager = new ContractManager( connectionSet.getConnection() ); | ||
+ | |||
+ | |||
+ | String query = "SELECT * FROM " + ContractParameterManager.CONTRACT_PARAMETER_TYPE_STRING + " as param " + | ||
+ | " LEFT JOIN contract ON contract.id = param.cid" + | ||
+ | " WHERE param.pid = ? and param.val = ? AND contract.date1 <= ? AND (contract.date2 IS NULL OR contract.date2 >= ?) " ; | ||
+ | |||
+ | Contract contract = null; | ||
+ | try( PreparedStatement ps = connectionSet.getConnection().prepareStatement( query );) | ||
+ | { | ||
+ | ps.setInt( 1, PHONE_PARAM_ID ); | ||
+ | ps.setString( 2, phone ); | ||
+ | ps.setDate( 3, TimeUtils.convertDateToSqlDate( now ) ); | ||
+ | ps.setDate( 4, TimeUtils.convertDateToSqlDate( now ) ); | ||
+ | |||
+ | try( ResultSet rs = ps.executeQuery(); ) | ||
+ | { | ||
+ | if ( rs.next() ) | ||
+ | { | ||
+ | int cid = rs.getInt( "cid" ); | ||
+ | contract = contractManager.getContractById( cid ); | ||
+ | print( "договор найден" ); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | String successMessage = null; | ||
+ | if ( contract == null ) | ||
+ | { | ||
+ | print( "договор не найден, создаем новый" ); | ||
+ | contract = contractManager.createFromPattern( CONTRACT_PATTERN_ID, null, Calendar.getInstance(), "" ); | ||
+ | |||
+ | ContractParameterManager paramManager = new ContractParameterManager( connectionSet.getConnection()); | ||
+ | |||
+ | paramManager.updateStringParam( contract.getId(), PHONE_PARAM_ID, phone, 0); | ||
+ | paramManager.updateStringParam( contract.getId(), FIO_PARAM_ID, fio, 0); | ||
+ | //чтобы title договора поменялся | ||
+ | new CommentPatternManager( connectionSet.getConnection() ).updateContractComment( contract.getId() ); | ||
+ | successMessage = "Активация прошла успешно. Логин и пароль выслан на ваш номер телефона"; | ||
+ | //context.publishAfterCommit( new ContractParamChangedEvent( 0, contract.getId(), PHONE_PARAM_ID, phone ) ); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | successMessage = "Вы уже активировали этот номер телефона. Логин и пароль выслан на ваш номер телефона повторно"; | ||
+ | } | ||
+ | |||
+ | |||
+ | if ( contract == null ) | ||
+ | { | ||
+ | print( "договор не создан" ); | ||
+ | event.setError( "Ошибка, обратитесь к администратору" ); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | 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 = "логин: " + serv.getLogin() + ", пароль: " + serv.getPassword(); | ||
+ | |||
+ | |||
+ | 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] ); | ||
+ | event.setSuccessMessage( successMessage ); | ||
+ | |||
+ | } | ||
+ | else if ( results.length == 2 ) | ||
+ | { | ||
+ | print( "Ошибка при отправке смс" ); | ||
+ | print( "id = " + results[0] ); | ||
+ | print( "error code = " + results[1] ); | ||
+ | event.setError( "Не получилось отправить смс на ваш номер телефона" ); | ||
+ | connectionSet.rollback(); | ||
+ | } | ||
+ | |||
+ | /*InetServ serv = new InetServ(); | ||
+ | serv.setContractId( event.getContractId() ); | ||
+ | serv.setComment( "Создан автоматически при подключении " ); | ||
+ | serv.setDateFrom( new Date() ); | ||
+ | serv.setLogin( "" ); | ||
+ | serv.setPassword( "" ); | ||
+ | serv.setTypeId( INET_SERV_TYPE_ID ); | ||
+ | serv.setInterfaceId( port ); | ||
+ | serv.setDeviceId( deviceId ); | ||
+ | serv.setAddressFrom( whiteRange.getAddressFrom() ); | ||
+ | |||
+ | |||
+ | wsServ.inetServUpdate( serv, Collections.emptyList(), false, false, 0 ); | ||
+ | */ | ||
+ | |||
+ | //context.commit(); | ||
+ | |||
+ | //event.setSuccessMessage( "Активация прошла успешно."); | ||
+ | |||
+ | event.setSuccessMessage( successMessage ); | ||
+ | } | ||
+ | catch( Exception ex ) | ||
+ | { | ||
+ | logger.error( ex.getMessage(), ex ); | ||
+ | event.setError( "Ошибка, обратитесь к администратору" ); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
</source> | </source> |
Версия 08:04, 13 января 2016
С версии 6.2 в WiFi-портале есть возможность активации с помощью sms. Это предназначено для новых клиентов, которые еще не имеют логина/пароля. Рекомендуется ознакомится со статьей из документации. В данной статье показана отправка sms с помощью sms-провайдера smsc.ru.
1. В конфигурации портала ставим
portal.activate=1 portal.activate.parameter.1.type=text portal.activate.parameter.1.name=fio portal.activate.parameter.1.title=фио portal.activate.parameter.2.type=text portal.activate.parameter.2.name=phone portal.activate.parameter.2.title=телефон
2. Добавить обработчик глобальных функций поведения на событие "WiFi" активация модуля Inet. В качестве примера приводится обработчик, который проверяет правильность введенного номера . Далее пытается найти уже созданный действующий договор с таким номером. Если договор найден, то скрипт берет у него логин/пароль сервиса и отправляет по смс на указанный номер. Если договор не найден, то он создается по конкретному шаблону договора, в котором указано, что нужно создавать сервис модуля inet определенного типа. В самом типе сервиса настроена автоматическая генерация логина/пароля. Далее после создания сервиса логин/пароль отправляется по sms. Так же в шаблоне указано время жизни договора ( имеет значение с точки зрения экономии лицензий, закрытый договор не потребляет лицензию). В качестве провайдера sms тут используется smsc.ru.
Вот сам класс обработчика :
package ru.bitel.saha.scipt.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; public class Activation extends EventScriptBase<WiFiActivateEvent> { static final Logger logger = Logger.getLogger( Activation.class ); //код шаблона договоров private static final int CONTRACT_PATTERN_ID = 3; //код модуля inet private static final int INET_MODULE_ID = 1; //код параметра договора с телефоном( параметр текстовый). private static final int PHONE_PARAM_ID = 5; //код параметра договора с ФИО private static final int FIO_PARAM_ID = 4; //логин на smsc.ru private static final String SMSC_LOGIN = "xxx"; //пароль на smsc.ru private static final String SMSC_PASSWORD = "xxx"; @Override public void onEvent( WiFiActivateEvent event, Setup setup, ConnectionSet connectionSet ) throws Exception { try { ServerContext context = ServerContext.get(); print( "WiFi Activation2" ); String fio = event.getParams().get( "fio" ); String phone = event.getParams().get( "phone" ); print( "fio=" + fio ); print( "phone=" + phone ); if ( phone == null || phone.trim().length() != 10 ) { event.setError( "Вы должны ввести 10-чный номер" ); return; } phone = "+7" + phone.trim(); Date now = new Date(); ContractManager contractManager = new ContractManager( connectionSet.getConnection() ); String query = "SELECT * FROM " + ContractParameterManager.CONTRACT_PARAMETER_TYPE_STRING + " as param " + " LEFT JOIN contract ON contract.id = param.cid" + " WHERE param.pid = ? and param.val = ? AND contract.date1 <= ? AND (contract.date2 IS NULL OR contract.date2 >= ?) " ; Contract contract = null; try( PreparedStatement ps = connectionSet.getConnection().prepareStatement( query );) { ps.setInt( 1, PHONE_PARAM_ID ); ps.setString( 2, phone ); ps.setDate( 3, TimeUtils.convertDateToSqlDate( now ) ); ps.setDate( 4, TimeUtils.convertDateToSqlDate( now ) ); try( ResultSet rs = ps.executeQuery(); ) { if ( rs.next() ) { int cid = rs.getInt( "cid" ); contract = contractManager.getContractById( cid ); print( "договор найден" ); } } } String successMessage = null; if ( contract == null ) { print( "договор не найден, создаем новый" ); contract = contractManager.createFromPattern( CONTRACT_PATTERN_ID, null, Calendar.getInstance(), "" ); ContractParameterManager paramManager = new ContractParameterManager( connectionSet.getConnection()); paramManager.updateStringParam( contract.getId(), PHONE_PARAM_ID, phone, 0); paramManager.updateStringParam( contract.getId(), FIO_PARAM_ID, fio, 0); //чтобы title договора поменялся new CommentPatternManager( connectionSet.getConnection() ).updateContractComment( contract.getId() ); successMessage = "Активация прошла успешно. Логин и пароль выслан на ваш номер телефона"; //context.publishAfterCommit( new ContractParamChangedEvent( 0, contract.getId(), PHONE_PARAM_ID, phone ) ); } else { successMessage = "Вы уже активировали этот номер телефона. Логин и пароль выслан на ваш номер телефона повторно"; } if ( contract == null ) { print( "договор не создан" ); event.setError( "Ошибка, обратитесь к администратору" ); return; } 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 = "логин: " + serv.getLogin() + ", пароль: " + serv.getPassword(); 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] ); event.setSuccessMessage( successMessage ); } else if ( results.length == 2 ) { print( "Ошибка при отправке смс" ); print( "id = " + results[0] ); print( "error code = " + results[1] ); event.setError( "Не получилось отправить смс на ваш номер телефона" ); connectionSet.rollback(); } /*InetServ serv = new InetServ(); serv.setContractId( event.getContractId() ); serv.setComment( "Создан автоматически при подключении " ); serv.setDateFrom( new Date() ); serv.setLogin( "" ); serv.setPassword( "" ); serv.setTypeId( INET_SERV_TYPE_ID ); serv.setInterfaceId( port ); serv.setDeviceId( deviceId ); serv.setAddressFrom( whiteRange.getAddressFrom() ); wsServ.inetServUpdate( serv, Collections.emptyList(), false, false, 0 ); */ //context.commit(); //event.setSuccessMessage( "Активация прошла успешно."); event.setSuccessMessage( successMessage ); } catch( Exception ex ) { logger.error( ex.getMessage(), ex ); event.setError( "Ошибка, обратитесь к администратору" ); } } }