You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2010/12/29 21:05:11 UTC
svn commit: r1053723 - in /ofbiz/trunk/applications/accounting: data/
entitydef/ src/org/ofbiz/accounting/thirdparty/eway/ widget/
Author: jaz
Date: Wed Dec 29 20:05:11 2010
New Revision: 1053723
URL: http://svn.apache.org/viewvc?rev=1053723&view=rev
Log:
added eway payment integration
Added:
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/EwayServices.java
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayConnector.java
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayRequest.java
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayResponse.java
Modified:
ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
ofbiz/trunk/applications/accounting/data/PaymentGatewayConfData.xml
ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml
ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigForms.xml
ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigScreens.xml
Modified: ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml?rev=1053723&r1=1053722&r2=1053723&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml (original)
+++ ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml Wed Dec 29 20:05:11 2010
@@ -821,6 +821,10 @@ under the License.
<CustomMethod customMethodId="PAYPAL_RELEASE_PFP" customMethodTypeId="PAYPAL_RELEASE" customMethodName="payflowPayPalVoid" description="Payflow PayPal Order release"/>
<CustomMethod customMethodId="PAYPAL_RELEASE" customMethodTypeId="PAYPAL_RELEASE" customMethodName="payPalVoid" description="PayPal Order Release"/>
+ <CustomMethod customMethodId="CC_CHARGE_EWAY" customMethodTypeId="CC_AUTH" customMethodName="ewayCharge" description="eWay CC Charge"/>
+ <CustomMethod customMethodId="CC_REFUND_EWAY" customMethodTypeId="CC_REFUND" customMethodName="ewayRefund" description="eWay CC Refund"/>
+ <CustomMethod customMethodId="CC_RELEASE_EWAY" customMethodTypeId="CC_RELEASE" customMethodName="ewayRelease" description="eWay CC Release"/>
+
<CustomMethod customMethodId="SECURE_AUTH_OFBIZ" customMethodTypeId="CC_AUTH" customMethodName="ofbScAuthorize" description="SecurePay payment authorize"/>
<CustomMethod customMethodId="SECURE_CAPTURE_OFBIZ" customMethodTypeId="CC_CAPTURE" customMethodName="ofbScCapture" description="SecurePay payment capture"/>
<CustomMethod customMethodId="SECURE_REFUND_OFBIZ" customMethodTypeId="CC_REFUND" customMethodName="ofbScRefund" description="SecurePay payment refund"/>
Modified: ofbiz/trunk/applications/accounting/data/PaymentGatewayConfData.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/PaymentGatewayConfData.xml?rev=1053723&r1=1053722&r2=1053723&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/data/PaymentGatewayConfData.xml (original)
+++ ofbiz/trunk/applications/accounting/data/PaymentGatewayConfData.xml Wed Dec 29 20:05:11 2010
@@ -32,6 +32,10 @@ under the License.
<PaymentGatewayConfig paymentGatewayConfigId="CYBERSOURCE_CONFIG" paymentGatewayConfigTypeId="CYBERSOURCE" description="CyberSource Config"/>
<PaymentGatewayCyberSource paymentGatewayConfigId="CYBERSOURCE_CONFIG" merchantId="[MerchantID]" apiVersion="1.43" production="false" keysDir="${sys:getProperty('ofbiz.home')}/applications/accounting/icskeys" keysFile="merchantID.p12" logEnabled="true" logDir="${sys:getProperty('ofbiz.home')}/runtime/logs" logFile="cybersource.log" logSize="10" merchantDescr="Some Nice Web Store" merchantContact="" autoBill="false" enableDav="N" fraudScore="N" ignoreAvs="false" disableBillAvs="Y" avsDeclineCodes=""/>
+ <PaymentGatewayConfigType paymentGatewayConfigTypeId="EWAY" hasTable="N" description="eWay Payment Gateway"/>
+ <PaymentGatewayConfig paymentGatewayConfigId="EWAY_CONFIG" paymentGatewayConfigTypeId="EWAY" description="eWay Config"/>
+ <PaymentGatewayEway paymentGatewayConfigId="EWAY_CONFIG" customerId="87654321" refundPwd="" testMode="Y" enableBeagle="N" enableCvn="N"/>
+
<PaymentGatewayConfigType paymentGatewayConfigTypeId="PAYFLOWPRO" hasTable="N" description="Payflow Pro Payment Gateway"/>
<PaymentGatewayConfig paymentGatewayConfigId="PAYFLOWPRO_CONFIG" paymentGatewayConfigTypeId="PAYFLOWPRO" description="Payflow Pro Config"/>
<PaymentGatewayPayflowPro paymentGatewayConfigId="PAYFLOWPRO_CONFIG" certsPath="${sys:getProperty('ofbiz.home')}/applications/accounting/pfcerts" hostAddress="pilot-payflowpro.paypal.com" hostPort="443" timeout="80" proxyAddress="" proxyPort="80" proxyLogon="" proxyPassword=""
Modified: ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml?rev=1053723&r1=1053722&r2=1053723&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml Wed Dec 29 20:05:11 2010
@@ -3271,6 +3271,20 @@ under the License.
<key-map field-name="paymentGatewayConfigId"/>
</relation>
</entity>
+ <entity entity-name="PaymentGatewayEway"
+ package-name="org.ofbiz.accounting.payment"
+ title="eWay Payment Gateway Configuration">
+ <field name="paymentGatewayConfigId" type="id-ne"></field>
+ <field name="customerId" type="value"/>
+ <field name="refundPwd" type="value" encrypt="true"/>
+ <field name="testMode" type="short-varchar"/>
+ <field name="enableCvn" type="short-varchar"/>
+ <field name="enableBeagle" type="short-varchar"/>
+ <prim-key field="paymentGatewayConfigId"/>
+ <relation type="one" fk-name="PGEW_PGC" rel-entity-name="PaymentGatewayConfig">
+ <key-map field-name="paymentGatewayConfigId"/>
+ </relation>
+ </entity>
<entity entity-name="PaymentGatewayCyberSource"
package-name="org.ofbiz.accounting.payment"
title="CyberSource Payment Gateway Configuration">
Added: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/EwayServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/EwayServices.java?rev=1053723&view=auto
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/EwayServices.java (added)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/EwayServices.java Wed Dec 29 20:05:11 2010
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.accounting.thirdparty.eway;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+import org.ofbiz.accounting.payment.PaymentGatewayServices;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilFormatOut;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.ServiceUtil;
+
+public class EwayServices {
+
+ public static final String module = EwayServices.class.getName();
+
+ // eway charge (auth w/ capture)
+ public static Map<String, Object> ewayCharge(DispatchContext dctx, Map<String, Object> context) {
+ String orderId = (String) context.get("orderId");
+ String cvv2 = (String) context.get("cardSecurityCode");
+ String custIp = (String) context.get("customerIpAddress");
+ BigDecimal processAmount = (BigDecimal) context.get("processAmount");
+ GenericValue cc = (GenericValue) context.get("creditCard");
+ GenericValue address = (GenericValue) context.get("billingAddress");
+ GenericValue party = (GenericValue) context.get("billToParty");
+
+ GatewayRequest req = initRequest(dctx, context, false);
+ req.setCustomerInvoiceRef(orderId);
+ req.setTotalAmount(processAmount);
+ req.setCustomerIPAddress(custIp);
+
+ // bill to party info
+ req.setCustomerFirstName(UtilFormatOut.checkNull(party.getString("firstName")));
+ req.setCustomerLastName(UtilFormatOut.checkNull(party.getString("lastName")));
+
+ // card info
+ String ccName = cc.getString("firstNameOnCard") + " " + cc.getString("lastNameOnCard");
+ req.setCardHoldersName(ccName);
+ req.setCardNumber(cc.getString("cardNumber"));
+ if (cc.get("expireDate") != null) {
+ String[] exp = cc.getString("expireDate").split("\\/");
+ req.setCardExpiryMonth(exp[0]);
+ req.setCardExpiryYear(exp[1]);
+ }
+
+ // security code
+ if (UtilValidate.isNotEmpty(cvv2)) {
+ req.setCVN(cvv2);
+ }
+
+ // billing address
+ if (address != null) {
+ String street = address.getString("address1") + ((UtilValidate.isNotEmpty(address.getString("address2"))) ? " " + address.getString("address2") : "");
+ req.setCustomerAddress(street);
+ req.setCustomerPostcode(address.getString("postalCode"));
+ req.setCustomerBillingCountry(address.getString("countryGeoId"));
+ }
+
+ // send the request
+ GatewayConnector con = new GatewayConnector();
+ GatewayResponse reply;
+ try {
+ reply = con.sendRequest(req);
+ } catch (Exception e) {
+ return ServiceUtil.returnError(e.getMessage());
+ }
+
+ // process the result
+ Map<String, Object> result = ServiceUtil.returnSuccess();
+ Boolean authResult = reply.getTrxnStatus();
+
+ // auth fields
+ result.put("authResult", new Boolean(authResult.booleanValue()));
+ result.put("authMessage", reply.getTrxnError());
+ result.put("authCode", reply.getAuthCode());
+ result.put("authRefNum", reply.getTrxnNumber());
+ result.put("scoreCode", Double.valueOf(reply.getBeagleScore()).toString());
+ result.put("processAmount", reply.getTransactionAmount());
+
+ // capture fields
+ result.put("captureResult", result.get("authResult"));
+ result.put("captureMessage", result.get("authMessage"));
+ result.put("captureRefNum", result.get("authRefNum"));
+
+ return result;
+ }
+
+ // eway refund
+ public static Map<String, Object> ewayRefund(DispatchContext dctx, Map<String, Object> context) {
+ Delegator delegator = dctx.getDelegator();
+ GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
+ BigDecimal refundAmount = (BigDecimal) context.get("refundAmount");
+
+ // original charge transaction
+ GenericValue chargeTrans = PaymentGatewayServices.getCaptureTransaction(paymentPref);
+ if (chargeTrans == null) {
+ return ServiceUtil.returnError("No charge transaction found for the OrderPaymentPreference; cannot refund");
+ }
+
+ // credit card used for transaction
+ GenericValue cc = null;
+ try {
+ cc = delegator.getRelatedOne("CreditCard", paymentPref);
+ } catch (GenericEntityException e) {
+ Debug.logError(e, module);
+ return ServiceUtil.returnError("Unable to obtain credit card information from payment preference; cannot refund");
+ }
+
+ // orig ref number
+ String refNum = chargeTrans.getString("referenceNum");
+ String orderId = paymentPref.getString("orderId");
+
+ GatewayRequest req = initRequest(dctx, context, true);
+ req.setCustomerInvoiceRef(orderId);
+ req.setTotalAmount(refundAmount);
+ req.setTrxnNumber(refNum);
+
+ // set the card expire date
+ if (cc.get("expireDate") != null) {
+ String[] exp = cc.getString("expireDate").split("\\/");
+ req.setCardExpiryMonth(exp[0]);
+ req.setCardExpiryYear(exp[1]);
+ }
+
+ // send the request
+ GatewayConnector con = new GatewayConnector();
+ GatewayResponse reply;
+ try {
+ reply = con.sendRequest(req);
+ } catch (Exception e) {
+ return ServiceUtil.returnError(e.getMessage());
+ }
+
+ // process the result
+ Map<String, Object> result = ServiceUtil.returnSuccess();
+ Boolean refundResult = reply.getTrxnStatus();
+ result.put("refundResult", new Boolean(refundResult.booleanValue()));
+ result.put("refundMessage", reply.getTrxnError());
+ result.put("refundCode", reply.getAuthCode());
+ result.put("refundRefNum", reply.getTrxnNumber());
+ result.put("refundAmount", reply.getTransactionAmount());
+
+ return result;
+ }
+
+ // eway release (does a refund)
+ public static Map<String, Object> ewayRelease(DispatchContext dctx, Map<String, Object> context) {
+ Delegator delegator = dctx.getDelegator();
+ GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
+ BigDecimal releaseAmount = (BigDecimal) context.get("releaseAmount");
+
+ // original charge transaction
+ GenericValue chargeTrans = (GenericValue) context.get("authTrans");
+ if (chargeTrans == null) {
+ chargeTrans = PaymentGatewayServices.getAuthTransaction(paymentPref);
+ }
+
+ if (chargeTrans == null) {
+ return ServiceUtil.returnError("No charge transaction found for the OrderPaymentPreference; cannot refund (release)");
+ }
+
+ // credit card used for transaction
+ GenericValue cc = null;
+ try {
+ cc = delegator.getRelatedOne("CreditCard", paymentPref);
+ } catch (GenericEntityException e) {
+ Debug.logError(e, module);
+ return ServiceUtil.returnError("Unable to obtain credit card information from payment preference; cannot refund");
+ }
+
+ // orig ref number
+ String refNum = chargeTrans.getString("referenceNum");
+ String orderId = paymentPref.getString("orderId");
+
+ GatewayRequest req = initRequest(dctx, context, true);
+ req.setCustomerInvoiceRef(orderId);
+ req.setTotalAmount(releaseAmount);
+ req.setTrxnNumber(refNum);
+
+ // set the card expire date
+ if (cc.get("expireDate") != null) {
+ String[] exp = cc.getString("expireDate").split("\\/");
+ req.setCardExpiryMonth(exp[0]);
+ req.setCardExpiryYear(exp[1]);
+ }
+
+ // send the request
+ GatewayConnector con = new GatewayConnector();
+ GatewayResponse reply;
+ try {
+ reply = con.sendRequest(req);
+ } catch (Exception e) {
+ return ServiceUtil.returnError(e.getMessage());
+ }
+
+ // process the result
+ Map<String, Object> result = ServiceUtil.returnSuccess();
+ Boolean refundResult = reply.getTrxnStatus();
+ result.put("releaseResult", new Boolean(refundResult.booleanValue()));
+ result.put("releaseMessage", reply.getTrxnError());
+ result.put("releaseCode", reply.getAuthCode());
+ result.put("releaseRefNum", reply.getTrxnNumber());
+ result.put("releaseAmount", reply.getTransactionAmount());
+
+ return result;
+ }
+
+
+ private static GatewayRequest initRequest(DispatchContext dctx, Map<String, Object> context, boolean refund) {
+ String pgcId = (String) context.get("paymentGatewayConfigId");
+ String cfgStr = (String) context.get("paymentConfig");
+ Delegator delegator = dctx.getDelegator();
+
+ String customerId = getPaymentGatewayConfigValue(delegator, pgcId, "customerId", cfgStr, "payment.eway.customerId");
+ String refundPwd = getPaymentGatewayConfigValue(delegator, pgcId, "refundPwd", cfgStr, "payment.eway.refundPwd");
+ Boolean testMode = "Y".equalsIgnoreCase(getPaymentGatewayConfigValue(delegator, pgcId, "testMode", cfgStr, "payment.eway.testMode"));
+ Boolean beagle = "Y".equalsIgnoreCase(getPaymentGatewayConfigValue(delegator, pgcId, "enableBeagle", cfgStr, "payment.eway.enableBeagle"));
+ Boolean cvn = "Y".equalsIgnoreCase(getPaymentGatewayConfigValue(delegator, pgcId, "enableCvn", cfgStr, "payment.eway.enableCvn"));
+
+ // the request mode
+ int requestMode = refund ? GatewayRequest.REQUEST_METHOD_REFUND : beagle ?
+ GatewayRequest.REQUEST_METHOD_BEAGLE : cvn ? GatewayRequest.REQUEST_METHOD_CVN : 0;
+
+ // create the request object
+ GatewayRequest req = new GatewayRequest(requestMode);
+ req.setTestMode(testMode);
+ req.setCustomerID(customerId);
+ if (refund) {
+ req.setRefundPassword(refundPwd);
+ }
+
+ return req;
+ }
+
+ private static String getPaymentGatewayConfigValue(Delegator delegator, String cfgId, String cfgParamName,
+ String resource, String resParamName) {
+ String returnValue = "";
+ if (UtilValidate.isNotEmpty(cfgId)) {
+ try {
+ GenericValue gv = delegator.findOne("PaymentGatewayEway", true, "paymentGatewayConfigId", cfgId);
+ if (UtilValidate.isNotEmpty(gv)) {
+ Object field = gv.get(cfgParamName);
+ if (field != null) {
+ returnValue = field.toString().trim();
+ }
+ }
+ } catch (GenericEntityException e) {
+ Debug.logError(e, module);
+ }
+ } else {
+ String value = UtilProperties.getPropertyValue(resource, resParamName);
+ if (value != null) {
+ returnValue = value.trim();
+ }
+ }
+ return returnValue;
+ }
+}
Added: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayConnector.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayConnector.java?rev=1053723&view=auto
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayConnector.java (added)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayConnector.java Wed Dec 29 20:05:11 2010
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.accounting.thirdparty.eway;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.ofbiz.base.util.Debug;
+
+/**
+ * Handles connections to the eWay servers.
+ *
+ * Based on public domain sample code provided by eWay.com.au
+ */
+public class GatewayConnector {
+
+ private static final String module = GatewayConnector.class.getName();
+
+ private int timeout = 0;
+
+ public GatewayConnector(int timeout) {
+ this.timeout = timeout;
+ }
+
+ public GatewayConnector() {
+ this(60);
+ }
+
+ /**
+ * Get the timeout value set in the corresponding setter.
+ * @return timeout value in seconds, 0 for infinite
+ */
+ public int getTimeout() {
+ return timeout;
+ }
+
+ /**
+ * Set the timout value. Note that setting the timeout for an HttpURLConnection
+ * is possible only since Java 1.5. This method has no effect on earlier
+ * versions.
+ * @param time timeout value in seconds, 0 for infinite
+ */
+ public void setTimeout(int time) {
+ timeout = time;
+ }
+
+ /**
+ * Send a request to the payment gateway and get the response. This is a
+ * blocking method: when it returns the response object is filled in with
+ * the parameters from the gateway.
+ * @param request the request object, can be any of the 3 supported payment
+ * methods. Its data have to be filled in by its setter methods before
+ * calling sendRequest().
+ * @return the response object, containing the gateway's response to the
+ * request
+ * @throws Exception in case of networking and xml parsing errors
+ */
+ public GatewayResponse sendRequest(GatewayRequest request) throws Exception {
+
+ // determine the gateway url to be used, based on the request type
+ String serverurl = request.getUrl();
+
+ GatewayResponse response = null;
+ InputStream in = null;
+ HttpURLConnection connection = null;
+ try {
+ // connect to the gateway
+ URL u = new URL(serverurl);
+ connection = (HttpURLConnection)(u.openConnection());
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ connection.setRequestMethod("POST");
+ connection.setConnectTimeout(timeout*1000);
+
+ OutputStream out = connection.getOutputStream();
+ Writer wout = new OutputStreamWriter(out);
+ wout.write(request.toXml());
+ wout.flush();
+ wout.close();
+
+ in = connection.getInputStream();
+ response = new GatewayResponse(in, request);
+ return response;
+ }
+ catch (Exception e) {
+ // rethrow exception so that the caller learns what went wrong
+ Debug.logError(e, e.getMessage(), module);
+ throw e;
+ }
+ finally {
+ // close resources
+ if (in != null) in.close();
+ if (connection != null) connection.disconnect();
+ }
+ }
+}
\ No newline at end of file
Added: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayRequest.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayRequest.java?rev=1053723&view=auto
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayRequest.java (added)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayRequest.java Wed Dec 29 20:05:11 2010
@@ -0,0 +1,414 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.accounting.thirdparty.eway;
+
+import java.math.BigDecimal;
+
+import org.ofbiz.base.util.Debug;
+
+/**
+ * A class representing a payment request. It holds the fields of the request,
+ * provides setters and getters to manipulate them. It also holds information
+ * about the type of the request: the request can be of Real-time, CVN, and
+ * Beagle type, or the combination of the latter two. You set the request type
+ * in the constructor of the object.
+ *
+ * Based on public domain sample code provided by eWay.com.au
+ */
+public class GatewayRequest {
+
+ private static final String module = GatewayRequest.class.getName();
+
+ // request urls
+ public static final String REQUEST_URL_REFUND_TEST = "";
+ public static final String REQUEST_URL_REFUND = "https://www.eway.com.au/gateway/xmlpaymentrefund.asp";
+
+ public static final String REQUEST_URL_BEAGLE_TEST = "https://www.eway.com.au/gateway_cvn/xmltest/testpage.asp";
+ public static final String REQUEST_URL_BEAGLE = "https://www.eway.com.au/gateway_cvn/xmlbeagle.asp";
+
+ public static final String REQUEST_URL_CVN_TEST = "https://www.eway.com.au/gateway_cvn/xmltest/testpage.asp";
+ public static final String REQUEST_URL_CVN = "https://www.eway.com.au/gateway_cvn/xmlpayment.asp";
+
+ public static final String REQUEST_URL_RT_TEST = "https://www.eway.com.au/gateway/xmltest/testpage.asp";
+ public static final String REQUEST_URL_RT = "https://www.eway.com.au/gateway/xmlpayment.asp";
+
+ /**
+ * Constant value to be used with the CVN payment method
+ */
+ public static final int REQUEST_METHOD_CVN = 1;
+
+ /**
+ * Constant value to be used with the Beagle (GeoIP) payment method
+ */
+ public static final int REQUEST_METHOD_BEAGLE = 2;
+
+ /**
+ * Constant value to be used with the Refund method
+ */
+ public static final int REQUEST_METHOD_REFUND = 4;
+
+ /**
+ * The request method used in the transaction, set in the constructor.
+ * This value is the boolean
+ * combination of the values REQUEST_METHOD_CVN and REQUEST_METHOD_BEAGLE.
+ * Defaults to 0, meaning that Real-time payment method is used.
+ */
+
+ private BigDecimal txTotalAmount = BigDecimal.ZERO;
+ private boolean isTestMode = false;
+ private int requestMethod = 0;
+
+ private String txCustomerID = "";
+ private String txCardHoldersName = "";
+ private String txCardNumber = "";
+ private String txCardExpiryMonth = "";
+ private String txCardExpiryYear = "";
+ private String txTrxnNumber = "";
+ private String txCustomerFirstName = "";
+ private String txCustomerLastName = "";
+ private String txCustomerEmailAddress = "";
+ private String txCustomerAddress = "";
+ private String txCustomerPostcode = "";
+ private String txCustomerInvoiceRef = "";
+ private String txCustomerInvoiceDescription = "";
+ private String txCVN = "";
+ private String txOption1 = "";
+ private String txOption2 = "";
+ private String txOption3 = "";
+ private String txCustomerIPAddress = "";
+ private String txCustomerBillingCountry = "";
+ private String txRefundPassword = "";
+
+
+ /**
+ * Default constructor to be used with the Real-Time payment method. The
+ * same as calling <code>GatewayRequest(0)</code>;
+ */
+ public GatewayRequest() {
+ requestMethod = 0;
+ }
+
+ /**
+ * Constructor to be used with the CVN and Beagle payment methods.
+ * @param method Logical combination of the REQUEST_METHOD_CVN and
+ * REQUEST_METHOD_BEAGLE constants.
+ */
+ public GatewayRequest(int method) {
+ requestMethod = method;
+ }
+
+ /**
+ * Gets the request method given when constructing the object.
+ * @return the request method as a logical combination of the
+ * REQUEST_METHOD_CVN and REQUEST_METHOD_BEAGLE constants.
+ */
+ public int getRequestMethod() {
+ return requestMethod;
+ }
+
+ /**
+ * Gets the URL for the configured request
+ */
+ public String getUrl() {
+ if ((requestMethod & REQUEST_METHOD_REFUND) != 0) {
+ if (isTestMode()) {
+ return null;
+ } else {
+ return REQUEST_URL_REFUND;
+ }
+ } else if ((requestMethod & REQUEST_METHOD_BEAGLE) != 0) {
+ if (isTestMode()) {
+ return REQUEST_URL_BEAGLE_TEST;
+ } else {
+ return REQUEST_URL_BEAGLE;
+ }
+ } else if ((requestMethod & REQUEST_METHOD_CVN) != 0) {
+ if (isTestMode()) {
+ return REQUEST_URL_CVN_TEST;
+ } else {
+ return REQUEST_URL_CVN;
+ }
+ } else {
+ if (isTestMode()) {
+ return REQUEST_URL_RT_TEST;
+ } else {
+ return REQUEST_URL_RT;
+ }
+ }
+ }
+
+ /*
+ * Getters and setters follow for each defined field of the request.
+ */
+
+ public String getCustomerID() {
+ return txCustomerID;
+ }
+
+ public void setCustomerID(String value) {
+ txCustomerID = value;
+ }
+
+ public String getRefundPassword() {
+ return txRefundPassword;
+ }
+
+ public void setRefundPassword(String value) {
+ txRefundPassword = value;
+ }
+
+ public BigDecimal getTotalAmount() {
+ return txTotalAmount;
+ }
+
+ public void setTotalAmount(BigDecimal value) {
+ txTotalAmount = value;
+ }
+
+ public String getCardHoldersName() {
+ return txCardHoldersName;
+ }
+
+ public void setCardHoldersName(String value) {
+ txCardHoldersName = value;
+ }
+
+ public String getCardNumber() {
+ return txCardNumber;
+ }
+
+ public void setCardNumber(String value) {
+ txCardNumber = value;
+ }
+
+ public String getCardExpiryMonth() {
+ return txCardExpiryMonth;
+ }
+
+ public void setCardExpiryMonth(String value) {
+ txCardExpiryMonth = value;
+ }
+
+ public String getCardExpiryYear() {
+ return txCardExpiryYear;
+ }
+
+ public void setCardExpiryYear(String value) {
+ txCardExpiryYear = value;
+ }
+
+ public String getTrxnNumber() {
+ return txTrxnNumber;
+ }
+
+ public void setTrxnNumber(String value) {
+ txTrxnNumber = value;
+ }
+
+ public String getCustomerFirstName() {
+ return txCustomerFirstName;
+ }
+
+ public void setCustomerFirstName(String value) {
+ txCustomerFirstName = value;
+ }
+
+ public String getCustomerLastName() {
+ return txCustomerLastName;
+ }
+
+ public void setCustomerLastName(String value) {
+ txCustomerLastName = value;
+ }
+
+ public String getCustomerEmailAddress() {
+ return txCustomerEmailAddress;
+ }
+
+ public void setCustomerEmailAddress(String value) {
+ txCustomerEmailAddress = value;
+ }
+
+ public String getCustomerAddress() {
+ return txCustomerAddress;
+ }
+
+ public void setCustomerAddress(String value) {
+ txCustomerAddress = value;
+ }
+
+ public String getCustomerPostcode() {
+ return txCustomerPostcode;
+ }
+
+ public void setCustomerPostcode(String value) {
+ txCustomerPostcode = value;
+ }
+
+ public String getCustomerInvoiceRef() {
+ return txCustomerInvoiceRef;
+ }
+
+ public void setCustomerInvoiceRef(String value) {
+ txCustomerInvoiceRef = value;
+ }
+
+ public String getCustomerInvoiceDescription() {
+ return txCustomerInvoiceDescription;
+ }
+
+ public void setCustomerInvoiceDescription(String value) {
+ txCustomerInvoiceDescription = value;
+ }
+
+ public String getCVN() {
+ return txCVN;
+ }
+
+ public void setCVN(String value) {
+ txCVN = value;
+ }
+
+ public String getOption1() {
+ return txOption1;
+ }
+
+ public void setOption1(String value) {
+ txOption1 = value;
+ }
+
+ public String getOption2() {
+ return txOption2;
+ }
+
+ public void setOption2(String value) {
+ txOption2 = value;
+ }
+
+ public String getOption3() {
+ return txOption3;
+ }
+
+ public void setOption3(String value) {
+ txOption3 = value;
+ }
+
+ public String getCustomerIPAddress() {
+ return txCustomerIPAddress;
+ }
+
+ public void setCustomerIPAddress(String value) {
+ txCustomerIPAddress = value;
+ }
+
+ public String getCustomerBillingCountry() {
+ return txCustomerBillingCountry;
+ }
+
+ public void setCustomerBillingCountry(String value) {
+ txCustomerBillingCountry = value;
+ }
+
+ public boolean isTestMode() {
+ return isTestMode;
+ }
+
+ public void setTestMode(boolean b) {
+ isTestMode = b;
+ }
+
+ /**
+ * Gives the xml representation of this object. This xml will be sent to
+ * the gateway. This method is public only for debugging purposes, you
+ * might wish to examine the xml content. The special fields of the CVN
+ * and Beagle requests are added only if the request belongs to the CVN or
+ * Beagle types, respectively.
+ * @return The GatewayRequest object as an xml string.
+ */
+ public String toXml() {
+ // We don't really need the overhead of creating an XML DOM object
+ // just to concatenate a String together.
+
+ Integer totalInt = txTotalAmount.multiply(new BigDecimal(100)).intValue();
+
+ StringBuffer xml = new StringBuffer("<ewaygateway>");
+ xml.append(createNode("ewayCustomerID", txCustomerID));
+ xml.append(createNode("ewayTotalAmount", "" + totalInt));
+ xml.append(createNode("ewayCustomerInvoiceRef", txCustomerInvoiceRef));
+ xml.append(createNode("ewayCardExpiryMonth", txCardExpiryMonth));
+ xml.append(createNode("ewayCardExpiryYear", txCardExpiryYear));
+
+ // all charge methods (not refund)
+ if (requestMethod != REQUEST_METHOD_REFUND) {
+ xml.append(createNode("ewayCardHoldersName", txCardHoldersName));
+ xml.append(createNode("ewayCardNumber", txCardNumber));
+ xml.append(createNode("ewayTrxnNumber", txTrxnNumber));
+ xml.append(createNode("ewayCustomerInvoiceDescription", txCustomerInvoiceDescription));
+ xml.append(createNode("ewayCustomerFirstName", txCustomerFirstName));
+ xml.append(createNode("ewayCustomerLastName", txCustomerLastName));
+ xml.append(createNode("ewayCustomerEmail", txCustomerEmailAddress));
+ xml.append(createNode("ewayCustomerAddress", txCustomerAddress));
+ xml.append(createNode("ewayCustomerPostcode", txCustomerPostcode));
+ }
+
+ // fill in also CVN data if the request is of CVN type
+ if (requestMethod == REQUEST_METHOD_CVN || requestMethod == REQUEST_METHOD_BEAGLE) {
+ xml.append(createNode("ewayCVN", txCVN));
+ }
+
+ xml.append(createNode("ewayOption1", txOption1));
+ xml.append(createNode("ewayOption2", txOption2));
+ xml.append(createNode("ewayOption3", txOption3));
+
+ // fill in also Beagle data if the request is of Beagle type
+ if (requestMethod == REQUEST_METHOD_BEAGLE) {
+ xml.append(createNode("ewayCustomerIPAddress", txCustomerIPAddress));
+ xml.append(createNode("ewayCustomerBillingCountry",
+ txCustomerBillingCountry));
+ }
+
+ // fill in the refund password if REFUND type
+ if (requestMethod == REQUEST_METHOD_REFUND) {
+ xml.append(createNode("ewayOriginalTrxnNumber", txTrxnNumber));
+ xml.append(createNode("ewayRefundPassword", txRefundPassword));
+ }
+
+ xml.append("</ewaygateway>");
+
+ // log the request for test mode
+ if (isTestMode()) {
+ Debug.logInfo("[eWay Request] : " + xml.toString(), module);
+ }
+
+ return xml.toString();
+ }
+
+ /**
+ * Helper method to build an XML node.
+ *
+ * @param nodeName
+ * The name of the node being created.
+ * @param nodeValue
+ * The value of the node being created.
+ * @return An XML node as a String in <nodName>nodeValue</nodeName> format
+ */
+ private String createNode(String nodeName, String nodeValue) {
+ return "<" + nodeName + ">" + nodeValue + "</" + nodeName + ">";
+ }
+}
Added: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayResponse.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayResponse.java?rev=1053723&view=auto
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayResponse.java (added)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/eway/GatewayResponse.java Wed Dec 29 20:05:11 2010
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.accounting.thirdparty.eway;
+
+import java.io.InputStream;
+import java.math.BigDecimal;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.ofbiz.base.util.Debug;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * A class representing the payment gateway's response to a request. It holds
+ * fields of the response which are filled in when the response arrives and
+ * available through getter methods. This response class supports all 3 payment
+ * methods.
+ *
+ * Based on public domain sample code provided by eWay.com.au
+ */
+public class GatewayResponse {
+
+ private static final String module = GatewayResponse.class.getName();
+
+ // private field definitions, values are set to default
+
+ private double txBeagleScore = -1;
+ private int txReturnAmount = 0;
+
+ private boolean txTrxnStatus = false;
+
+ private String txTrxnNumber = "";
+ private String txTrxnReference = "";
+ private String txTrxnOption1 = "";
+ private String txTrxnOption2 = "";
+ private String txTrxnOption3 = "";
+ private String txAuthCode = "";
+ private String txTrxnError = "";
+
+ // getter methods for the response fields
+
+ public String getTrxnNumber() {
+ return txTrxnNumber;
+ }
+
+ public String getTrxnReference() {
+ return txTrxnReference;
+ }
+
+ public String getTrxnOption1() {
+ return txTrxnOption1;
+ }
+
+ public String getTrxnOption2() {
+ return txTrxnOption2;
+ }
+
+ public String getTrxnOption3() {
+ return txTrxnOption3;
+ }
+
+ public String getAuthCode() {
+ return txAuthCode;
+ }
+
+ public String getTrxnError() {
+ return txTrxnError;
+ }
+
+ public int getReturnAmount() {
+ return txReturnAmount;
+ }
+
+ public BigDecimal getTransactionAmount() {
+ BigDecimal amt = new BigDecimal(getReturnAmount());
+ amt = amt.divide(new BigDecimal(100));
+ return amt.setScale(2, BigDecimal.ROUND_HALF_UP);
+ }
+
+ public boolean getTrxnStatus() {
+ return txTrxnStatus;
+ }
+
+ /**
+ * Gets the beagle score. Defaults to -1 in case of non-Beagle payment
+ * methods or if the response does not contain this field.
+ *
+ * @return The beagle score or -1 if it was not defined in the response
+ */
+ public double getBeagleScore() {
+ return txBeagleScore;
+ }
+
+ /**
+ * Creates the GatewayResponse object by parsing an xml from a stream. Fills
+ * in the fields of the object that are available through getters after this
+ * method returns.
+ *
+ * @param xmlstream
+ * the stream to parse the response from
+ * @throws Exception
+ * if the xml contains a root element with a bad name or an
+ * unknown element, or if the xml is badly formatted
+ */
+ public GatewayResponse(InputStream xmlstream, GatewayRequest req) throws Exception {
+
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory
+ .newInstance();
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ Document doc = builder.parse(xmlstream);
+
+ // get the root node
+ Node rootnode = doc.getDocumentElement();
+ String root = rootnode.getNodeName();
+
+ if (root != "ewayResponse") {
+ throw new Exception("Bad root element in response: " + root);
+ }
+
+ // get all elements
+ NodeList list = doc.getElementsByTagName("*");
+ for (int i = 0; i < list.getLength(); i++) {
+ Node node = list.item(i);
+ String name = node.getNodeName();
+ if (name == "ewayResponse")
+ continue;
+ Text textnode = (Text) node.getFirstChild();
+ String value = "";
+ if (textnode != null)
+ value = textnode.getNodeValue();
+
+ if (name == "ewayTrxnError")
+ txTrxnError = value;
+ else if (name == "ewayTrxnStatus") {
+ if (value.toLowerCase().trim().equals("true")) {
+ txTrxnStatus = true;
+ }
+ }
+ else if (name == "ewayTrxnNumber")
+ txTrxnNumber = value;
+ else if (name == "ewayTrxnOption1")
+ txTrxnOption1 = value;
+ else if (name == "ewayTrxnOption2")
+ txTrxnOption2 = value;
+ else if (name == "ewayTrxnOption3")
+ txTrxnOption3 = value;
+ else if (name == "ewayReturnAmount") {
+ if (!value.equals("")) {
+ txReturnAmount = Integer.parseInt(value);
+ }
+ }
+ else if (name == "ewayAuthCode")
+ txAuthCode = value;
+ else if (name == "ewayTrxnReference")
+ txTrxnReference = value;
+ else if (name == "ewayBeagleScore") {
+ if (!value.equals("")) {
+ txBeagleScore = Double.parseDouble(value);
+ }
+ }
+ else {
+ throw new Exception("Unknown field in response: " + name);
+ }
+ }
+
+ if (req.isTestMode()) {
+ Debug.logInfo("[eWay Reply]\n" + this.toString(), module);
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer buf = new StringBuffer();
+ buf.append("<ewayResponse>").append("\n");
+ buf.append("\t<ewayTrxnError>").append(txTrxnError).append("</ewayTrxnError>\n");
+ buf.append("\t<ewayTrxnStatus>").append(txTrxnStatus).append("</ewayTrxnStatus>\n");
+ buf.append("\t<ewayTrxnNumber>").append(txTrxnNumber).append("</ewayTrxnNumber>\n");
+ buf.append("\t<ewayTrxnOption1>").append(txTrxnOption1).append("</ewayTrxnOption1>\n");
+ buf.append("\t<ewayTrxnOption2>").append(txTrxnOption2).append("</ewayTrxnOption2>\n");
+ buf.append("\t<ewayTrxnOption3>").append(txTrxnOption3).append("</ewayTrxnOption3>\n");
+ buf.append("\t<ewayReturnAmount>").append(txReturnAmount).append("</ewayReturnAmount>\n");
+ buf.append("\t<ewayAuthCode>").append(txAuthCode).append("</ewayAuthCode>\n");
+ buf.append("\t<ewayBeagleScore>").append(txBeagleScore).append("</ewayBeagleScore>\n");
+ buf.append("\t<ewayTrxnReference>").append(txTrxnReference).append("</ewayTrxnReference>\n");
+ buf.append("</ewayResponse>").append("\n");
+ return buf.toString();
+ }
+}
Modified: ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigForms.xml?rev=1053723&r1=1053722&r2=1053723&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigForms.xml (original)
+++ ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigForms.xml Wed Dec 29 20:05:11 2010
@@ -315,6 +315,32 @@ under the License.
</field>
</form>
+ <form name="EditPaymentGatewayConfigEway" type="single" target="UpdatePaymentGatewayConfigClearCommerce" default-map-name="paymentGatewayClearCommerce" header-row-style="header-row" default-table-style="basic-table">
+ <auto-fields-entity entity-name="PaymentGatewayEway" default-field-type="edit"/>
+ <field name="paymentGatewayConfigId"><hidden/></field>
+ <field name="testMode">
+ <drop-down>
+ <option key="Y" description="${uiLabelMap.CommonYes}"/>
+ <option key="N" description="${uiLabelMap.CommonNo}"/>
+ </drop-down>
+ </field>
+ <field name="enableBeagle">
+ <drop-down>
+ <option key="Y" description="${uiLabelMap.CommonYes}"/>
+ <option key="N" description="${uiLabelMap.CommonNo}"/>
+ </drop-down>
+ </field>
+ <field name="enableCvn">
+ <drop-down>
+ <option key="Y" description="${uiLabelMap.CommonYes}"/>
+ <option key="N" description="${uiLabelMap.CommonNo}"/>
+ </drop-down>
+ </field>
+ <field name="submitButton" title="${uiLabelMap.CommonUpdate}" widget-style="smallSubmit">
+ <submit button-type="button"/>
+ </field>
+ </form>
+
<form name="EditPaymentGatewayConfigWorldPay" type="single" target="UpdatePaymentGatewayConfigWorldPay" default-map-name="paymentGatewayWorldPay" header-row-style="header-row" default-table-style="basic-table">
<auto-fields-entity entity-name="PaymentGatewayWorldPay" default-field-type="edit"/>
<field name="paymentGatewayConfigId"><hidden/></field>
Modified: ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigScreens.xml?rev=1053723&r1=1053722&r2=1053723&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigScreens.xml (original)
+++ ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigScreens.xml Wed Dec 29 20:05:11 2010
@@ -95,6 +95,9 @@ under the License.
<entity-one entity-name="PaymentGatewayCyberSource" value-field="paymentGatewayCyberSource">
<field-map field-name="paymentGatewayConfigId" from-field="parameters.paymentGatewayConfigId"/>
</entity-one>
+ <entity-one entity-name="PaymentGatewayEway" value-field="paymentGatewayEway">
+ <field-map field-name="paymentGatewayConfigId" from-field="parameters.paymentGatewayConfigId"/>
+ </entity-one>
<entity-one entity-name="PaymentGatewayPayflowPro" value-field="paymentGatewayPayflowPro">
<field-map field-name="paymentGatewayConfigId" from-field="parameters.paymentGatewayConfigId"/>
</entity-one>
@@ -208,6 +211,16 @@ under the License.
</screenlet>
</widgets>
</section>
+ <section>
+ <condition>
+ <not><if-empty field="paymentGatewayEway"/></not>
+ </condition>
+ <widgets>
+ <screenlet title="${uiLabelMap.PageTitleUpdatePaymentGatewayConfigClearCommerce}">
+ <include-form name="EditPaymentGatewayConfigEway" location="component://accounting/widget/PaymentGatewayConfigForms.xml"/>
+ </screenlet>
+ </widgets>
+ </section>
</decorator-section>
</decorator-screen>
</widgets>