You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by mr...@apache.org on 2009/04/16 21:14:08 UTC

svn commit: r765722 - in /ofbiz/trunk/applications/accounting: config/payment.properties src/org/ofbiz/accounting/thirdparty/verisign/PayflowPro.java

Author: mrisaliti
Date: Thu Apr 16 19:14:07 2009
New Revision: 765722

URL: http://svn.apache.org/viewvc?rev=765722&view=rev
Log:
Support of PayflowPro v4 and use the new Payment Gateway Config features (OFBIZ-2293)

Modified:
    ofbiz/trunk/applications/accounting/config/payment.properties
    ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/verisign/PayflowPro.java

Modified: ofbiz/trunk/applications/accounting/config/payment.properties
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/config/payment.properties?rev=765722&r1=765721&r2=765722&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/config/payment.properties (original)
+++ ofbiz/trunk/applications/accounting/config/payment.properties Thu Apr 16 19:14:07 2009
@@ -209,6 +209,12 @@
 # Set to false to not transmit anything
 payment.verisign.enable_transmit=true
 
+# Logging
+payment.verisign.logFileName=${sys:getProperty('ofbiz.home')}/runtime/logs/payflow_java.log
+payment.verisign.loggingLevel=6
+payment.verisign.maxLogFileSize=1000000
+payment.verisign.stackTraceOn=N
+
 ############################################
 # WorldPay Select Pro Configuration
 ############################################

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/verisign/PayflowPro.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/verisign/PayflowPro.java?rev=765722&r1=765721&r2=765722&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/verisign/PayflowPro.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/verisign/PayflowPro.java Thu Apr 16 19:14:07 2009
@@ -22,12 +22,13 @@
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javolution.util.FastMap;
+
 import org.ofbiz.accounting.payment.PaymentGatewayServices;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.StringUtil;
@@ -35,26 +36,29 @@
 import org.ofbiz.base.util.UtilProperties;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.string.FlexibleStringExpander;
+import org.ofbiz.entity.GenericDelegator;
+import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
 import org.ofbiz.service.DispatchContext;
 import org.ofbiz.service.ServiceUtil;
 
