WiFi-портал с оплатой картой через assist

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

(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «<source lang="java"> package ru.bitel.saha.script.wifi; import ru.bitel.bgbilling.kernel.event.Event; import ru.bitel.bgbilling.kernel.script.server.dev.EventScript…»)
 
(2 промежуточные версии не показаны)
Строка 1: Строка 1:
 +
1. В конфигурации портала ставим
 +
<source lang="bash">
 +
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=сумма
 +
 +
</source>
 +
 +
2. Добавить обработчик глобальных функций поведения на событие "WiFi" активация модуля Inet.  Обработчик  создает договор  по конкретному шаблону договора, в котором указано, что нужно создавать сервис модуля inet определенного типа. В самом типе сервиса настроена автоматическая генерация логина/пароля.  Так же в шаблоне указано время жизни договора ( имеет значение с точки зрения экономии лицензий, закрытый договор не потребляет лицензию).  Далее обработчик перенаправляет абонента в личный кабинет, на страницу отправки в assist( как будто клиент уже ввел сумму в личном кабинете и нажал кнопку оплатить ). Для клиента все это выглядит так как будто он на портале ввел телефон и сумму, и его перекинуло на сайт assist. Так же скрипт передает &url_ok и &url_no, которые передаются в assist ( перетирают те, которые указаны в конфигурации assist). Это для того, чтобы после оплаты assist перекинул на портал с сообщением об успехе или неудаче. 
 +
 +
 +
 +
Вот сам класс обработчика :
<source lang="java">
<source lang="java">
package ru.bitel.saha.script.wifi;
package ru.bitel.saha.script.wifi;
Строка 143: Строка 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] );
        }   	
    }    	
	}
}
Личные инструменты