package com.softwaremill.common.paypal.process; import javax.servlet.ServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Enumeration; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @Author: lukasz.zuchowski at gmail dot com * Date: 05.04.12 * Time: 11:17 */ public class RequestParameters { private ServletRequest request; private static final Pattern HACKY_PARAMS = Pattern.compile("([^%^0^D])%0A"); public enum Parameter { item_name, item_number, payment_status, mc_gross, mc_currency, txn_id, receiver_email, payer_email, custom, option_selection1, parent_txn_id, invoice } public RequestParameters(ServletRequest request) { this.request = request; } public String getParameter(Parameter parameter) { return getParameter(parameter.toString()); } private String getParameter(String parameterName) { return request.getParameter(parameterName); } public String buildRequestParametersForUrl() { try { StringBuffer postBackMessage = new StringBuffer(); String charset = request.getParameter("charset"); if (charset == null) { charset = "UTF-8"; } Enumeration<String> paramNames = request.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName = paramNames.nextElement(); postBackMessage.append("&"); postBackMessage.append(paramName); postBackMessage.append("="); String parameter = URLEncoder.encode(request.getParameter(paramName), charset); postBackMessage.append(fixTheParameterForIPN(parameter)); } return postBackMessage.toString(); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } private static String fixTheParameterForIPN(String parameter) { // hack from http://www.hebtech.co.uk/blog/paypal-ipn-invalid-on-live-server-but-valid-on-test-server-fixed/ Matcher matcher = HACKY_PARAMS.matcher(parameter); StringBuffer s = new StringBuffer(); if (!matcher.matches()) { return parameter; } while (matcher.find()) { matcher.appendReplacement(s, matcher.group(1) + "%0D%0A"); } return s.toString(); } }