CardPayInformation.java

package sk.iway.iwcm.ebanking.epayments;

import java.util.Arrays;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.DB;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.ebanking.Payment;

/**
 *  CardPayInformation.java
 *
 *@Title        webjet4
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2009
 *@author       $Author: jraska $
 *@version      $Revision: 1.1 $
 *@created      Date: 30.11.2009 10:33:18
 *@modified     $Date: 2009/12/11 14:51:53 $
 */
public class CardPayInformation extends PaymentInformation
{
	CardPayInformation()
	{
		this.merchantId = Constants.getString("basketPaymentTatraPayMid");
		this.key = getDecrypredKey(Constants.getString("basketPaymentTatraPayKey"));
		this.constantSymbol = Integer.valueOf(Constants.getInt("basketPaymentTatraPayConstantSymbol"));
	}
	@Override
	public String getUrlString()
	{
		String confUrl = Constants.getString("basketPaymentTatraPayUrl");
		if(Tools.isNotEmpty(confUrl))
			return confUrl;
		else
			return "https://moja.tatrabanka.sk/cgi-bin/e-commerce/start/e-commerce.jsp";
		//return "http://epaymentsimulator.monogram.sk/TB_CardPay.aspx";
	}
	@Override
	public String getReturnEmail()
	{
		return Constants.getString("basketPaymentTatraPayNotificationEmail");
	}
	
	@Override
	public boolean hasOwnForm()
	{
		return true;
	}
	
	@Override
	public String generateForm(Payment payment, HttpServletRequest request)
	{
		if (request.getAttribute("RURL") == null)
			throw new IllegalStateException("HttpServletRequest needs to have 'RURL'(return URL) attribute");
	
		String buyerName = payment.getBuyerName();
		if(Tools.isEmpty(buyerName))
			throw new IllegalStateException("Attribute 'Payment.buyerName' is required in CardPay");
		
		buyerName = getBuyerNameFormatted(buyerName);
		StringBuilder form = new StringBuilder().
		append("<FORM action='"+getUrlString()+"' METHOD='GET' name='payForm'>").
			append("<INPUT type=\"hidden\" NAME=\"PT\" value=\"CardPay\" />").
			append("<INPUT type=\"hidden\" NAME=\"MID\" value='"+getMerchantId()+"' />").
			append("<INPUT type=\"hidden\" NAME=\"AMT\" value='"+payment.getAmountString()+"' />").
			append("<INPUT type=\"hidden\" NAME=\"VS\" value='"+payment.getVariableSymbol()+"' />").
			append("<INPUT type=\"hidden\" NAME=\"CS\" value='"+payment.getConstantSymbol()+"' />").
			append("<INPUT type=\"hidden\" NAME=\"RURL\" value='"+request.getAttribute("RURL")+"' />").
			append("<INPUT type=\"hidden\" NAME=\"SIGN\" value='"+generateOutcomingSign(payment, request)+"' />").
			append("<INPUT type=\"hidden\" NAME=\"CURR\" value=\"978\" />").//978 = ISO EURO
			append("<INPUT type=\"hidden\" NAME=\"IPC\" value=\""+request.getRemoteAddr()+"\" />").
			append("<INPUT type=\"hidden\" NAME=\"NAME\" value=\""+buyerName+"\" />");
		if (Tools.isNotEmpty(getReturnEmail()))
			form.append("<INPUT type=\"hidden\" NAME=\"REM\" value='"+getReturnEmail()+"' />");			
		form.append("</FORM>");
		return form.toString();
	}	
	
	private String generateOutcomingSign(Payment payment, HttpServletRequest request)
	{
		StringBuilder stringToEncypher = new StringBuilder().
			append(getMerchantId()).
			append(payment.getAmountString()).
			append("978"). //978 = ISO EURO
			append(payment.getVariableSymbol()).
			append(payment.getConstantSymbol()).
			append(request.getAttribute("RURL")).
			append(request.getRemoteAddr()).
			append(getBuyerNameFormatted(payment.getBuyerName()));
		return generateSign(stringToEncypher.toString());
	}
	
	private String generateSign(String stringToEncypher)
	{
		return DefaultHashCalculator.calculateHash(stringToEncypher, getKey());
	}
	
	
	@Override
	public boolean validateBankResponce(HttpServletRequest request) throws Exception
	{
		String signWeGot = null;
		String variableSymbol = null;
		String ac="";
		String result = null;
		
		Enumeration<?> parameters = request.getParameterNames();
		while (parameters.hasMoreElements())
		{
			String parameterName = parameters.nextElement().toString();
			String value = request.getParameter(parameterName);;
			if ("SIGN".equalsIgnoreCase(parameterName))
				signWeGot = value;
			if ("VS".equalsIgnoreCase(parameterName))
				variableSymbol = value;
			if ("RES".equalsIgnoreCase(parameterName))
				result = value;
			if ("AC".equalsIgnoreCase(parameterName))
				ac = value;
		}
		
		if (Tools.isAnyEmpty(signWeGot, variableSymbol, result))
			throw new InvalidBankResponceException();
		
		if (!Arrays.asList("OK", "FAIL", "TOUT").contains(result))
			throw new InvalidBankResponceException();
		
		String signWeExpect = generateSign(variableSymbol + result + ac);
		
		if (!signWeExpect.equals(signWeGot))
			throw new InvalidSignatureException("Expected: "+signWeExpect+", got: "+signWeGot);
		
		return "OK".equals(result);
	}
	
	private String getBuyerNameFormatted(String buyerName)
	{
		String retBuyerName = DB.internationalToEnglish(buyerName);
		retBuyerName = retBuyerName.substring(0,Math.min(30, retBuyerName.length()));
		return retBuyerName;
	}
}