WiFi-портал с активацией по sms
Материал из BiTel WiKi
С версии 6.2 в WiFi-портале есть возможность активации с помощью sms. Это предназначено для новых клиентов, которые еще не имеют логина/пароля.
Cогласно постановления Правительства РФ от 31 июля 2014 года №758 "О внесении изменений в акты Правительства Российской Федерации в связи с принятием Федерального закона "О внесении изменений в Федеральный закон "Об информации, информационных технологиях и о защите информации" и отдельные законодательные акты Российской Федерации по вопросам упорядочения обмена информацией с использованием информационно-телекоммуникационных сетей" вводится обязательная идентификация пользователей для доступа в сеть «Интернет»
Рекомендуется ознакомится со статьей из документации. В данной статье показана отправка 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( "Ошибка, обратитесь к администратору" ); } } }