-import com.Verisign.payment.PFProAPI;
-
+import paypal.payflow.PayflowAPI;
+import paypal.payflow.SDKProperties;
 /**
  * PayflowPro - Verisign PayFlow Pro <=> OFBiz Service Module
  */
 public class PayflowPro {
 
     public static final String module = PayflowPro.class.getName();
-
+    
     /**
      * Authorize credit card payment service. Service wrapper around PayFlow Pro API.
      * @param dctx Service Engine DispatchContext.
      * @param context Map context of parameters.
      * @return Response map, including RESPMSG, and RESULT keys.
      */
-    public static Map ccProcessor(DispatchContext dctx, Map context) {
+    public static Map<String, Object> ccProcessor(DispatchContext dctx, Map<String, ? extends Object> context) {
+        GenericDelegator delegator = dctx.getDelegator();
         GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
         GenericValue authTrans = (GenericValue) context.get("authTrans");
         String orderId = (String) context.get("orderId");
@@ -63,6 +67,7 @@
         GenericValue party = (GenericValue) context.get("billToParty");
         GenericValue cc = (GenericValue) context.get("creditCard");
         GenericValue ps = (GenericValue) context.get("billingAddress");
+        String paymentGatewayConfigId = (String) context.get("paymentGatewayConfigId");
         String configString = (String) context.get("paymentConfig");
         if (configString == null) {
             configString = "payment.properties";
@@ -74,12 +79,12 @@
 
         // set the orderId as comment1 so we can query in PF Manager
         boolean isReAuth = false;
-        Map data = UtilMisc.toMap("COMMENT1", orderId);
+        Map<String, String> data = UtilMisc.toMap("COMMENT1", orderId);
         data.put("PONUM", orderId);
         data.put("CUSTCODE", party.getString("partyId"));
 
         // transaction type
-        if (UtilProperties.propertyValueEqualsIgnoreCase(configString, "payment.verisign.preAuth", "Y")) {
+        if (comparePaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "preAuth", configString, "payment.verisign.preAuth",  "Y")) {
             data.put("TRXTYPE", "A");
             // only support re-auth for auth types; sale types don't do it
             if (authTrans != null) {
@@ -120,18 +125,16 @@
 
         // gather the address info
         if (ps != null) {
-            String street = ps.getString("address1") +
-                (ps.get("address2") != null && ps.getString("address2").length() > 0 ? " " +
-                    ps.getString("address2") : "");
+            String street = ps.getString("address1") + (ps.get("address2") != null && ps.getString("address2").length() > 0 ? " " + ps.getString("address2") : "");
 
             data.put("STREET", street);
             data.put("ZIP", ps.getString("postalCode"));
         }
 
-        PFProAPI pn = init(configString, context);
-
+        PayflowAPI pfp = init(delegator, paymentGatewayConfigId, configString, context);
+        
         // get the base params
-        StringBuffer params = makeBaseParams(configString);
+        StringBuffer params = makeBaseParams(delegator, paymentGatewayConfigId, configString);
 
         // parse the context parameters
         params.append("&").append(parseContext(data));
@@ -139,28 +142,29 @@
         // transmit the request
         if (Debug.verboseOn()) Debug.logVerbose("Sending to Verisign: " + params.toString(), module);
         String resp;
-        if (!UtilProperties.propertyValueEqualsIgnoreCase(configString, "payment.verisign.enable_transmit", "false")) {
-            resp = pn.SubmitTransaction(params.toString());
+        if (!comparePaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "enableTransmit", configString, "payment.verisign.enable_transmit",  "false")) {
+            resp = pfp.submitTransaction(params.toString(), pfp.generateRequestId());
         } else {
             resp = "RESULT=0&AUTHCODE=T&PNREF=" + (new Date()).getTime() + "&RESPMSG=Testing";
         }
 
-        if (Debug.verboseOn()) Debug.logVerbose("Response from Verisign: " + resp, module);
-
-        // reset for next use
-        pn.DestroyContext();
-
+        if (Debug.verboseOn()) {
+            Debug.logVerbose("Response from Verisign: " + resp, module);
+        }
+        
         // check the response
-        Map result = ServiceUtil.returnSuccess();
-        parseAuthResponse(resp, result, configString, isReAuth);
+        Map<String, Object> result = ServiceUtil.returnSuccess();
+        parseAuthResponse(delegator, paymentGatewayConfigId, resp, result, configString, isReAuth);
         result.put("processAmount", processAmount);
         return result;
     }
 
-    public static Map ccCapture(DispatchContext dctx, Map context) {
+    public static Map<String, Object> ccCapture(DispatchContext dctx, Map<String, ? extends Object> context) {
+        GenericDelegator delegator = dctx.getDelegator();
         GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
         GenericValue authTrans = (GenericValue) context.get("authTrans");
         BigDecimal amount = (BigDecimal) context.get("captureAmount");
+        String paymentGatewayConfigId = (String) context.get("paymentGatewayConfigId");
         String configString = (String) context.get("paymentConfig");
         if (configString == null) {
             configString = "payment.properties";
@@ -176,7 +180,7 @@
 
         // auth ref number
         String refNum = authTrans.getString("referenceNum");
-        Map data = UtilMisc.toMap("ORIGID", refNum);
+        Map<String, String> data = UtilMisc.toMap("ORIGID", refNum);
 
         // tx type (Delayed Capture)
         data.put("TRXTYPE", "D");
@@ -191,10 +195,10 @@
         // amount to capture
         data.put("AMT", amount.toString());
 
-        PFProAPI pn = init(configString, context);
+        PayflowAPI pfp = init(delegator, paymentGatewayConfigId, configString, context);
 
         // get the base params
-        StringBuffer params = makeBaseParams(configString);
+        StringBuffer params = makeBaseParams(delegator, paymentGatewayConfigId, configString);
 
         // parse the context parameters
         params.append("&").append(parseContext(data));
@@ -202,28 +206,27 @@
         // transmit the request
         if (Debug.verboseOn()) Debug.logVerbose("Sending to Verisign: " + params.toString(), module);
         String resp;
-        if (!UtilProperties.propertyValueEqualsIgnoreCase(configString, "payment.verisign.enable_transmit", "false")) {
-            resp = pn.SubmitTransaction(params.toString());
+        if (!comparePaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "enableTransmit", configString, "payment.verisign.enable_transmit",  "false")) {
+            resp = pfp.submitTransaction(params.toString(), pfp.generateRequestId());
         } else {
             resp = "RESULT=0&AUTHCODE=T&PNREF=" + (new Date()).getTime() + "&RESPMSG=Testing";
         }
 
         if (Debug.verboseOn()) Debug.logVerbose("Response from Verisign: " + resp, module);
 
-        // reset for next use
-        pn.DestroyContext();
-
         // check the response
-        Map result = ServiceUtil.returnSuccess();
+        Map<String, Object> result = ServiceUtil.returnSuccess();
         parseCaptureResponse(resp, result);
         result.put("captureAmount", amount);
         return result;
     }
 
-    public static Map ccVoid(DispatchContext dctx, Map context) {
+    public static Map<String, Object> ccVoid(DispatchContext dctx, Map<String, ? extends Object> context) {
+        GenericDelegator delegator = dctx.getDelegator();
         GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
         GenericValue authTrans = (GenericValue) context.get("authTrans");
         BigDecimal amount = (BigDecimal) context.get("releaseAmount");
+        String paymentGatewayConfigId = (String) context.get("paymentGatewayConfigId");
         String configString = (String) context.get("paymentConfig");
         if (configString == null) {
             configString = "payment.properties";
@@ -239,7 +242,7 @@
 
         // auth ref number
         String refNum = authTrans.getString("referenceNum");
-        Map data = UtilMisc.toMap("ORIGID", refNum);
+        Map<String, String> data = UtilMisc.toMap("ORIGID", refNum);
 
         // tx type (Void)
         data.put("TRXTYPE", "V");
@@ -254,10 +257,10 @@
         // amount to capture
         data.put("AMT", amount.toString());
 
-        PFProAPI pn = init(configString, context);
+        PayflowAPI pfp = init(delegator, paymentGatewayConfigId, configString, context);
 
         // get the base params
-        StringBuffer params = makeBaseParams(configString);
+        StringBuffer params = makeBaseParams(delegator, paymentGatewayConfigId, configString);
 
         // parse the context parameters
         params.append("&").append(parseContext(data));
@@ -265,27 +268,26 @@
         // transmit the request
         if (Debug.verboseOn()) Debug.logVerbose("Sending to Verisign: " + params.toString(), module);
         String resp;
-        if (!UtilProperties.propertyValueEqualsIgnoreCase(configString, "payment.verisign.enable_transmit", "false")) {
-            resp = pn.SubmitTransaction(params.toString());
+        if (!comparePaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "enableTransmit", configString, "payment.verisign.enable_transmit",  "false")) {
+            resp = pfp.submitTransaction(params.toString(), pfp.generateRequestId());
         } else {
             resp = "RESULT=0&AUTHCODE=T&PNREF=" + (new Date()).getTime() + "&RESPMSG=Testing";
         }
 
         if (Debug.verboseOn()) Debug.logVerbose("Response from Verisign: " + resp, module);
 
-        // reset for next use
-        pn.DestroyContext();
-
         // check the response
-        Map result = ServiceUtil.returnSuccess();
+        Map<String, Object> result = ServiceUtil.returnSuccess();
         parseVoidResponse(resp, result);
         result.put("releaseAmount", amount);
         return result;
     }
 
-    public static Map ccRefund(DispatchContext dctx, Map context) {
+    public static Map<String, Object> ccRefund(DispatchContext dctx, Map<String, ? extends Object> context) {
+        GenericDelegator delegator = dctx.getDelegator();
         GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
         BigDecimal amount = (BigDecimal) context.get("refundAmount");
+        String paymentGatewayConfigId = (String) context.get("paymentGatewayConfigId");
         String configString = (String) context.get("paymentConfig");
         if (configString == null) {
             configString = "payment.properties";
@@ -293,14 +295,13 @@
 
         GenericValue captureTrans = PaymentGatewayServices.getCaptureTransaction(paymentPref);
 
-
         if (captureTrans == null) {
             return ServiceUtil.returnError("No capture transaction found for the OrderPaymentPreference; cannot refund");
         }
 
         // auth ref number
         String refNum = captureTrans.getString("referenceNum");
-        Map data = UtilMisc.toMap("ORIGID", refNum);
+        Map<String, String> data = UtilMisc.toMap("ORIGID", refNum);
 
         // tx type (Credit)
         data.put("TRXTYPE", "C");
@@ -315,10 +316,10 @@
         // amount to capture
         data.put("AMT", amount.toString());
 
-        PFProAPI pn = init(configString, context);
+        PayflowAPI pfp = init(delegator, paymentGatewayConfigId, configString, context);
 
         // get the base params
-        StringBuffer params = makeBaseParams(configString);
+        StringBuffer params = makeBaseParams(delegator, paymentGatewayConfigId, configString);
 
         // parse the context parameters
         params.append("&").append(parseContext(data));
@@ -326,35 +327,32 @@
         // transmit the request
         if (Debug.verboseOn()) Debug.logVerbose("Sending to Verisign: " + params.toString(), module);
         String resp;
-        if (!UtilProperties.propertyValueEqualsIgnoreCase(configString, "payment.verisign.enable_transmit", "false")) {
-            resp = pn.SubmitTransaction(params.toString());
+        if (!comparePaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "enableTransmit", configString, "payment.verisign.enable_transmit",  "false")) {
+            resp = pfp.submitTransaction(params.toString(), pfp.generateRequestId());
         } else {
             resp = "RESULT=0&AUTHCODE=T&PNREF=" + (new Date()).getTime() + "&RESPMSG=Testing";
         }
 
         if (Debug.verboseOn()) Debug.logVerbose("Response from Verisign: " + resp, module);
 
-        // reset for next use
-        pn.DestroyContext();
-
         // check the response
-        Map result = ServiceUtil.returnSuccess();
+        Map<String, Object> result = ServiceUtil.returnSuccess();
         parseRefundResponse(resp, result);
         result.put("refundAmount", amount);
         return result;
     }
 
-    private static void parseAuthResponse(String resp, Map result, String resource, boolean isReAuth) {
+    private static void parseAuthResponse(GenericDelegator delegator, String paymentGatewayConfigId, String resp, Map<String, Object> result, String resource, boolean isReAuth) {
         Debug.logInfo("Verisign response string: " + resp, module);
-        Map parameters = new HashMap();
-        List params = StringUtil.split(resp, "&");
-        Iterator i = params.iterator();
+        Map<Object, Object> parameters = FastMap.newInstance();
+        List<String> params = StringUtil.split(resp, "&");
+        Iterator<String> i = params.iterator();
 
         while (i.hasNext()) {
             String str = (String) i.next();
 
             if (str.length() > 0) {
-                List kv = StringUtil.split(str, "=");
+                List<String> kv = StringUtil.split(str, "=");
                 Object k = kv.get(0);
                 Object v = kv.get(1);
 
@@ -364,13 +362,13 @@
         }
 
         // txType
-        boolean isSale = !UtilProperties.propertyValueEqualsIgnoreCase(resource, "payment.verisign.preAuth", "Y");
+        boolean isSale = !comparePaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "preAuth", resource, "payment.verisign.preAuth", "Y");
 
         // avs checking - ignore on re-auth
         boolean avsCheckOkay = true;
         String avsCode = null;
         if (!isReAuth) {
-            boolean checkAvs = UtilProperties.propertyValueEqualsIgnoreCase(resource, "payment.verisign.checkAvs", "Y");
+            boolean checkAvs = comparePaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "checkAvs", resource, "payment.verisign.checkAvs", "Y");
             if (checkAvs && !isSale) {
                 String addAvs = (String) parameters.get("AVSADDR");
                 String zipAvs = (String) parameters.get("AVSZIP");
@@ -385,7 +383,7 @@
         boolean cvv2CheckOkay = true;
         String cvvCode = null;
         if (!isReAuth) {
-            boolean checkCvv2 = UtilProperties.propertyValueEqualsIgnoreCase(resource, "payment.verisign.checkCvv2", "Y");
+            boolean checkCvv2 = comparePaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "checkCvv2", resource, "payment.verisign.checkCvv2", "Y");
             if (checkCvv2 && !isSale) {
                 cvvCode = (String) parameters.get("CVV2MATCH");
                 if (cvvCode == null || "N".equals(cvvCode)) {
@@ -433,16 +431,16 @@
         result.put("authMessage", parameters.get("RESPMSG"));
     }
 
-    private static void parseCaptureResponse(String resp, Map result) {
-        Map parameters = new HashMap();
-        List params = StringUtil.split(resp, "&");
-        Iterator i = params.iterator();
+    private static void parseCaptureResponse(String resp, Map<String, Object> result) {
+        Map<Object, Object> parameters = FastMap.newInstance();
+        List<String> params = StringUtil.split(resp, "&");
+        Iterator<String> i = params.iterator();
 
         while (i.hasNext()) {
             String str = (String) i.next();
 
             if (str.length() > 0) {
-                List kv = StringUtil.split(str, "=");
+                List<String> kv = StringUtil.split(str, "=");
                 Object k = kv.get(0);
                 Object v = kv.get(1);
 
@@ -475,16 +473,16 @@
         result.put("captureMessage", parameters.get("RESPMSG"));
     }
 
-    private static void parseVoidResponse(String resp, Map result) {
-        Map parameters = new HashMap();
-        List params = StringUtil.split(resp, "&");
-        Iterator i = params.iterator();
+    private static void parseVoidResponse(String resp, Map<String, Object> result) {
+        Map<Object, Object> parameters = FastMap.newInstance();
+        List<String> params = StringUtil.split(resp, "&");
+        Iterator<String> i = params.iterator();
 
         while (i.hasNext()) {
             String str = (String) i.next();
 
             if (str.length() > 0) {
-                List kv = StringUtil.split(str, "=");
+                List<String> kv = StringUtil.split(str, "=");
                 Object k = kv.get(0);
                 Object v = kv.get(1);
 
@@ -517,16 +515,16 @@
         result.put("releaseMessage", parameters.get("RESPMSG"));
     }
 
-    private static void parseRefundResponse(String resp, Map result) {
-        Map parameters = new HashMap();
-        List params = StringUtil.split(resp, "&");
-        Iterator i = params.iterator();
+    private static void parseRefundResponse(String resp, Map<String, Object> result) {
+        Map<Object, Object> parameters = FastMap.newInstance();
+        List<String> params = StringUtil.split(resp, "&");
+        Iterator<String> i = params.iterator();
 
         while (i.hasNext()) {
             String str = (String) i.next();
 
             if (str.length() > 0) {
-                List kv = StringUtil.split(str, "=");
+                List<String> kv = StringUtil.split(str, "=");
                 Object k = kv.get(0);
                 Object v = kv.get(1);
 
@@ -559,10 +557,10 @@
         result.put("refundMessage", parameters.get("RESPMSG"));
     }
 
-    private static String parseContext(Map context) {
+    private static String parseContext(Map<String, ? extends Object> context) {
         StringBuffer buf = new StringBuffer();
-        Set keySet = context.keySet();
-        Iterator i = keySet.iterator();
+        Set<String> keySet = context.keySet();
+        Iterator<String> i = keySet.iterator();
 
         while (i.hasNext()) {
             String name = (String) i.next();
@@ -591,21 +589,21 @@
         return buf.toString();
     }
 
-    private static StringBuffer makeBaseParams(String resource) {
+    private static StringBuffer makeBaseParams(GenericDelegator delegator, String paymentGatewayConfigId, String resource) {
         StringBuffer buf = new StringBuffer();
 
         try {
             buf.append("PARTNER=");
-            buf.append(UtilProperties.getPropertyValue(resource, "payment.verisign.partner", "VeriSign"));
+            buf.append(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "partner", resource, "payment.verisign.partner", "VeriSign"));
             buf.append("&");
             buf.append("VENDOR=");
-            buf.append(UtilProperties.getPropertyValue(resource, "payment.verisign.vendor", "nobody"));
+            buf.append(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "vendor", resource, "payment.verisign.vendor", "nobody"));
             buf.append("&");
             buf.append("USER=");
-            buf.append(UtilProperties.getPropertyValue(resource, "payment.verisign.user", "nobody"));
+            buf.append(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "userId", resource, "payment.verisign.user", "nobody"));
             buf.append("&");
             buf.append("PWD=");
-            buf.append(UtilProperties.getPropertyValue(resource, "payment.verisign.pwd", "password"));
+            buf.append(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "pwd", resource, "payment.verisign.pwd", "password"));
         } catch (Exception e) {
             Debug.logError(e, module);
             return null;
@@ -613,23 +611,72 @@
         return buf;
     }
 
-    private static PFProAPI init(String resource, Map context) {
-        String certsPath = FlexibleStringExpander.expandString(UtilProperties.getPropertyValue(resource, "payment.verisign.certsPath", "pfcerts"), context);
-        String hostAddress = UtilProperties.getPropertyValue(resource, "payment.verisign.hostAddress", "test-payflow.verisign.com");
-        Integer hostPort = Integer.decode(UtilProperties.getPropertyValue(resource, "payment.verisign.hostPort", "443"));
-        Integer timeout = Integer.decode(UtilProperties.getPropertyValue(resource, "payment.verisign.timeout", "80"));
-        String proxyAddress = UtilProperties.getPropertyValue(resource, "payment.verisign.proxyAddress", "");
-        Integer proxyPort = Integer.decode(UtilProperties.getPropertyValue(resource, "payment.verisign.proxyPort", "80"));
-        String proxyLogon = UtilProperties.getPropertyValue(resource, "payment.verisign.proxyLogon", "");
-        String proxyPassword = UtilProperties.getPropertyValue(resource, "payment.verisign.proxyPassword", "");
-
-        PFProAPI pn = new PFProAPI();
-
-        // Set the certificate path
-        pn.SetCertPath(certsPath);
-        // Call the client.
-        pn.CreateContext(hostAddress, hostPort.intValue(), timeout.intValue(), proxyAddress, proxyPort.intValue(), proxyLogon, proxyPassword);
-        return pn;
+    private static PayflowAPI init(GenericDelegator delegator, String paymentGatewayConfigId, String resource, Map<String, ? extends Object> context) {
+        // No more used
+        // String certsPath = FlexibleStringExpander.expandString(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "certsPath", resource, "payment.verisign.certsPath", "pfcerts"), context);
+        String hostAddress = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "hostAddress", resource, "payment.verisign.hostAddress", "test-payflow.verisign.com");
+        Integer hostPort = Integer.decode(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "hostPort", resource, "payment.verisign.hostPort", "443"));
+        Integer timeout = Integer.decode(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "timeout", resource, "payment.verisign.timeout", "80"));
+        String proxyAddress = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "proxyAddress", resource, "payment.verisign.proxyAddress", "");
+        Integer proxyPort = Integer.decode(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "proxyPort", resource, "payment.verisign.proxyPort", "80"));
+        String proxyLogon = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "proxyLogon", resource, "payment.verisign.proxyLogon", "");
+        String proxyPassword = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "proxyPassword", resource, "payment.verisign.proxyPassword", "");
+        String logFileName = FlexibleStringExpander.expandString(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "logFileName", resource, "payment.verisign.logFileName", ""), context);
+        Integer loggingLevel = Integer.decode(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "loggingLevel", resource, "payment.verisign.loggingLevel", "6"));
+        Integer maxLogFileSize = Integer.decode(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "maxLogFileSize", resource, "payment.verisign.maxLogFileSize", "1000000"));
+        boolean stackTraceOn = "Y".equalsIgnoreCase(getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "stackTraceOn", resource, "payment.verisign.stackTraceOn", "N"));
+        
+        PayflowAPI pfp = new PayflowAPI(hostAddress, hostPort.intValue(), timeout.intValue(), proxyAddress,
+                proxyPort.intValue(), proxyLogon, proxyPassword);
+        SDKProperties.setLogFileName(logFileName);
+        SDKProperties.setLoggingLevel(loggingLevel);
+        SDKProperties.setMaxLogFileSize(maxLogFileSize);
+        SDKProperties.setStackTraceOn(stackTraceOn);
+        return pfp;
+    }
+    
+    private static String getPaymentGatewayConfigValue(GenericDelegator delegator, String paymentGatewayConfigId, String paymentGatewayConfigParameterName,
+                                                       String resource, String parameterName) {
+        String returnValue = "";
+        if (UtilValidate.isNotEmpty(paymentGatewayConfigId)) {
+            try {
+                GenericValue payflowPro = delegator.findOne("PaymentGatewayPayflowPro", UtilMisc.toMap("paymentGatewayConfigId", paymentGatewayConfigId), false);
+                if (UtilValidate.isNotEmpty(payflowPro)) {
+                    Object payflowProField = payflowPro.get(paymentGatewayConfigParameterName);
+                    if (payflowProField != null) {
+                        returnValue = payflowProField.toString().trim();
+                    }
+                }
+            } catch (GenericEntityException e) {
+                Debug.logError(e, module);
+            }
+        } else {
+            String value = UtilProperties.getPropertyValue(resource, parameterName);
+            if (value != null) {
+                returnValue = value.trim();
+            }
+        }
+        return returnValue;
+    }
+    
+    private static String getPaymentGatewayConfigValue(GenericDelegator delegator, String paymentGatewayConfigId, String paymentGatewayConfigParameterName,
+                                                       String resource, String parameterName, String defaultValue) {
+        String returnValue = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, paymentGatewayConfigParameterName, resource, parameterName);
+        if (UtilValidate.isEmpty(returnValue)) {
+            returnValue = defaultValue;
+        }
+        return returnValue;
+    }
+    
+    private static boolean comparePaymentGatewayConfigValue(GenericDelegator delegator, String paymentGatewayConfigId, String paymentGatewayConfigParameterName,
+                                                        String resource, String parameterName, String compareValue) {
+        boolean returnValue = false;
+        
+        String value = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, paymentGatewayConfigParameterName, resource, parameterName, compareValue);
+        if (UtilValidate.isNotEmpty(value)) {
+            returnValue = value.trim().equalsIgnoreCase(compareValue);
+        }
+        return returnValue;
     }
 
 /*