WiFi-портал с активацией по sms

Материал из BiTel WiKi

Перейти к: навигация, поиск

С версии 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( "Ошибка, обратитесь к администратору" );
		}
 
	}
 
}
Личные инструменты