DexiaPayInformation.java
package sk.iway.iwcm.ebanking.epayments;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.ebanking.Payment;
/**
* DexiaPayInformation.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.3 $
*@created Date: 27.8.2009 16:36:02
*@modified $Date: 2009/12/11 14:51:53 $
*/
class DexiaPayInformation extends PaymentInformation
{
public DexiaPayInformation()
{
//nacitaj konfiguracne hodnoty do fieldov
merchantId = Constants.getString("basketPaymentDexiaPayMid");
key = getDecrypredKey(Constants.getString("basketPaymentDexiaPayKey"));
constantSymbol = Constants.getInt("basketPaymentDexiaPayConstantSymbol");
}
@Override
public String getUrlString()
{
String confUrl = Constants.getString("basketPaymentDexiaPayUrl");
if(Tools.isNotEmpty(confUrl))
return confUrl;
else
return "https://eb.dexia.sk/dexiapay/default.aspx";
//return "http://epaymentsimulator.monogram.sk/DB_DexiaPay.aspx";
}
@Override
public String getReturnEmail()
{
return Constants.getString("basketPaymentDexiaPayNotificationEmail");
}
@Override
public boolean hasOwnForm()
{
return true;
}
@Override
public boolean validateBankResponce(HttpServletRequest request) throws Exception
{
String vs=null;
String ss=null;
String res=null;
String sign=null;
Enumeration<?> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements())
{
String parameterName = parameterNames.nextElement().toString();
String value = request.getParameter(parameterName);
if ("VS".equals(parameterName))
vs = value;
if ("SS".equals(parameterName))
ss = value;
if("RES".equals(parameterName))
res = value;
if("SIGN".equals(parameterName))
sign = value;
}
if (Tools.isAnyEmpty(sign, vs, ss, res))
throw new InvalidBankResponceException();
if (!Arrays.asList("OK", "NO").contains(res))
throw new InvalidBankResponceException();
String signWeExpect = generateSign("VS="+vs+";SS="+ss+";RES="+res);
if (!signWeExpect.equals(sign))
throw new InvalidSignatureException("Expected: "+signWeExpect+", got: "+sign);
return "OK".equals(res);
}
@Override
public String generateForm(Payment payment, HttpServletRequest request)
{
String action = getUrlString();
StringBuilder form = new StringBuilder().
append("<form method=\"get\" action=\""+action+"\" name=\"payForm\">").
append("<input type='hidden' name='MID' value='"+getMerchantId()+"'/>").
append("<input type='hidden' name='AMT' value='"+amountFormatted(payment.getAmount())+"'/>").
append("<input type='hidden' name='VS' value='"+payment.getVariableSymbol()+"'/>").
append("<input type='hidden' name='SS' value='"+payment.getSpecificSymbol()+"'/>");
if(Tools.isNotEmpty(payment.getSpecificSymbol()))
form.append("<input type='hidden' name='CS' value='"+payment.getConstantSymbol()+"'/>");
if(Tools.isNotEmpty(payment.getDescription()))
form.append("<input type='hidden' name='DESC' value='"+payment.getDescriptionFormatted(35, false)+"'/>");
String rurl=(String)request.getAttribute("RURL");
if(Tools.isNotEmpty(rurl))
form.append("<input type='hidden' name='RURL' value='"+rurl+"'/>");
if(Tools.isNotEmpty(getReturnEmail()))
form.append("<INPUT type='hidden' NAME='REM' value='"+getReturnEmail()+"' />");
form.append("<input type='hidden' name='SIGN' value='"+generateOutgoingSign(payment,request)+"'/>").
append("</form>");
return form.toString();
}
private String generateOutgoingSign(Payment payment, HttpServletRequest request)
{
StringBuilder toHash = new StringBuilder().
append("MID="+getMerchantId()).
append(";AMT="+amountFormatted(payment.getAmount())).
append(";VS="+payment.getVariableSymbol()).
append(";SS="+payment.getSpecificSymbol());
if(Tools.isNotEmpty(payment.getConstantSymbol()))
toHash.append(";CS="+payment.getConstantSymbol());
return generateSign(toHash.toString());
}
private String generateSign(String stringToEncrypt)
{
String sign = TripleDesHashCalculator.calculateHash(stringToEncrypt, getKey());
return sign;
}
private String amountFormatted(BigDecimal amount)
{
return new DecimalFormat("000").format(amount.multiply(BigDecimal.valueOf(100)));
}
}