Author: jleroux
Date: Thu Nov 19 11:01:29 2009
New Revision: 882103
URL: http://svn.apache.org/viewvc?rev=882103&view=rev
Log:
A patch from Abdullah Shaikh "SagePay payment gateway integrated"
(https://issues.apache.org/jira/browse/OFBIZ-3180) - OFBIZ-3180
SagePay payment gateway integrated. All the gateway parameters are configurable
using the Payment gateway configuration, also the transaction types that are
available in sagepay are configurable.
I moved the httpclient httpcore jars to base/lib (also new
jcip-annotations-1.0.jar)
Added:
ofbiz/trunk/applications/accounting/servicedef/services_sagepay.xml (with
props)
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayPaymentServices.java
(with props)
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayServices.java
(with props)
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayUtil.java
(with props)
ofbiz/trunk/framework/base/lib/httpclient-4.0.jar (with props)
ofbiz/trunk/framework/base/lib/httpcore-4.0.1.jar (with props)
ofbiz/trunk/framework/base/lib/jcip-annotations-1.0.jar (with props)
Removed:
ofbiz/trunk/framework/testtools/lib/httpclient-4.0-beta1.jar
ofbiz/trunk/framework/testtools/lib/httpcore-4.0-beta2.jar
Modified:
ofbiz/trunk/.classpath
ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml
ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml
ofbiz/trunk/applications/accounting/ofbiz-component.xml
ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentGatewayConfigServices.xml
ofbiz/trunk/applications/accounting/servicedef/services_paymentgateway.xml
ofbiz/trunk/applications/accounting/webapp/accounting/WEB-INF/controller.xml
ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigForms.xml
ofbiz/trunk/applications/accounting/widget/PaymentGatewayConfigScreens.xml
Modified: ofbiz/trunk/.classpath
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/.classpath?rev=882103&r1=882102&r2=882103&view=diff
==============================================================================
--- ofbiz/trunk/.classpath (original)
+++ ofbiz/trunk/.classpath Thu Nov 19 11:01:29 2009
@@ -141,6 +141,9 @@
<classpathentry kind="lib" path="framework/base/lib/jpim-0.1.jar"/>
<classpathentry kind="lib"
path="framework/base/lib/freemarker-2.3.15.jar"/>
<classpathentry kind="lib"
path="framework/base/lib/owasp-esapi-full-java-1.4.jar"/>
+ <classpathentry kind="lib" path="framework/base/lib/httpcore-4.0.1.jar"/>
+ <classpathentry kind="lib" path="framework/base/lib/httpclient-4.0.jar"/>
+ <classpathentry kind="lib" path="framework/base/lib/jcip-annotations-1.0.jar"/>
<classpathentry kind="lib" path="framework/webapp/lib/json-lib-2.2.3-jdk15.jar"/>
<classpathentry kind="lib" path="framework/webapp/lib/ezmorph-0.9.1.jar"/>
<classpathentry kind="lib" path="specialpurpose/pos/lib/looks-2.0.2.jar"/>
Modified: ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml?rev=882103&r1=882102&r2=882103&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml (original)
+++ ofbiz/trunk/applications/accounting/config/AccountingUiLabels.xml Thu Nov
19 11:01:29 2009
@@ -13686,4 +13686,52 @@
<value xml:lang="en">Batch Payments</value>
<value xml:lang="hi_IN">à¤à¥à¤à¤¤à¤¾à¤¨ à¤à¤¾ बà¥à¤</value>
</property>
-</resource>
+ <property key="PageTitleUpdatePaymentGatewayConfigSagePay">
+ <value xml:lang="en">Update Payment Gateway Config SagePay</value>
+ </property>
+ <property key="AccountingSagePayVendor">
+ <value xml:lang="en">Vendor Name</value>
+ </property>
+ <property key="AccountingSagePayProductionHost">
+ <value xml:lang="en">Production Host</value>
+ </property>
+ <property key="AccountingSagePayTestingHost">
+ <value xml:lang="en">Testing Host</value>
+ </property>
+ <property key="AccountingSagePayMode">
+ <value xml:lang="en">Mode</value>
+ </property>
+ <property key="AccountingSagePayProtocolVersion">
+ <value xml:lang="en">Protocol Version</value>
+ </property>
+ <property key="AccountingSagePayAuthenticationTransType">
+ <value xml:lang="en">Authentication Type</value>
+ </property>
+ <property key="AccountingSagePayAuthenticationUrl">
+ <value xml:lang="en">Authentication Url</value>
+ </property>
+ <property key="AccountingSagePayAuthorisationTransType">
+ <value xml:lang="en">Authorisation Type</value>
+ </property>
+ <property key="AccountingSagePayAuthorisationUrl">
+ <value xml:lang="en">Authorisation Url</value>
+ </property>
+ <property key="AccountingSagePayReleaseTransType">
+ <value xml:lang="en">Release Type</value>
+ </property>
+ <property key="AccountingSagePayReleaseUrl">
+ <value xml:lang="en">Release Url</value>
+ </property>
+ <property key="AccountingSagePayVoidUrl">
+ <value xml:lang="en">Void Url</value>
+ </property>
+ <property key="AccountingSagePayRefundUrl">
+ <value xml:lang="en">Refund Url</value>
+ </property>
+ <property key="AccountingSagePayProduction">
+ <value xml:lang="en">Production</value>
+ </property>
+ <property key="AccountingSagePayTest">
+ <value xml:lang="en">Test</value>
+ </property>
+</resource>
\ No newline at end of file
Modified: ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml?rev=882103&r1=882102&r2=882103&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml (original)
+++ ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml Thu Nov 19
11:01:29 2009
@@ -694,6 +694,10 @@
<PaymentGroupType paymentGroupTypeId="BATCH_PAYMENT" parentTypeId="" hasTable="N"
description="Batch of Payments"/>
<!-- Payment Gateway Config -->
+ <PaymentGatewayConfigType paymentGatewayConfigTypeId="SAGEPAY" hasTable="N"
description="SagePay Payment Gateway"/>
+ <PaymentGatewayConfig paymentGatewayConfigId="SAGEPAY_CONFIG"
paymentGatewayConfigTypeId="SAGEPAY" description="SagePay Config"/>
+ <PaymentGatewaySagePay paymentGatewayConfigId="SAGEPAY_CONFIG" vendor="YOUR_VENDOR_NAME" productionHost="https://live.sagepay.com:443" testingHost="https://test.sagepay.com:443"
mode="TEST" protocolVersion="2.22" authenticationTransType="DEFERRED" authenticationUrl="/gateway/service/vspdirect-register.vsp" authoriseTransType="RELEASE"
authoriseUrl="/gateway/service/release.vsp" releaseTransType="ABORT" releaseUrl="/gateway/service/abort.vsp" voidUrl="/gateway/service/void.vsp"
refundUrl="/gateway/service/refund.vsp"/>
+
<PaymentGatewayConfigType paymentGatewayConfigTypeId="AUTHORIZE_NET" hasTable="N"
description="Authorize Dot Net Payment Gateway"/>
<PaymentGatewayConfig paymentGatewayConfigId="AUTHORIZE_NET_CONFIG"
paymentGatewayConfigTypeId="AUTHORIZE_NET" description="Authorize Dot Net Config"/>
<PaymentGatewayAuthorizeNet paymentGatewayConfigId="AUTHORIZE_NET_CONFIG" transactionUrl="https://certification.authorize.net/gateway/transact.dll" certificateAlias="certification.authorize.net-1"
apiVersion="3.1" delimitedData="TRUE" delimiterChar="|" method="CC" emailCustomer="FALSE" emailMerchant="FALSE" testMode="TRUE" relayResponse="FALSE"
tranKey="" userId="" pwd="" transDescription="OFBizAuthNet"/>
Modified: ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml?rev=882103&r1=882102&r2=882103&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml Thu Nov 19
11:01:29 2009
@@ -3146,6 +3146,28 @@
<key-map field-name="paymentGatewayConfigTypeId"
rel-field-name="paymentGatewayConfigTypeId"/>
</relation>
</entity>
+ <entity entity-name="PaymentGatewaySagePay"
+ package-name="org.ofbiz.accounting.payment"
+ title="SagePay Payment Gateway Configuration">
+ <field name="paymentGatewayConfigId" type="id-ne"></field>
+ <field name="vendor" type="short-varchar"><description>Vendor
name</description></field>
+ <field name="productionHost" type="short-varchar"><description>Production
Host</description></field>
+ <field name="testingHost" type="short-varchar"><description>Testing
Host</description></field>
+ <field name="mode" type="short-varchar"><description>Mode
(PRODUCTION/TEST)</description></field>
+ <field name="protocolVersion" type="very-short"><description>Protocol
Version</description></field>
+ <field name="authenticationTransType"
type="short-varchar"><description>Authentication type
(PAYMENT/AUTHENTICATE/DEFERRED)</description></field>
+ <field name="authenticationUrl" type="long-varchar"><description>Authentication
Url</description></field>
+ <field name="authoriseTransType" type="short-varchar"><description>Authorise type
(AUTHORISE/RELEASE)</description></field>
+ <field name="authoriseUrl" type="long-varchar"><description>Authorise
url</description></field>
+ <field name="releaseTransType" type="short-varchar"><description>Release type
(CANCEL/ABORT)</description></field>
+ <field name="releaseUrl" type="long-varchar"><description>Release
Url</description></field>
+ <field name="voidUrl" type="long-varchar"><description>Void
Url</description></field>
+ <field name="refundUrl" type="long-varchar"><description>Refund
Url</description></field>
+ <prim-key field="paymentGatewayConfigId"/>
+ <relation type="one" fk-name="PGSP_PGC"
rel-entity-name="PaymentGatewayConfig">
+ <key-map field-name="paymentGatewayConfigId"/>
+ </relation>
+ </entity>
<entity entity-name="PaymentGatewayAuthorizeNet"
package-name="org.ofbiz.accounting.payment"
title="Authorize Dot Net Payment Gateway Configuration">
Modified: ofbiz/trunk/applications/accounting/ofbiz-component.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/ofbiz-component.xml?rev=882103&r1=882102&r2=882103&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/ofbiz-component.xml (original)
+++ ofbiz/trunk/applications/accounting/ofbiz-component.xml Thu Nov 19 11:01:29
2009
@@ -68,6 +68,7 @@
<service-resource type="model" loader="main"
location="servicedef/services_olap.xml"/>
<!-- Payment Processor/Gateway Service Definitions -->
+ <service-resource type="model" loader="main"
location="servicedef/services_sagepay.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_authorizedotnet.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_clearcommerce.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_cybersource.xml"/>
Modified:
ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentGatewayConfigServices.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentGatewayConfigServices.xml?rev=882103&r1=882102&r2=882103&view=diff
==============================================================================
---
ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentGatewayConfigServices.xml
(original)
+++
ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentGatewayConfigServices.xml
Thu Nov 19 11:01:29 2009
@@ -25,7 +25,13 @@
<set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
<store-value value-field="lookedUpValue"/>
</simple-method>
-
+
+ <simple-method method-name="updatePaymentGatewayConfigSagePay"
short-description="Update Payment Gateway Config SagePay">
+ <entity-one entity-name="PaymentGatewaySagePay"
value-field="lookedUpValue"/>
+ <set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
+ <store-value value-field="lookedUpValue"/>
+ </simple-method>
+
<simple-method method-name="updatePaymentGatewayConfigAuthorizeNet"
short-description="Update Payment Gateway Config Authorize Dot Net">
<entity-one entity-name="PaymentGatewayAuthorizeNet"
value-field="lookedUpValue"/>
<set-nonpk-fields map="parameters" value-field="lookedUpValue"/>
Modified:
ofbiz/trunk/applications/accounting/servicedef/services_paymentgateway.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_paymentgateway.xml?rev=882103&r1=882102&r2=882103&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/servicedef/services_paymentgateway.xml
(original)
+++ ofbiz/trunk/applications/accounting/servicedef/services_paymentgateway.xml
Thu Nov 19 11:01:29 2009
@@ -30,7 +30,13 @@
<auto-attributes entity-name="PaymentGatewayConfig" include="pk" mode="IN"
optional="false"/>
<auto-attributes entity-name="PaymentGatewayConfig" include="nonpk" mode="IN"
optional="true"/>
</service>
-
+
+ <service name="updatePaymentGatewayConfigSagePay" engine="simple"
location="component://accounting/script/org/ofbiz/accounting/payment/PaymentGatewayConfigServices.xml"
invoke="updatePaymentGatewayConfigSagePay">
+ <description>Update Payment Gateway Config SagePay</description>
+ <auto-attributes entity-name="PaymentGatewaySagePay" include="pk" mode="IN"
optional="false"/>
+ <auto-attributes entity-name="PaymentGatewaySagePay" include="nonpk" mode="IN"
optional="true"/>
+ </service>
+
<service name="updatePaymentGatewayConfigAuthorizeNet" engine="simple"
location="component://accounting/script/org/ofbiz/accounting/payment/PaymentGatewayConfigServices.xml"
invoke="updatePaymentGatewayConfigAuthorizeNet">
<description>Update Payment Gateway Config Authorize Dot
Net</description>
<auto-attributes entity-name="PaymentGatewayAuthorizeNet" include="pk" mode="IN"
optional="false"/>
Added: ofbiz/trunk/applications/accounting/servicedef/services_sagepay.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_sagepay.xml?rev=882103&view=auto
==============================================================================
--- ofbiz/trunk/applications/accounting/servicedef/services_sagepay.xml (added)
+++ ofbiz/trunk/applications/accounting/servicedef/services_sagepay.xml Thu Nov
19 11:01:29 2009
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+
+<services xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/services.xsd">
+ <description>Accounting Services</description>
+ <vendor>OFBiz</vendor>
+ <version>1.0</version>
+
+ <service name="sagepayCCAuth" engine="java"
+ location="org.ofbiz.accounting.thirdparty.sagepay.SagePayPaymentServices"
invoke="ccAuth">
+ <description>SagePay Payment Authorization Service</description>
+ <implements service="ccAuthInterface"/>
+ </service>
+
+ <service name="sagepayCCCapture" engine="java"
+ location="org.ofbiz.accounting.thirdparty.sagepay.SagePayPaymentServices"
invoke="ccCapture">
+ <description>SagePay Payment Capture Service</description>
+ <implements service="ccCaptureInterface"/>
+ </service>
+
+ <service name="sagepayCCRelease" engine="java"
+ location="org.ofbiz.accounting.thirdparty.sagepay.SagePayPaymentServices"
invoke="ccRelease">
+ <description>SagePay Payment Release</description>
+ <implements service="paymentReleaseInterface"/>
+ </service>
+
+ <service name="sagepayCCRefund" engine="java"
+ location="org.ofbiz.accounting.thirdparty.sagepay.SagePayPaymentServices"
invoke="ccRefund">
+ <description>SagePay Payment Refund Service</description>
+ <implements service="paymentRefundInterface"/>
+ </service>
+
+ <service name="SagePayPaymentAuthentication" engine="java"
location="org.ofbiz.accounting.thirdparty.sagepay.SagePayServices"
+ invoke="paymentAuthentication" auth="false">
+ <description>For payment authentication</description>
+ <attribute name="paymentGatewayConfigId" type="String" mode="IN"
optional="true"/>
+ <attribute name="transactionType" type="String" mode="OUT"
optional="false"/>
+ <attribute name="vendorTxCode" type="String" mode="INOUT"
optional="false"/>
+ <attribute name="cardHolder" type="String" mode="IN" optional="false"/>
+ <attribute name="cardNumber" type="String" mode="IN" optional="false"/>
+ <attribute name="expiryDate" type="String" mode="IN" optional="false"/>
+ <attribute name="cardType" type="String" mode="IN" optional="false"/>
+ <attribute name="amount" type="String" mode="INOUT" optional="false"/>
+ <attribute name="currency" type="String" mode="IN" optional="false"/>
+
+ <!-- All the Billing* & Delivery* fields are not mandatory in version 2.22,
+ but mandatory in version 2.23, hence making them as optional -->
+
+ <attribute name="billingSurname" type="String" mode="IN" optional="true"/>
+ <attribute name="billingFirstnames" type="String" mode="IN"
optional="true"/>
+ <attribute name="billingAddress" type="String" mode="IN"
optional="false"/>
+ <attribute name="billingAddress2" type="String" mode="IN"
optional="true"/>
+ <attribute name="billingCity" type="String" mode="IN" optional="true"/>
+ <attribute name="billingPostCode" type="String" mode="IN"
optional="false"/>
+ <attribute name="billingCountry" type="String" mode="IN"
optional="true"/>
+ <attribute name="billingState" type="String" mode="IN"
optional="true"/>
+ <attribute name="billingPhone" type="String" mode="IN"
optional="true"/>
+
+ <attribute name="isBillingSameAsDelivery" type="Boolean" mode="IN" optional="true"/>
+
+ <attribute name="deliverySurname" type="String" mode="IN"
optional="true"/>
+ <attribute name="deliveryFirstnames" type="String" mode="IN"
optional="true"/>
+ <attribute name="deliveryAddress" type="String" mode="IN"
optional="true"/>
+ <attribute name="deliveryAddress2" type="String" mode="IN"
optional="true"/>
+ <attribute name="deliveryCity" type="String" mode="IN"
optional="true"/>
+ <attribute name="deliveryPostCode" type="String" mode="IN"
optional="true"/>
+ <attribute name="deliveryCountry" type="String" mode="IN"
optional="true"/>
+ <attribute name="deliveryState" type="String" mode="IN"
optional="true"/>
+ <attribute name="deliveryPhone" type="String" mode="IN"
optional="true"/>
+
+ <!-- start optional parameters (optional not to the service, but to the
payment gateway -->
+ <attribute name="cv2" type="String" mode="IN" optional="true"/>
+ <attribute name="startDate" type="String" mode="IN" optional="true"/>
+ <attribute name="issueNumber" type="String" mode="IN" optional="true"/>
+ <!-- end optional parameters -->
+
+ <attribute name="basket" type="String" mode="IN" optional="true"/>
+ <attribute name="description" type="String" mode="IN"
optional="false"/>
+ <attribute name="clientIPAddress" type="String" mode="IN"
optional="true"/>
+
+ <attribute name="status" type="String" mode="OUT" optional="true"/>
+ <attribute name="statusDetail" type="String" mode="OUT"
optional="true"/>
+
+ <!-- start - this parameters will only be returned if the transaction is
authorised -->
+ <attribute name="vpsTxId" type="String" mode="OUT" optional="true"/>
+ <attribute name="securityKey" type="String" mode="OUT"
optional="true"/>
+ <attribute name="txAuthNo" type="String" mode="OUT" optional="true"/>
+ <attribute name="avsCv2" type="String" mode="OUT" optional="true"/>
+ <attribute name="addressResult" type="String" mode="OUT"
optional="true"/>
+ <attribute name="postCodeResult" type="String" mode="OUT"
optional="true"/>
+ <attribute name="cv2Result" type="String" mode="OUT" optional="true"/>
+ <attribute name="cavv" type="String" mode="OUT" optional="true"/>
+ <!-- end - this parameters will only be returned if the transaction is authorised -->
+
+ </service>
+
+ <service name="SagePayPaymentAuthorisation" engine="java" location="org.ofbiz.accounting.thirdparty.sagepay.SagePayServices"
+ invoke="paymentAuthorisation" auth="false">
+ <description>For capturing the payment</description>
+ <attribute name="paymentGatewayConfigId" type="String" mode="IN"
optional="true"/>
+ <attribute name="vendorTxCode" type="String" mode="IN"
optional="false"/>
+ <attribute name="vpsTxId" type="String" mode="IN" optional="true"/>
+ <attribute name="securityKey" type="String" mode="IN" optional="true"/>
+ <attribute name="txAuthNo" type="String" mode="IN" optional="true"/>
+ <attribute name="amount" type="String" mode="IN" optional="false"/>
+ <attribute name="status" type="String" mode="OUT" optional="true"/>
+ <attribute name="statusDetail" type="String" mode="OUT"
optional="true"/>
+ </service>
+
+ <service name="SagePayPaymentRelease" engine="java"
location="org.ofbiz.accounting.thirdparty.sagepay.SagePayServices"
+ invoke="paymentRelease" auth="false">
+ <description>For releasing (cancel) the payment</description>
+ <attribute name="paymentGatewayConfigId" type="String" mode="IN"
optional="true"/>
+ <attribute name="vendorTxCode" type="String" mode="IN"
optional="false"/>
+ <attribute name="vpsTxId" type="String" mode="IN" optional="false"/>
+ <attribute name="securityKey" type="String" mode="IN"
optional="false"/>
+ <attribute name="txAuthNo" type="String" mode="IN" optional="false"/>
+ <attribute name="releaseAmount" type="String" mode="IN"
optional="false"/>
+ <attribute name="status" type="String" mode="OUT" optional="true"/>
+ <attribute name="statusDetail" type="String" mode="OUT"
optional="true"/>
+ </service>
+
+ <service name="SagePayPaymentVoid" engine="java" location="org.ofbiz.accounting.thirdparty.sagepay.SagePayServices"
+ invoke="paymentVoid" auth="false">
+ <description>For voiding the payment</description>
+ <attribute name="paymentGatewayConfigId" type="String" mode="IN"
optional="true"/>
+ <attribute name="vendorTxCode" type="String" mode="IN"
optional="false"/>
+ <attribute name="vpsTxId" type="String" mode="IN" optional="false"/>
+ <attribute name="securityKey" type="String" mode="IN"
optional="false"/>
+ <attribute name="txAuthNo" type="String" mode="IN" optional="false"/>
+ <attribute name="status" type="String" mode="OUT" optional="true"/>
+ <attribute name="statusDetail" type="String" mode="OUT"
optional="true"/>
+ </service>
+
+ <service name="SagePayPaymentRefund" engine="java" location="org.ofbiz.accounting.thirdparty.sagepay.SagePayServices"
+ invoke="paymentRefund" auth="false">
+ <description>For refunding the payment</description>
+ <attribute name="paymentGatewayConfigId" type="String" mode="IN"
optional="true"/>
+ <attribute name="vendorTxCode" type="String" mode="IN"
optional="false"/>
+ <attribute name="amount" type="String" mode="IN" optional="false"/>
+ <attribute name="currency" type="String" mode="IN" optional="false"/>
+ <attribute name="description" type="String" mode="IN"
optional="false"/>
+ <attribute name="relatedVPSTxId" type="String" mode="IN"
optional="false"/>
+ <attribute name="relatedVendorTxCode" type="String" mode="IN"
optional="false"/>
+ <attribute name="relatedSecurityKey" type="String" mode="IN"
optional="false"/>
+ <attribute name="relatedTxAuthNo" type="String" mode="IN"
optional="false"/>
+ <attribute name="status" type="String" mode="OUT" optional="true"/>
+ <attribute name="statusDetail" type="String" mode="OUT"
optional="true"/>
+ <attribute name="vpsTxId" type="String" mode="OUT" optional="true"/>
+ <attribute name="txAuthNo" type="String" mode="OUT" optional="true"/>
+ </service>
+
+</services>
Propchange: ofbiz/trunk/applications/accounting/servicedef/services_sagepay.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/trunk/applications/accounting/servicedef/services_sagepay.xml
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/trunk/applications/accounting/servicedef/services_sagepay.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added:
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayPaymentServices.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayPaymentServices.java?rev=882103&view=auto
==============================================================================
---
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayPaymentServices.java
(added)
+++
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayPaymentServices.java
Thu Nov 19 11:01:29 2009
@@ -0,0 +1,521 @@
+/*******************************************************************************
+ * 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.sagepay;
+
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+
+import javolution.util.FastMap;
+
+import org.ofbiz.accounting.payment.PaymentGatewayServices;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilDateTime;
+import org.ofbiz.base.util.UtilFormatOut;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.util.EntityUtil;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.service.LocalDispatcher;
+import org.ofbiz.service.ServiceUtil;
+
+public class SagePayPaymentServices {
+
+ public static final String module = SagePayPaymentServices.class.getName();
+
+ private static Map<String, String> buildCustomerBillingInfo(Map<String,
Object> context) {
+
+ Debug.logInfo("SagePay - Entered buildCustomerBillingInfo", module);
+ Debug.logInfo("SagePay buildCustomerBillingInfo context : " + context,
module);
+
+ Map<String, String> billingInfo = FastMap.newInstance();
+
+ String orderId = null;
+ BigDecimal processAmount = null;
+ String currency = null;
+ String cardNumber = null;
+ String cardType = null;
+ String nameOnCard = null;
+ String expireDate = null;
+ String securityCode = null;
+ String postalCode = null;
+ String address = null;
+
+ try {
+
+ GenericValue opp = (GenericValue) context.get("orderPaymentPreference");
+ if (opp != null) {
+ if
("CREDIT_CARD".equals(opp.getString("paymentMethodTypeId"))) {
+
+ GenericValue creditCard = (GenericValue)
context.get("creditCard");
+ if (creditCard == null ||
!(opp.get("paymentMethodId").equals(creditCard.get("paymentMethodId")))) {
+ creditCard = opp.getRelatedOne("CreditCard");
+ }
+
+ securityCode = opp.getString("securityCode");
+
+ //getting billing address
+ GenericValue billingAddress = (GenericValue)
context.get("billingAddress");
+ postalCode = billingAddress.getString("postalCode");
+ String address2 = billingAddress.getString("address2");
+ if (address2 == null){
+ address2 = "";
+ }
+ address = billingAddress.getString("address1") + " " +
address2;
+
+ //getting card details
+ cardNumber = creditCard.getString("cardNumber");
+ String firstName = creditCard.getString("firstNameOnCard");
+ String middleName =
creditCard.getString("middleNameOnCard");
+ String lastName = creditCard.getString("lastNameOnCard");
+ if (middleName == null){
+ middleName = "";
+ }
+ nameOnCard = firstName + " " + middleName + " " + lastName;
+ cardType = creditCard.getString("cardType");
+ if (cardType != null) {
+ if (cardType.equals("MasterCard")) {
+ cardType = "MC";
+ }
+ if (cardType.equals("VisaElectron")) {
+ cardType = "UKE";
+ }
+ if (cardType.equals("DinersClub")) {
+ cardType = "DC";
+ }
+ if (cardType.equals("Switch")) {
+ cardType = "MAESTRO";
+ }
+ }
+ expireDate = creditCard.getString("expireDate");
+ String month = expireDate.substring(0,2);
+ String year = expireDate.substring(5);
+ expireDate = month + year;
+
+ //getting order details
+ orderId = UtilFormatOut.checkNull((String)
context.get("orderId"));
+ processAmount = (BigDecimal) context.get("processAmount");
+ currency = (String) context.get("currency");
+
+ } else {
+ Debug.logWarning("Payment preference " + opp + " is not a
credit card", module);
+ }
+ }
+ } catch (GenericEntityException ex) {
+ Debug.logError("Cannot build customer information for " + context + "
due to error: " + ex.getMessage(), module);
+ return null;
+ }
+
+ billingInfo.put("orderId", orderId);
+ billingInfo.put("amount", processAmount.toString());
+ billingInfo.put("currency", currency);
+ billingInfo.put("description", orderId);
+ billingInfo.put("cardNumber", cardNumber);
+ billingInfo.put("cardHolder", nameOnCard);
+ billingInfo.put("expiryDate", expireDate);
+ billingInfo.put("cardType", cardType);
+ billingInfo.put("cv2", securityCode);
+ billingInfo.put("billingPostCode", postalCode);
+ billingInfo.put("billingAddress", address);
+
+ Debug.logInfo("SagePay billingInfo : " + billingInfo, module);
+ Debug.logInfo("SagePay - Exiting buildCustomerBillingInfo", module);
+
+ return billingInfo;
+ }
+
+ public static Map<String, Object> ccAuth(DispatchContext dctx, Map<String,
Object> context) {
+ Debug.logInfo("SagePay - Entered ccAuth", module);
+ Debug.logInfo("SagePay ccAuth context : " + context, module);
+ Map<String, Object> response = null;
+
+ String orderId = (String) context.get("orderId");
+ GenericValue orderPaymentPreference = (GenericValue)
context.get("orderPaymentPreference");
+ if (null == orderPaymentPreference) {
+ response = ServiceUtil.returnError("OrderPaymentPreference for order : " +
orderId + " is null : " + orderPaymentPreference);
+ } else {
+ response = processCardAuthorisationPayment(dctx, context);
+ }
+ Debug.logInfo("SagePay ccAuth response : " + response, module);
+ Debug.logInfo("SagePay - Exiting ccAuth", module);
+ return response;
+ }
+
+
+ private static Map<String, Object>
processCardAuthorisationPayment(DispatchContext ctx, Map<String, Object> context) {
+
+ Map<String, Object> result = ServiceUtil.returnSuccess();
+ LocalDispatcher dispatcher = ctx.getDispatcher();
+
+ Map<String, String> billingInfo = buildCustomerBillingInfo(context);
+ String paymentGatewayConfigId = (String)
context.get("paymentGatewayConfigId");
+
+ try {
+
+ Map<String, Object> paymentResult = dispatcher.runSync("SagePayPaymentAuthentication",
+ UtilMisc.toMap(
+ "paymentGatewayConfigId", paymentGatewayConfigId,
+ "vendorTxCode", billingInfo.get("orderId"),
+ "cardHolder", billingInfo.get("cardHolder"),
+ "cardNumber", billingInfo.get("cardNumber"),
+ "expiryDate", billingInfo.get("expiryDate"),
+ "cardType", billingInfo.get("cardType"),
+ "cv2", billingInfo.get("cv2"),
+ "description", billingInfo.get("description"),
+ "amount", billingInfo.get("amount"),
+ "currency", billingInfo.get("currency"),
+ "billingAddress",
billingInfo.get("billingAddress"),
+ "billingPostCode",
billingInfo.get("billingPostCode")
+ )
+ );
+
+ Debug.logInfo("SagePay - SagePayPaymentAuthentication result : " +
paymentResult, module);
+
+ String transactionType = (String)
paymentResult.get("transactionType");
+ String status = (String) paymentResult.get("status");
+ String statusDetail = (String) paymentResult.get("statusDetail");
+ String vpsTxId = (String) paymentResult.get("vpsTxId");
+ String securityKey = (String) paymentResult.get("securityKey");
+ String txAuthNo = (String) paymentResult.get("txAuthNo");
+ String vendorTxCode = (String) paymentResult.get("vendorTxCode");
+ String amount = (String) paymentResult.get("amount");
+
+ if (status != null && "OK".equals(status)) {
+ Debug.logInfo("SagePay - Payment authorized for order : " +
vendorTxCode, module);
+ result =
SagePayUtil.buildCardAuthorisationPaymentResponse(Boolean.TRUE, txAuthNo,
securityKey, new BigDecimal(amount), vpsTxId, vendorTxCode, statusDetail);
+ if ("PAYMENT".equals(transactionType)) {
+ Map<String,Object> captureResult =
SagePayUtil.buildCardCapturePaymentResponse(Boolean.TRUE, txAuthNo, securityKey, new
BigDecimal(amount), vpsTxId, vendorTxCode, statusDetail);
+ result.putAll(captureResult);
+ }
+ } else if (status != null && "INVALID".equals(status)) {
+ Debug.logInfo("SagePay - Invalid authorisation request for order :
" + vendorTxCode, module);
+ result = SagePayUtil.buildCardAuthorisationPaymentResponse(Boolean.FALSE, null,
null, new BigDecimal("0.00"), "INVALID", vendorTxCode, statusDetail);
+ } else if (status != null && "MALFORMED".equals(status)) {
+ Debug.logInfo("SagePay - Malformed authorisation request for order
: " + vendorTxCode, module);
+ result = SagePayUtil.buildCardAuthorisationPaymentResponse(Boolean.FALSE, null,
null, new BigDecimal("0.00"), "MALFORMED", vendorTxCode, statusDetail);
+ } else if (status != null && "NOTAUTHED".equals(status)) {
+ Debug.logInfo("SagePay - NotAuthed authorisation request for order
: " + vendorTxCode, module);
+ result =
SagePayUtil.buildCardAuthorisationPaymentResponse(Boolean.FALSE, null, securityKey, new
BigDecimal("0.00"), vpsTxId, vendorTxCode, statusDetail);
+ } else if (status != null && "REJECTED".equals(status)) {
+ Debug.logInfo("SagePay - Rejected authorisation request for order :
" + vendorTxCode, module);
+ result =
SagePayUtil.buildCardAuthorisationPaymentResponse(Boolean.FALSE, null,
securityKey, new BigDecimal(amount), vpsTxId, vendorTxCode, statusDetail);
+ } else {
+ Debug.logInfo("SagePay - Invalid status " + status + " received for
order : " + vendorTxCode, module);
+ result = SagePayUtil.buildCardAuthorisationPaymentResponse(Boolean.FALSE, null,
null, new BigDecimal("0.00"), "ERROR", vendorTxCode, statusDetail);
+ }
+ } catch(GenericServiceException e) {
+ Debug.logError(e, "Error in calling SagePayPaymentAuthentication",
module);
+ result = ServiceUtil.returnError("Exception in calling
SagePayPaymentRegistration : " + e.getMessage());
+ }
+ return result;
+ }
+
+ public static Map<String, Object> ccCapture(DispatchContext ctx, Map<String,
Object> context) {
+ Debug.logInfo("SagePay - Entered ccCapture", module);
+ Debug.logInfo("SagePay ccCapture context : " + context, module);
+
+ GenericValue orderPaymentPreference = (GenericValue)
context.get("orderPaymentPreference");
+ GenericValue authTransaction =
PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
+ context.put("authTransaction", authTransaction);
+ Map<String, Object> response = processCardCapturePayment(ctx, context);
+
+ Debug.logInfo("SagePay ccCapture response : " + response, module);
+ Debug.logInfo("SagePay - Exiting ccCapture", module);
+
+ return response;
+ }
+
+
+ private static Map<String, Object> processCardCapturePayment(DispatchContext ctx, Map<String, Object> context) {
+
+ Map<String, Object> result = ServiceUtil.returnSuccess();
+ LocalDispatcher dispatcher = ctx.getDispatcher();
+
+ String paymentGatewayConfigId = (String)
context.get("paymentGatewayConfigId");
+ GenericValue authTransaction = (GenericValue)
context.get("authTransaction");
+ BigDecimal amount = (BigDecimal) context.get("captureAmount");
+ String vendorTxCode = (String) authTransaction.get("altReference");
+ String vpsTxId = (String) authTransaction.get("referenceNum");
+ String securityKey = (String) authTransaction.get("gatewayFlag");
+ String txAuthCode = (String) authTransaction.get("gatewayCode");
+
+ try {
+
+ Map<String, Object> paymentResult = dispatcher.runSync("SagePayPaymentAuthorisation",
+ UtilMisc.toMap(
+ "paymentGatewayConfigId", paymentGatewayConfigId,
+ "vendorTxCode", vendorTxCode,
+ "vpsTxId", vpsTxId,
+ "securityKey", securityKey,
+ "txAuthNo", txAuthCode,
+ "amount", amount.toString()
+ )
+ );
+ Debug.logInfo("SagePay - SagePayPaymentAuthorisation result : " +
paymentResult, module);
+ String status = (String) paymentResult.get("status");
+ String statusDetail = (String) paymentResult.get("statusDetail");
+ if (status != null && "OK".equals(status)) {
+ Debug.logInfo("SagePay Payment Released for Order : " +
vendorTxCode, module);
+ result =
SagePayUtil.buildCardCapturePaymentResponse(Boolean.TRUE, txAuthCode,
securityKey, amount, vpsTxId, vendorTxCode, statusDetail);
+ } else {
+ Debug.logInfo("SagePay - Invalid status " + status + " received for
order : " + vendorTxCode, module);
+ result = SagePayUtil.buildCardCapturePaymentResponse(Boolean.FALSE, txAuthCode, securityKey, amount, vpsTxId, vendorTxCode, statusDetail);
+ }
+ } catch(GenericServiceException e) {
+ Debug.logError(e, "Error in calling SagePayPaymentAuthorisation",
module);
+ result = ServiceUtil.returnError("Exception in calling
SagePayPaymentRegistration : " + e.getMessage());
+ }
+ return result;
+ }
+
+
+ public static Map<String, Object> ccRefund(DispatchContext ctx, Map<String,
Object> context) {
+ Debug.logInfo("SagePay - Entered ccRefund", module);
+ Debug.logInfo("SagePay ccRefund context : " + context, module);
+
+ Delegator delegator = ctx.getDelegator();
+ GenericValue orderPaymentPreference = (GenericValue)
context.get("orderPaymentPreference");
+ GenericValue captureTransaction =
PaymentGatewayServices.getCaptureTransaction(orderPaymentPreference);
+ if (captureTransaction == null) {
+ return ServiceUtil.returnError("No captured transaction found for the
OrderPaymentPreference; cannot Refund");
+ }
+ Debug.logInfo("SagePay ccRefund captureTransaction : " +
captureTransaction, module);
+ GenericValue creditCard = null;
+ try {
+ creditCard = delegator.getRelatedOne("CreditCard",
orderPaymentPreference);
+ } catch (GenericEntityException e) {
+ Debug.logError(e, "Error getting CreditCard for OrderPaymentPreference
: " + orderPaymentPreference, module);
+ return ServiceUtil.returnError("Unable to obtain cc information from
payment preference");
+ }
+ context.put("creditCard",creditCard);
+ context.put("captureTransaction", captureTransaction);
+
+ List<GenericValue> authTransactions =
PaymentGatewayServices.getAuthTransactions(orderPaymentPreference);
+
+ EntityCondition authCondition =
EntityCondition.makeCondition("paymentServiceTypeEnumId", "PRDS_PAY_AUTH");
+ List<GenericValue> authTransactions1 =
EntityUtil.filterByCondition(authTransactions, authCondition);
+
+ GenericValue authTransaction = EntityUtil.getFirst(authTransactions1);
+
+ Timestamp authTime = authTransaction.getTimestamp("transactionDate");
+ Calendar authCal = Calendar.getInstance();
+ authCal.setTimeInMillis(authTime.getTime());
+
+ Timestamp nowTime = UtilDateTime.nowTimestamp();
+ Calendar nowCal = Calendar.getInstance();
+ nowCal.setTimeInMillis(nowTime.getTime());
+
+ Calendar yesterday = Calendar.getInstance();
+ yesterday.set(nowCal.get(Calendar.YEAR), nowCal.get(Calendar.MONTH),
nowCal.get(Calendar.DATE), 23, 59, 59);
+ yesterday.add(Calendar.DAY_OF_YEAR, -1);
+
+ Map<String, Object> response = null;
+
+ if (authCal.before(yesterday)) {
+ Debug.logInfo("SagePay - Calling Refund for Refund", module);
+ response = processCardRefundPayment(ctx, context);
+ } else {
+
+ Calendar cal = Calendar.getInstance();
+ cal.set(nowCal.get(Calendar.YEAR), nowCal.get(Calendar.MONTH),
nowCal.get(Calendar.DATE), 23, 49, 59);
+
+ if (authCal.before(cal)) {
+ Debug.logInfo("SagePay - Calling Void for Refund", module);
+ response = processCardVoidPayment(ctx, context);
+ } else {
+ Debug.logInfo("SagePay - Calling Refund for Refund", module);
+ response = processCardRefundPayment(ctx, context);
+ }
+ }
+
+ Debug.logInfo("SagePay ccRefund response : " + response, module);
+ return response;
+ }
+
+ private static Map<String, Object> processCardRefundPayment(DispatchContext ctx,
Map<String, Object> context) {
+
+ Map<String, Object> result = ServiceUtil.returnSuccess();
+ LocalDispatcher dispatcher = ctx.getDispatcher();
+
+ String paymentGatewayConfigId = (String)
context.get("paymentGatewayConfigId");
+ GenericValue captureTransaction = (GenericValue)
context.get("captureTransaction");
+ BigDecimal amount = (BigDecimal) context.get("refundAmount");
+
+ String orderId = (String) captureTransaction.get("altReference");
+ orderId = "R" + orderId;
+
+ try {
+
+ Map<String, Object> paymentResult =
dispatcher.runSync("SagePayPaymentRefund",
+ UtilMisc.toMap(
+ "paymentGatewayConfigId", paymentGatewayConfigId,
+ "vendorTxCode", orderId,
+ "amount", amount.toString(),
+ "currency", "GBP",
+ "description", orderId,
+ "relatedVPSTxId",
captureTransaction.get("referenceNum"),
+ "relatedVendorTxCode", captureTransaction.get("altReference"),
+ "relatedSecurityKey", captureTransaction.get("gatewayFlag"),
+ "relatedTxAuthNo",
captureTransaction.get("gatewayCode")
+ )
+ );
+ Debug.logInfo("SagePay - SagePayPaymentRefund result : " +
paymentResult, module);
+
+ String status = (String) paymentResult.get("status");
+ String statusDetail = (String) paymentResult.get("statusDetail");
+ String vpsTxId = (String) paymentResult.get("vpsTxId");
+ String txAuthNo = (String) paymentResult.get("txAuthNo");
+
+ if (status != null && "OK".equals(status)) {
+ Debug.logInfo("SagePay Payment Refunded for Order : " +
orderId, module);
+ result =
SagePayUtil.buildCardRefundPaymentResponse(Boolean.TRUE, txAuthNo, amount,
vpsTxId, orderId, statusDetail);
+ } else {
+ Debug.logInfo("SagePay - Invalid status " + status + " received for
order : " + orderId, module);
+ result = SagePayUtil.buildCardRefundPaymentResponse(Boolean.FALSE, null,
new BigDecimal("0.00"), status, orderId, statusDetail);
+ }
+
+ } catch(GenericServiceException e) {
+ Debug.logError(e, "Error in calling SagePayPaymentRefund", module);
+ result = ServiceUtil.returnError("Exception in calling
SagePayPaymentRefund : " + e.getMessage());
+ }
+
+ return result;
+ }
+
+ private static Map<String, Object> processCardVoidPayment(DispatchContext ctx,
Map<String, Object> context) {
+
+ Map<String, Object> result = ServiceUtil.returnSuccess();
+ LocalDispatcher dispatcher = ctx.getDispatcher();
+
+ String paymentGatewayConfigId = (String)
context.get("paymentGatewayConfigId");
+ GenericValue captureTransaction = (GenericValue)
context.get("captureTransaction");
+ BigDecimal amount = (BigDecimal) context.get("refundAmount");
+ String orderId = (String) captureTransaction.get("altReference");
+
+ try {
+
+ Map<String, Object> paymentResult = dispatcher.runSync("SagePayPaymentVoid",
+ UtilMisc.toMap(
+ "paymentGatewayConfigId", paymentGatewayConfigId,
+ "vendorTxCode",
captureTransaction.get("altReference"),
+ "vpsTxId", captureTransaction.get("referenceNum"),
+ "securityKey",
captureTransaction.get("gatewayFlag"),
+ "txAuthNo", captureTransaction.get("gatewayCode")
+ )
+ );
+
+ Debug.logInfo("SagePay - SagePayPaymentVoid result : " + paymentResult, module);
+
+ String status = (String) paymentResult.get("status");
+ String statusDetail = (String) paymentResult.get("statusDetail");
+
+ if (status != null && "OK".equals(status)) {
+ Debug.logInfo("SagePay Payment Voided for Order : " + orderId,
module);
+ result = SagePayUtil.buildCardVoidPaymentResponse(Boolean.TRUE, amount,
"SUCCESS", orderId, statusDetail);
+ } else if (status != null && "MALFORMED".equals(status)) {
+ Debug.logInfo("SagePay - Malformed void request for order : "
+ orderId, module);
+ result = SagePayUtil.buildCardVoidPaymentResponse(Boolean.FALSE, new
BigDecimal("0.00"), "MALFORMED", orderId, statusDetail);
+ } else if (status != null && "INVALID".equals(status)){
+ Debug.logInfo("SagePay - Invalid void request for order : " +
orderId, module);
+ result = SagePayUtil.buildCardVoidPaymentResponse(Boolean.FALSE, new
BigDecimal("0.00"), "INVALID", orderId, statusDetail);
+ } else if (status != null && "ERROR".equals(status)){
+ Debug.logInfo("SagePay - Error in void request for order : " +
orderId, module);
+ result = SagePayUtil.buildCardVoidPaymentResponse(Boolean.FALSE, new
BigDecimal("0.00"), "ERROR", orderId, statusDetail);
+ }
+
+ } catch(GenericServiceException e) {
+ Debug.logError(e, "Error in calling SagePayPaymentVoid", module);
+ result = ServiceUtil.returnError("Exception in calling
SagePayPaymentVoid : " + e.getMessage());
+ }
+ return result;
+ }
+
+ public static Map<String, Object> ccRelease(DispatchContext ctx, Map<String,
Object> context) {
+
+ Debug.logInfo("SagePay - Entered ccRelease", module);
+ Debug.logInfo("SagePay ccRelease context : " + context, module);
+
+ GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
+
+ GenericValue authTransaction =
PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
+ if (authTransaction == null) {
+ return ServiceUtil.returnError("No authorization transaction found for
the OrderPaymentPreference; cannot Release");
+ }
+ context.put("authTransaction", authTransaction);
+
+ Map<String, Object> response = processCardReleasePayment(ctx, context);
+ Debug.logInfo("SagePay ccRelease response : " + response, module);
+ return response;
+ }
+
+ private static Map<String, Object> processCardReleasePayment(DispatchContext
ctx, Map<String, Object> context) {
+
+ Map<String, Object> result = ServiceUtil.returnSuccess();
+
+ LocalDispatcher dispatcher = ctx.getDispatcher();
+
+ String paymentGatewayConfigId = (String)
context.get("paymentGatewayConfigId");
+ BigDecimal amount = (BigDecimal) context.get("releaseAmount");
+
+ GenericValue authTransaction = (GenericValue) context.get("authTransaction");
+ String orderId = (String) authTransaction.get("altReference");
+ String refNum = (String) authTransaction.get("referenceNum");
+
+ try {
+
+ Map<String, Object> paymentResult = dispatcher.runSync("SagePayPaymentRelease",
+ UtilMisc.toMap(
+ "paymentGatewayConfigId", paymentGatewayConfigId,
+ "vendorTxCode", orderId,
+ "releaseAmount", amount.toString(),
+ "vpsTxId", refNum,
+ "securityKey", authTransaction.get("gatewayFlag"),
+ "txAuthNo", authTransaction.get("gatewayCode")
+ )
+ );
+
+ Debug.logInfo("SagePay - SagePayPaymentRelease result : " +
paymentResult, module);
+
+ String status = (String) paymentResult.get("status");
+ String statusDetail = (String) paymentResult.get("statusDetail");
+
+ if (status != null && "OK".equals(status)) {
+ Debug.logInfo("SagePay Payment Released for Order : " +
orderId, module);
+ result =
SagePayUtil.buildCardReleasePaymentResponse(Boolean.TRUE, null, amount, refNum,
orderId, statusDetail);
+ } else {
+ Debug.logInfo("SagePay - Invalid status " + status + " received for
order : " + orderId, module);
+ result =
SagePayUtil.buildCardReleasePaymentResponse(Boolean.FALSE, null, amount,
refNum, orderId, statusDetail);
+ }
+
+ } catch(GenericServiceException e) {
+ Debug.logError(e, "Error in calling SagePayPaymentRelease",
module);
+ result = ServiceUtil.returnError("Exception in calling
SagePayPaymentRefund : " + e.getMessage());
+ }
+
+ return result;
+ }
+
+}
Propchange:
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayPaymentServices.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayPaymentServices.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange:
ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/sagepay/SagePayPaymentServices.java
------------------------------------------------------------------------------
svn:mime-type = text/plain