Just wanted to add Vince Clark of Global Era as a key contributor in
getting this implementation into the OFBiz trunk - thanks Vince. Cheers, Tim -- Tim Ruppert HotWax Media http://www.hotwaxmedia.com o:801.649.6594 f:801.649.6595 On Aug 21, 2009, at 11:00 AM, [hidden email] wrote: > Author: ashish > Date: Fri Aug 21 17:00:55 2009 > New Revision: 806643 > > URL: http://svn.apache.org/viewvc?rev=806643&view=rev > Log: > First pass on Orbital Gateway: http://download.chasepaymentech.com/ > > Following things are covered in this implementation: > > 1) Services written for ccAuth, ccAuthCapture, ccAuthRelease, > ccAuthRefund, ccCapture. > 2) Instead of property files we have kept commonly used values in > the entity - for this created new entity - PaymentGatewayOrbital. > 3) The initialisation of "Configurator"(which is a class that is > being used for the initialisation of configuration settings - like > user credentials and many more things). For now configurator takes > only file by name "linehandler.properties". So I have created new > files by this name. > 4) Also added demo data in ecommerce files so it can be used if > someone want to use it for gateway purpose. > 5) For now we have excluded the compilation of this gateway - I will > provide an end user document for this soon so anybody would be able > to configure it easily. > > This is collaborative effort from me and following guys. > > Scott Gray: Discussed so many things with me in the b/w this > implementation. There were some security settings issue with jdk > installation - Scott helped me in that area. > Anil Patel & Tim Ruppert: Initial implementation plan discussed > with Anil and there were so many things that I had discussed with > Anil & Tim in b/w. Thanks Tim for encouraging us to put this gateway > on OFBiz trunk so it could be used by larger audience. > Mridul & Sumit: I have asked these guys to see the results / outcome > of implementation and asked them to provide their comments/ thoughts. > > Thanks a lot guys for your help - it was simply awesome. > > Suggestions and comments are most welcome - I will wait for them. > Thank you! > > Added: > ofbiz/trunk/applications/accounting/config/ > linehandler.properties (with props) > ofbiz/trunk/applications/accounting/servicedef/ > services_orbital.xml (with props) > ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/ > thirdparty/orbital/ > ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/ > thirdparty/orbital/OrbitalPaymentServices.java (with props) > Modified: > ofbiz/trunk/applications/accounting/build.xml > ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml > ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml > ofbiz/trunk/applications/accounting/ofbiz-component.xml > ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml > > Modified: ofbiz/trunk/applications/accounting/build.xml > URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/build.xml?rev=806643&r1=806642&r2=806643&view=diff > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/applications/accounting/build.xml (original) > +++ ofbiz/trunk/applications/accounting/build.xml Fri Aug 21 > 17:00:55 2009 > @@ -61,6 +61,7 @@ > <exclude name="org/ofbiz/accounting/thirdparty/verisign/ > **"/> > <exclude name="org/ofbiz/accounting/thirdparty/ > cybersource/**"/> > <exclude name="org/ofbiz/accounting/thirdparty/paypal/ > PayPalServices.java"/> > + <exclude name="org/ofbiz/accounting/thirdparty/orbital/ > **"/> > </javac15> > </target> > > > Added: ofbiz/trunk/applications/accounting/config/ > linehandler.properties > URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/config/linehandler.properties?rev=806643&view=auto > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/applications/accounting/config/ > linehandler.properties (added) > +++ ofbiz/trunk/applications/accounting/config/ > linehandler.properties Fri Aug 21 17:00:55 2009 > @@ -0,0 +1,88 @@ > + > ############################################################################### > +# 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. > + > ############################################################################### > + > + > ########################################################################## > +# PaymentechSDK_6.3.0 > +# Build Date: 06/26/2009 > +# Build Time: 09:28:24 > + > ########################################################################## > + > + > ########################################################################## > +# General Properties > + > ########################################################################## > +DTDVersion=PTI47 > + > + > ########################################################################## > +# Transaction Processor Properties > + > ########################################################################## > +TransactionProcessor.poolSize=10 > +TransactionProcessor.retries=2 > + > + > ########################################################################## > +# Java Security Providers > + > ########################################################################## > +#security.provider.1=sun.security.provider.Sun > +#security.provider.2=com.sun.rsajca.Provider > +#security.provider.3=com.sun.net.ssl.internal.ssl.Provider > + > + > ########################################################################## > +# IBM Security Providers > +#For IBM JDK Websphere merchants > +#comment out or remove the above sun security provider list > +#uncomment the following IBM security provider list > +#No need to have any sun related jar files in CLASSPATH for Orbital > SDK > + > ########################################################################## > +#security.provider.1=com.ibm.crypto.provider.IBMJCE > +#security.provider.2=com.ibm.security.jgss.IBMJGSSProvider > + > + > ########################################################################## > +# Engine Properties > + > ########################################################################## > + > +# To specify a non-default location for your truststore (cacerts) > file, > +# uncomment and edit these two lines > +#engine.ssl.trustore.filename=/opt/jdk1.6/jre/lib/security/cacerts > +#engine.ssl.trustore.passphrase=changeit > + > + > + > ########################################################################## > +# XML Templates Configuration > + > ########################################################################## > + > +# Templates > +XMLTemplates.Request.NewOrder=%ofbiz.home%/applications/accounting/ > templates/orbital/NewOrder.xml > +XMLTemplates.Request.EOD=%ofbiz.home%/applications/accounting/ > templates/orbital/EOD.xml > +XMLTemplates.Request.FlexCache=%ofbiz.home%/applications/accounting/ > templates/orbital/FlexCache.xml > +XMLTemplates.Request.MFC=%ofbiz.home%/applications/accounting/ > templates/orbital/MFC.xml > +XMLTemplates.Request.Profile=%ofbiz.home%/applications/accounting/ > templates/orbital/Profile.xml > +XMLTemplates.Request.Reverse=%ofbiz.home%/applications/accounting/ > templates/orbital/Reverse.xml > +XMLTemplates.Request.Inquiry=%ofbiz.home%/applications/accounting/ > templates/orbital/Inquiry.xml > + > +# Complex Type Mappings > +XMLTemplates.Request.ComplexRoot.PC3Core=%ofbiz.home%/applications/ > accounting/templates/orbital/templates/PC3Core.inc > + > XMLTemplates > .Request.ComplexRoot.PC3Core.RecursiveElement1=PC3LineItems > + > XMLTemplates > .Request > .ComplexRoot.PC3Core.RecursiveElement1.CountElement=PC3LineItemCount > + > XMLTemplates > .Request > .ComplexRoot.PC3Core.RecursiveElement1.EnforceGreaterThanZero=yes > + > XMLTemplates.Request.ComplexRoot.PC3Core.RecursiveElement1.MaxCount=98 > + > +XMLTemplates.Request.ComplexRoot.PC3LineItems=%ofbiz.home%/ > applications/accounting/templates/orbital/templates/PC3LineItems.inc > + > XMLTemplates > .Request.ComplexRoot.PC3LineItems.ChildIndexElement=PC3DtlIndex > + > +XMLTemplates.Request.ComplexRoot.SettleRejectBin=%ofbiz.home%/ > applications/accounting/templates/orbital/templates/ > SettleRejectBin.inc > +XMLTemplates.Request.ComplexRoot.PriorAuthID=%ofbiz.home%/ > applications/accounting/templates/orbital/templates/PriorAuthID.inc > > Propchange: ofbiz/trunk/applications/accounting/config/ > linehandler.properties > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: ofbiz/trunk/applications/accounting/config/ > linehandler.properties > ------------------------------------------------------------------------------ > svn:keywords = Date Rev Author URL Id > > Propchange: ofbiz/trunk/applications/accounting/config/ > linehandler.properties > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Modified: ofbiz/trunk/applications/accounting/data/ > AccountingTypeData.xml > URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml?rev=806643&r1=806642&r2=806643&view=diff > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml > (original) > +++ ofbiz/trunk/applications/accounting/data/AccountingTypeData.xml > Fri Aug 21 17:00:55 2009 > @@ -708,7 +708,11 @@ > <PaymentGatewayConfigType paymentGatewayConfigTypeId="WORLDPAY" > hasTable="N" description="RBS WorldPay Payment Gateway"/> > <PaymentGatewayConfig paymentGatewayConfigId="WORLDPAY_CONFIG" > paymentGatewayConfigTypeId="WORLDPAY" description="RBS WorldPay > Config"/> > <PaymentGatewayWorldPay paymentGatewayConfigId="WORLDPAY_CONFIG" > redirectUrl="https://select-test.worldpay.com/wcc/purchase" > instId="" authMode="A" fixContact="N" hideContact="N" > hideCurrency="N" langId="" noLanguageMenu="N" withDelivery="N" > testMode="100"/> > - > + > + <PaymentGatewayConfigType paymentGatewayConfigTypeId="ORBITAL" > hasTable="N" description="Orbital Payment Gateway"/> > + <PaymentGatewayConfig paymentGatewayConfigId="ORBITAL_CONFIG" > paymentGatewayConfigTypeId="ORBITAL" description="Orbital Config"/> > + <PaymentGatewayOrbital paymentGatewayConfigId="ORBITAL_CONFIG" > username="ofbizuser" password="ofbizpwd" merchantId="785240009879" > class="com.paymentech.orbital.sdk.engine.https.HttpsEngine" > hostName="orbitalvar1.paymentech.net" port="443" > hostNameFailover="orbitalvar2.paymentech.net" portFailover="443" > connectionTimeoutSeconds="90" readTimeoutSeconds="90" > authorizationURI="/authorize" sdkVersion="PaymentechSDK_6.3.0" > sslSocketFactory="default" responseType="gateway"/> > + > <!-- Credit Card methods by type --> > <CustomMethodType customMethodTypeId="CC_AUTH" parentTypeId="" > hasTable="N" description="Credit Card authorize methods"/> > <CustomMethodType customMethodTypeId="CC_CAPTURE" > parentTypeId="" hasTable="N" description="Credit Card capture > methods"/> > @@ -754,6 +758,8 @@ > <CustomMethod customMethodId="CC_AUTH_ALWAYSBADNUM" > customMethodTypeId="CC_AUTH" > customMethodName="alwaysBadCardNumberCCProcessor" description="CC > Always decline for bad card number"/> > <CustomMethod customMethodId="CC_AUTH_ALWAYSFAIL" > customMethodTypeId="CC_AUTH" > customMethodName="alwaysBadCardNumberCCProcessor" description="CC > Always fail"/> > <CustomMethod customMethodId="CC_AUTH_CAPTURE_ALWA" > customMethodTypeId="CC_AUTH" > customMethodName="alwaysApproveWithCaptureCCProcessor" > description="CC Always authorize and capture"/> > + <CustomMethod customMethodId="CC_AUTH_ORBITAL" > customMethodTypeId="CC_AUTH" customMethodName="orbitalCCAuth" > description="CC Orbital authorize"/> > + <CustomMethod customMethodId="CC_AUTH_CAPTR_ORBTL" > customMethodTypeId="CC_AUTH" customMethodName="orbitalCCAuthCapture" > description="CC Orbital authorize and capture"/> > > <CustomMethod customMethodId="CC_CAPTURE_TEST" > customMethodTypeId="CC_CAPTURE" customMethodName="testCCCapture" > description="CC Test capture"/> > <CustomMethod customMethodId="CC_CAPTURE_REAUTH" > customMethodTypeId="CC_CAPTURE" > customMethodName="testCCCaptureWithReAuth" description="CC Test > reauth capture"/> > @@ -765,6 +771,7 @@ > <CustomMethod customMethodId="CC_CAPTURE_PCCHARGE" > customMethodTypeId="CC_CAPTURE" customMethodName="pcChargeCCCapture" > description="CC PCCharge capture"/> > <CustomMethod customMethodId="CC_CAPTURE_RITA" > customMethodTypeId="CC_CAPTURE" customMethodName="ritaCCCapture" > description="CC RiTA capture"/> > <CustomMethod customMethodId="CC_CAPTURE_RITA_REMO" > customMethodTypeId="CC_CAPTURE" > customMethodName="ritaCCCaptureRemote" description="CC RiTA remote > capture"/> > + <CustomMethod customMethodId="CC_CAPTURE_ORBITAL" > customMethodTypeId="CC_CAPTURE" customMethodName="orbitalCCCapture" > description="CC Orbital capture"/> > > <CustomMethod customMethodId="CC_REFUND_TEST" > customMethodTypeId="CC_REFUND" customMethodName="testCCRefund" > description="CC Test refund"/> > <CustomMethod customMethodId="CC_REFUND_TEST_FAIL" > customMethodTypeId="CC_REFUND" > customMethodName="testCCRefundFailure" description="CC Test refund > failure"/> > @@ -775,6 +782,7 @@ > <CustomMethod customMethodId="CC_REFUND_PCCHARGE" > customMethodTypeId="CC_REFUND" customMethodName="pcChargeCCRefund" > description="CC PCCharge refund"/> > <CustomMethod customMethodId="CC_REFUND_RITA" > customMethodTypeId="CC_REFUND" customMethodName="ritaCCRefund" > description="CC RiTA refund"/> > <CustomMethod customMethodId="CC_REFUND_RITA_REMOT" > customMethodTypeId="CC_REFUND" customMethodName="ritaCCRefundRemote" > description="CC RiTA remote refund"/> > + <CustomMethod customMethodId="CC_REFUND_ORBITAL" > customMethodTypeId="CC_REFUND" customMethodName="orbitalCCRefund" > description="CC Orbital refund"/> > > <CustomMethod customMethodId="CC_RELEASE_TEST" > customMethodTypeId="CC_RELEASE" customMethodName="testCCRelease" > description="CC Test release"/> > <CustomMethod customMethodId="CC_RELEASE_AIM" > customMethodTypeId="CC_RELEASE" customMethodName="aimCCRelease" > description="CC Authorize dot net release"/> > @@ -784,6 +792,7 @@ > <CustomMethod customMethodId="CC_RELEASE_PCCHARGE" > customMethodTypeId="CC_RELEASE" customMethodName="pcChargeCCRelease" > description="CC PCCharge release"/> > <CustomMethod customMethodId="CC_RELEASE_RITA" > customMethodTypeId="CC_RELEASE" customMethodName="ritaCCRelease" > description="CC RiTA release"/> > <CustomMethod customMethodId="CC_RELEASE_RITA_REMO" > customMethodTypeId="CC_RELEASE" > customMethodName="ritaCCReleaseRemote" description="CC RiTA remote > release"/> > + <CustomMethod customMethodId="CC_RELEASE_ORBITAL" > customMethodTypeId="CC_RELEASE" customMethodName="orbitalCCRelease" > description="CC Orbital release"/> > > <CustomMethod customMethodId="CC_CREDIT_AIM" > customMethodTypeId="CC_CREDIT" customMethodName="aimCCCredit" > description="CC Authorize dot net credit"/> > <CustomMethod customMethodId="CC_CREDIT_CLEARCOMME" > customMethodTypeId="CC_CREDIT" > customMethodName="clearCommerceCCCredit" description="CC Clear > Commerce credit"/> > > Modified: ofbiz/trunk/applications/accounting/entitydef/ > entitymodel.xml > URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml?rev=806643&r1=806642&r2=806643&view=diff > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml > (original) > +++ ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml > Fri Aug 21 17:00:55 2009 > @@ -3223,6 +3223,30 @@ > <key-map field-name="paymentGatewayConfigId"/> > </relation> > </entity> > + <entity entity-name="PaymentGatewayOrbital" > + package-name="org.ofbiz.accounting.payment" > + title="Orbital Payment Gateway Config"> > + <field name="paymentGatewayConfigId" type="id-ne"></field> > + <field name="username" type="short- > varchar"><description>Orbital Username of account information</ > description></field> > + <field name="password" type="value" > encrypt="true"><description>Orbital Password of account information</ > description></field> > + <field name="merchantId" type="value"><description>You > merchant ID</description></field> > + <field name="class" type="value"><description>Class for the > Orbital Gateway - Default should be used - HttpsEngine</ > description></field> > + <field name="hostName" type="value"><description>Address of > the payment processor</description></field> > + <field name="port" type="numeric"><description>Port of the > payment processor</description></field> > + <field name="hostNameFailover" > type="value"><description>Failover Address of the payment processor</ > description></field> > + <field name="portFailover" > type="numeric"><description>Failover Port of the payment processor</ > description></field> > + <field name="connectionTimeoutSeconds" > type="numeric"><description>Timeout</description></field> > + <field name="readTimeoutSeconds" > type="numeric"><description>Read Timeout</description></field> > + <field name="authorizationURI" > type="value"><description>Authorization URI</description></field> > + <field name="sdkVersion" type="short- > varchar"><description>Target Orbital Gateway API version</ > description></field> > + <field name="sslSocketFactory" type="short- > varchar"><description>SSL Socket Factory (default|strict)</ > description></field> > + <field name="responseType" type="short- > varchar"><description>Response Type (gateway|host)</description></ > field> > + <prim-key field="paymentGatewayConfigId"/> > + <relation type="one" fk-name="PGORB_PGC" rel-entity- > name="PaymentGatewayConfig"> > + <key-map field-name="paymentGatewayConfigId"/> > + </relation> > + </entity> > + > <entity entity-name="PaymentGatewayRespMsg" > package-name="org.ofbiz.accounting.payment" > title="Payment Gateway Response Message"> > > Modified: ofbiz/trunk/applications/accounting/ofbiz-component.xml > URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/ofbiz-component.xml?rev=806643&r1=806642&r2=806643&view=diff > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/applications/accounting/ofbiz-component.xml (original) > +++ ofbiz/trunk/applications/accounting/ofbiz-component.xml Fri Aug > 21 17:00:55 2009 > @@ -74,6 +74,7 @@ > <service-resource type="model" loader="main" > location="servicedef/services_rita.xml"/> > <service-resource type="model" loader="main" > location="servicedef/services_valuelink.xml"/> > <service-resource type="model" loader="main" > location="servicedef/services_verisign.xml"/> > + <service-resource type="model" loader="main" > location="servicedef/services_orbital.xml"/> > > <service-resource type="group" loader="main" > location="servicedef/groups.xml"/> > <service-resource type="eca" loader="main" location="servicedef/ > secas.xml"/> > > Added: ofbiz/trunk/applications/accounting/servicedef/ > services_orbital.xml > URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_orbital.xml?rev=806643&view=auto > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/applications/accounting/servicedef/ > services_orbital.xml (added) > +++ ofbiz/trunk/applications/accounting/servicedef/ > services_orbital.xml Fri Aug 21 17:00:55 2009 > @@ -0,0 +1,54 @@ > +<?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>OrbitalGateway Services</description> > + <vendor></vendor> > + <version>1.0</version> > + > + <!-- Chase Orbital Implementations --> > + <service name="orbitalCCAuth" engine="java" > + > location > ="org.ofbiz.accounting.thirdparty.orbital.OrbitalPaymentServices" > invoke="ccAuth"> > + <description>Orbital Payment Authorization</description> > + <implements service="ccAuthInterface"/> > + </service> > + <service name="orbitalCCAuthCapture" engine="java" > + > location > ="org.ofbiz.accounting.thirdparty.orbital.OrbitalPaymentServices" > invoke="ccAuthCapture"> > + <description>Orbital Payment Authorize and Capture service</ > description> > + <implements service="ccAuthInterface"/> > + </service> > + <service name="orbitalCCCapture" engine="java" > + > location > ="org.ofbiz.accounting.thirdparty.orbital.OrbitalPaymentServices" > invoke="ccCapture"> > + <description>Orbital Payment Capture Service</description> > + <implements service="ccCaptureInterface"/> > + </service> > + <service name="orbitalCCRefund" engine="java" > + > location > ="org.ofbiz.accounting.thirdparty.orbital.OrbitalPaymentServices" > invoke="ccRefund"> > + <description>Orbital Payment Refund Service</description> > + <implements service="paymentRefundInterface"/> > + </service> > + <service name="orbitalCCRelease" engine="java" > + > location > ="org.ofbiz.accounting.thirdparty.orbital.OrbitalPaymentServices" > invoke="ccRelease"> > + <description>Orbital Payment Release Service</description> > + <implements service="paymentReleaseInterface"/> > + </service> > + > +</services> > > Propchange: ofbiz/trunk/applications/accounting/servicedef/ > services_orbital.xml > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: ofbiz/trunk/applications/accounting/servicedef/ > services_orbital.xml > ------------------------------------------------------------------------------ > svn:keywords = Date Rev Author URL Id > > Propchange: ofbiz/trunk/applications/accounting/servicedef/ > services_orbital.xml > ------------------------------------------------------------------------------ > svn:mime-type = text/xml > > Added: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/ > thirdparty/orbital/OrbitalPaymentServices.java > URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/orbital/OrbitalPaymentServices.java?rev=806643&view=auto > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/ > thirdparty/orbital/OrbitalPaymentServices.java (added) > +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/ > thirdparty/orbital/OrbitalPaymentServices.java Fri Aug 21 17:00:55 > 2009 > @@ -0,0 +1,647 @@ > +/ > ******************************************************************************* > + * 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.orbital; > + > +import java.math.BigDecimal; > +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.UtilFormatOut; > +import org.ofbiz.base.util.UtilMisc; > +import org.ofbiz.base.util.UtilNumber; > +import org.ofbiz.base.util.UtilValidate; > +import org.ofbiz.entity.GenericDelegator; > +import org.ofbiz.entity.GenericEntityException; > +import org.ofbiz.entity.GenericValue; > +import org.ofbiz.entity.util.EntityUtil; > +import org.ofbiz.service.DispatchContext; > +import org.ofbiz.service.ModelService; > +import org.ofbiz.service.ServiceUtil; > + > +import com.paymentech.orbital.sdk.configurator.Configurator; > +import com.paymentech.orbital.sdk.interfaces.RequestIF; > +import com.paymentech.orbital.sdk.interfaces.ResponseIF; > +import com.paymentech.orbital.sdk.interfaces.TransactionProcessorIF; > +import com.paymentech.orbital.sdk.request.FieldNotFoundException; > +import com.paymentech.orbital.sdk.request.Request; > +import > com.paymentech.orbital.sdk.transactionProcessor.TransactionException; > +import > com.paymentech.orbital.sdk.transactionProcessor.TransactionProcessor; > +import > com.paymentech.orbital.sdk.util.exceptions.InitializationException; > + > +public class OrbitalPaymentServices { > + > + public static String module = > OrbitalPaymentServices.class.getName(); > + private static int decimals = > UtilNumber.getBigDecimalScale("invoice.decimals"); > + private static int rounding = > UtilNumber.getBigDecimalRoundingMode("invoice.rounding"); > + > + public static String APPROVED = "Approved"; > + public static String DECLINED = "Declined"; > + public static String ERROR = "Error"; > + > + public static final String BIN_VALUE = "000002"; > + public static TransactionProcessorIF tp = null; > + public static ResponseIF response = null; > + public static RequestIF request = null; > + > + public static Map<String, Object> ccAuth(DispatchContext ctx, > Map<String, Object> context) { > + GenericDelegator delegator = ctx.getDelegator(); > + Map<String, Object> results = ServiceUtil.returnSuccess(); > + Map<String, Object> props = buildOrbitalProperties(context, > delegator); > + props.put("transType", "AUTH_ONLY"); > + //Tell the request object which template to use (see > RequestIF.java) > + try { > + request = new Request(RequestIF.NEW_ORDER_TRANSACTION); > + } catch (InitializationException e) { > + Debug.logError("Error in request initialization", > module); > + e.printStackTrace(); > + } > + buildAuthOrAuthCaptureTransaction(context, delegator, > props, request, results); > + Map<String, Object> validateResults = > validateRequest(context, props, request); > + String respMsg = (String) > validateResults.get(ModelService.RESPONSE_MESSAGE); > + if (ModelService.RESPOND_ERROR.equals(respMsg)) { > + results.put(ModelService.ERROR_MESSAGE, "Validation > Failed - invalid values"); > + return results; > + } > + initializeTransactionProcessor(); > + Map<String, Object> processCardResponseContext = > processCard(request); > + // For Debugging Purpose > + printTransResult((ResponseIF) > processCardResponseContext.get("processCardResponse")); > + processAuthTransResult(processCardResponseContext, results); > + return results; > + } > + > + public static Map<String, Object> ccAuthCapture(DispatchContext > ctx, Map<String, Object> context) { > + GenericDelegator delegator = ctx.getDelegator(); > + Map<String, Object> results = ServiceUtil.returnSuccess(); > + Map<String, Object> props = buildOrbitalProperties(context, > delegator); > + props.put("transType", "AUTH_CAPTURE"); > + //Tell the request object which template to use (see > RequestIF.java) > + try { > + request = new Request(RequestIF.NEW_ORDER_TRANSACTION); > + } catch (InitializationException e) { > + Debug.logError("Error in request initialization", > module); > + e.printStackTrace(); > + } > + buildAuthOrAuthCaptureTransaction(context, delegator, > props, request, results); > + Map<String, Object> validateResults = > validateRequest(context, props, request); > + String respMsg = (String) > validateResults.get(ModelService.RESPONSE_MESSAGE); > + if (ModelService.RESPOND_ERROR.equals(respMsg)) { > + results.put(ModelService.ERROR_MESSAGE, "Validation > Failed - invalid values"); > + return results; > + } > + initializeTransactionProcessor(); > + Map<String, Object> processCardResponseContext = > processCard(request); > + // For Debugging Purpose > + printTransResult((ResponseIF) > processCardResponseContext.get("processCardResponse")); > + processAuthCaptureTransResult(processCardResponseContext, > results); > + return results; > + } > + > + public static Map<String, Object> ccCapture(DispatchContext > ctx, Map<String, Object> context) { > + GenericDelegator delegator = ctx.getDelegator(); > + Map<String, Object> results = ServiceUtil.returnSuccess(); > + Map<String, Object> props = buildOrbitalProperties(context, > delegator); > + > + GenericValue orderPaymentPreference = (GenericValue) > context.get("orderPaymentPreference"); > + GenericValue creditCard = null; > + try { > + creditCard = > delegator.getRelatedOne("CreditCard",orderPaymentPreference); > + } catch (GenericEntityException e) { > + Debug.logError(e, module); > + return ServiceUtil.returnError("Unable to obtain cc > information from payment preference"); > + } > + GenericValue authTransaction = > PaymentGatewayServices.getAuthTransaction(orderPaymentPreference); > + if (authTransaction == null) { > + return ServiceUtil.returnError("No authorization > transaction found for the OrderPaymentPreference; cannot Capture"); > + } > + context.put("creditCard", creditCard); > + context.put("authTransaction", authTransaction); > + context.put("orderId", > orderPaymentPreference.getString("orderId")); > + > + props.put("transType", "PRIOR_AUTH_CAPTURE"); > + //Tell the request object which template to use (see > RequestIF.java) > + try { > + request = new > Request(RequestIF.MARK_FOR_CAPTURE_TRANSACTION); > + } catch (InitializationException e) { > + Debug.logError("Error in request initialization", > module); > + e.printStackTrace(); > + } > + buildCaptureTransaction(context, delegator, props, request, > results); > + Map<String, Object> validateResults = > validateRequest(context, props, request); > + String respMsg = (String) > validateResults.get(ModelService.RESPONSE_MESSAGE); > + if (ModelService.RESPOND_ERROR.equals(respMsg)) { > + results.put(ModelService.ERROR_MESSAGE, "Validation > Failed - invalid values"); > + return results; > + } > + initializeTransactionProcessor(); > + Map<String, Object> processCardResponseContext = > processCard(request); > + // For Debugging Purpose > + printTransResult((ResponseIF) > processCardResponseContext.get("processCardResponse")); > + processCaptureTransResult(processCardResponseContext, > results); > + return results; > + } > + > + public static Map<String, Object> ccRefund(DispatchContext ctx, > Map<String, Object> context) { > + GenericDelegator delegator = ctx.getDelegator(); > + Map<String, Object> results = ServiceUtil.returnSuccess(); > + Map<String, Object> props = buildOrbitalProperties(context, > delegator); > + GenericValue orderPaymentPreference = (GenericValue) > context.get("orderPaymentPreference"); > + GenericValue creditCard = null; > + try { > + creditCard = > delegator.getRelatedOne("CreditCard",orderPaymentPreference); > + } catch (GenericEntityException e) { > + Debug.logError(e, module); > + return ServiceUtil.returnError("Unable to obtain cc > information from payment preference"); > + } > + GenericValue authTransaction = > PaymentGatewayServices.getAuthTransaction(orderPaymentPreference); > + if (authTransaction == null) { > + return ServiceUtil.returnError("No authorization > transaction found for the OrderPaymentPreference; cannot refund"); > + } > + context.put("creditCard", creditCard); > + context.put("authTransaction", authTransaction); > + context.put("orderId", > orderPaymentPreference.getString("orderId")); > + > + //Tell the request object which template to use (see > RequestIF.java) > + try { > + request = new Request(RequestIF.NEW_ORDER_TRANSACTION); > + } catch (InitializationException e) { > + Debug.logError("Error in request initialization", > module); > + e.printStackTrace(); > + } > + buildRefundTransaction(context, props, request, results); > + Map<String, Object> validateResults = > validateRequest(context, props, request); > + String respMsg = (String) > validateResults.get(ModelService.RESPONSE_MESSAGE); > + if (ModelService.RESPOND_ERROR.equals(respMsg)) { > + results.put(ModelService.ERROR_MESSAGE, "Validation > Failed - invalid values"); > + return results; > + } > + initializeTransactionProcessor(); > + Map<String, Object> processCardResponseContext = > processCard(request); > + // For Debugging Purpose > + printTransResult((ResponseIF) > processCardResponseContext.get("processCardResponse")); > + processRefundTransResult(processCardResponseContext, > results); > + return results; > + } > + > + public static Map<String, Object> ccRelease(DispatchContext > ctx, Map<String, Object> context) { > + GenericDelegator delegator = ctx.getDelegator(); > + Map<String, Object> results = ServiceUtil.returnSuccess(); > + Map<String, Object> props = buildOrbitalProperties(context, > delegator); > + > + GenericValue orderPaymentPreference = (GenericValue) > context.get("orderPaymentPreference"); > + GenericValue creditCard = null; > + try { > + creditCard = > delegator.getRelatedOne("CreditCard",orderPaymentPreference); > + } catch (GenericEntityException e) { > + Debug.logError(e, module); > + return ServiceUtil.returnError("Unable to obtain cc > information from payment preference"); > + } > + GenericValue authTransaction = > PaymentGatewayServices.getAuthTransaction(orderPaymentPreference); > + if (authTransaction == null) { > + return ServiceUtil.returnError("No authorization > transaction found for the OrderPaymentPreference; cannot release"); > + } > + context.put("authTransaction", authTransaction); > + context.put("orderId", > orderPaymentPreference.getString("orderId")); > + > + //Tell the request object which template to use (see > RequestIF.java) > + try { > + request = new Request(RequestIF.REVERSE_TRANSACTION); > + } catch (InitializationException e) { > + Debug.logError("Error in request initialization", > module); > + e.printStackTrace(); > + } > + buildReleaseTransaction(context, delegator, props, request, > results); > + Map<String, Object> validateResults = > validateRequest(context, props, request); > + String respMsg = (String) > validateResults.get(ModelService.RESPONSE_MESSAGE); > + if (ModelService.RESPOND_ERROR.equals(respMsg)) { > + results.put(ModelService.ERROR_MESSAGE, "Validation > Failed - invalid values"); > + return results; > + } > + initializeTransactionProcessor(); > + Map<String, Object> processCardResponseContext = > processCard(request); > + // For Debugging Purpose > + printTransResult((ResponseIF) > processCardResponseContext.get("processCardResponse")); > + processReleaseTransResult(processCardResponseContext, > results); > + return results; > + } > + > + > + private static Map<String, Object> > buildOrbitalProperties(Map<String, Object> context, GenericDelegator > delegator) { > + //TODO: Will move this to property file and then will read > it from there. > + String configFile = "/applications/accounting/config/ > linehandler.properties"; > + String paymentGatewayConfigId = (String) > context.get("paymentGatewayConfigId"); > + Map<String, Object> buildConfiguratorContext = > FastMap.newInstance(); > + try { > + > buildConfiguratorContext.put("OrbitalConnectionUsername", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "username")); > + > buildConfiguratorContext.put("OrbitalConnectionPassword", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "password")); > + buildConfiguratorContext.put("merchantId", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "merchantId")); > + buildConfiguratorContext.put("engine.class", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "class")); > + buildConfiguratorContext.put("engine.hostname", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "hostName")); > + buildConfiguratorContext.put("engine.port", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "port")); > + > buildConfiguratorContext.put("engine.hostname.failover", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "hostNameFailover")); > + buildConfiguratorContext.put("engine.port.failover", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "portFailover")); > + > buildConfiguratorContext.put("engine.connection_timeout_seconds", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "connectionTimeoutSeconds")); > + > buildConfiguratorContext.put("engine.read_timeout_seconds", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "readTimeoutSeconds")); > + buildConfiguratorContext.put("engine.authorizationURI", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "authorizationURI")); > + buildConfiguratorContext.put("engine.sdk_version", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "sdkVersion")); > + > buildConfiguratorContext.put("engine.ssl.socketfactory", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "sslSocketFactory")); > + buildConfiguratorContext.put("Response.response_type", > getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, > "responseType")); > + String configFileLocation = > System.getProperty("ofbiz.home") + configFile; > + Configurator config = > Configurator.getInstance(configFileLocation); > + > buildConfiguratorContext.putAll(config.getConfigurations()); > + config.setConfigurations(buildConfiguratorContext); > + } catch (InitializationException e) { > + Debug.logError("Orbital Configurator Initialization > Error: " + e.getMessage(), module); > + e.printStackTrace(); > + } > + return buildConfiguratorContext; > + } > + > + private static String > getPaymentGatewayConfigValue(GenericDelegator delegator, String > paymentGatewayConfigId, > + String paymentGatewayConfigParameterName) { > + String returnValue = ""; > + if (UtilValidate.isNotEmpty(paymentGatewayConfigId)) { > + try { > + GenericValue paymentGatewayOrbital = > delegator.findOne("PaymentGatewayOrbital", > UtilMisc.toMap("paymentGatewayConfigId", paymentGatewayConfigId), > false); > + if (UtilValidate.isNotEmpty(paymentGatewayOrbital)) { > + Object paymentGatewayOrbitalField = > paymentGatewayOrbital.get(paymentGatewayConfigParameterName); > + if > (UtilValidate.isNotEmpty(paymentGatewayOrbitalField)) { > + return returnValue = > paymentGatewayOrbitalField.toString().trim(); > + } > + } > + } catch (GenericEntityException e) { > + Debug.logError(e, module); > + } > + } > + return returnValue; > + } > + > + private static void > buildAuthOrAuthCaptureTransaction(Map<String, Object> params, > GenericDelegator delegator, Map<String, Object> props, RequestIF > request, Map<String, Object> results) { > + GenericValue cc = (GenericValue) params.get("creditCard"); > + BigDecimal amount = (BigDecimal) params.get("processAmount"); > + String amountValue = amount.setScale(decimals, > rounding).movePointRight(2).toPlainString(); > + String number = > UtilFormatOut.checkNull(cc.getString("cardNumber")); > + String expDate = > UtilFormatOut.checkNull(cc.getString("expireDate")); > + expDate = formatExpDateForOrbital(expDate); > + String cardSecurityCode = (String) > params.get("cardSecurityCode"); > + String orderId = > UtilFormatOut.checkNull((String)params.get("orderId")); > + String transType = props.get("transType").toString(); > + String messageType = null; > + if ("AUTH_ONLY".equals(transType)) { > + messageType = "A"; > + } else if ("AUTH_CAPTURE".equals(transType)) { > + messageType = "AC"; > + } > + try { > + request.setFieldValue("IndustryType", "EC"); > + request.setFieldValue("MessageType", > UtilFormatOut.checkNull(messageType)); > + request.setFieldValue("MerchantID", > UtilFormatOut.checkNull(props.get("merchantId").toString())); > + request.setFieldValue("BIN", BIN_VALUE); > + request.setFieldValue("OrderID", > UtilFormatOut.checkNull(orderId)); > + request.setFieldValue("AccountNum", > UtilFormatOut.checkNull(number)); > + > + request.setFieldValue("Amount", > UtilFormatOut.checkNull(amountValue)); > + request.setFieldValue("Exp", > UtilFormatOut.checkNull(expDate)); > + // AVS Information > + GenericValue creditCard = null; > + if (params.get("orderPaymentPreference") != null) { > + GenericValue opp = (GenericValue) > params.get("orderPaymentPreference"); > + if > ("CREDIT_CARD".equals(opp.getString("paymentMethodTypeId"))) { > + // sometimes the ccAuthCapture interface is > used, in which case the creditCard is passed directly > + creditCard = (GenericValue) > params.get("creditCard"); > + if (creditCard == null || ! > (opp > .get("paymentMethodId").equals(creditCard.get("paymentMethodId")))) { > + creditCard = opp.getRelatedOne("CreditCard"); > + } > + } > + > + request.setFieldValue("AVSname", "Demo Customer"); > + if > (UtilValidate.isNotEmpty(creditCard.getString("contactMechId"))) { > + GenericValue address = > creditCard.getRelatedOne("PostalAddress"); > + if (address != null) { > + request.setFieldValue("AVSaddress1", > UtilFormatOut.checkNull(address.getString("address1"))); > + request.setFieldValue("AVScity", > UtilFormatOut.checkNull(address.getString("city"))); > + request.setFieldValue("AVSstate", > UtilFormatOut.checkNull(address.getString("stateProvinceGeoId"))); > + request.setFieldValue("AVSzip", > UtilFormatOut.checkNull(address.getString("postalCode"))); > + } > + } > + } else { > + // this would be the case for an authorization > + GenericValue cp = > (GenericValue)params.get("billToParty"); > + GenericValue ba = > (GenericValue)params.get("billingAddress"); > + request.setFieldValue("AVSname", > UtilFormatOut.checkNull(cp.getString("firstName")) + > UtilFormatOut.checkNull(cp.getString("lastName"))); > + request.setFieldValue("AVSaddress1", > UtilFormatOut.checkNull(ba.getString("address1"))); > + request.setFieldValue("AVScity", > UtilFormatOut.checkNull(ba.getString("city"))); > + request.setFieldValue("AVSstate", > UtilFormatOut.checkNull(ba.getString("stateProvinceGeoId"))); > + request.setFieldValue("AVSzip", > UtilFormatOut.checkNull(ba.getString("postalCode"))); > + request.setFieldValue("AVSCountryCode", > UtilFormatOut.checkNull(ba.getString("countryGeoId"))); > + } > + // Additional Information > + request.setFieldValue("Comments", "This is building of > request object"); > + String shippingRef = getShippingRefForOrder(orderId, > delegator); > + request.setFieldValue("ShippingRef", shippingRef); > + request.setFieldValue("CardSecVal", > UtilFormatOut.checkNull(cardSecurityCode)); > + > + //Display the request > + if ("AUTH_ONLY".equals(transType)) { > + Debug.log("\nAuth Request:\n ======== " + > request.getXML()); > + } else if ("AUTH_CAPTURE".equals(transType)) { > + Debug.log("\nAuth Capture Request:\n ======== " + > request.getXML()); > + } > + results.put("processAmount", amount); > + } catch (InitializationException ie) { > + Debug.logInfo("Unable to initialize request object", > module); > + } catch (FieldNotFoundException fnfe) { > + Debug.logError("Unable to find XML field in template", > module); > + } catch (Exception e) { > + e.printStackTrace(); > + } > + } > + > + private static void buildCaptureTransaction(Map<String, Object> > params, GenericDelegator delegator, Map<String, Object> props, > RequestIF request, Map<String, Object> results) { > + GenericValue authTransaction = (GenericValue) > params.get("authTransaction"); > + GenericValue creditCard = (GenericValue) > params.get("creditCard"); > + BigDecimal amount = (BigDecimal) params.get("captureAmount"); > + String amountValue = amount.setScale(decimals, > rounding).movePointRight(2).toPlainString(); > + String orderId = > UtilFormatOut.checkNull((String)params.get("orderId")); > + try { > + //If there were no errors preparing the template, we > can now specify the data > + //Basic Auth Fields > + request.setFieldValue("MerchantID", > UtilFormatOut.checkNull(props.get("merchantId").toString())); > + request.setFieldValue("BIN", BIN_VALUE); > + request.setFieldValue("TxRefNum", > UtilFormatOut > .checkNull(authTransaction.get("referenceNum").toString())); > + request.setFieldValue("OrderID", > UtilFormatOut.checkNull(orderId)); > + request.setFieldValue("Amount", > UtilFormatOut.checkNull(amountValue)); > + > + request.setFieldValue("PCDestName", > UtilFormatOut.checkNull(creditCard.getString("firstNameOnCard") + > creditCard.getString("lastNameOnCard"))); > + if > (UtilValidate.isNotEmpty(creditCard.getString("contactMechId"))) { > + GenericValue address = > creditCard.getRelatedOne("PostalAddress"); > + if (address != null) { > + request.setFieldValue("PCOrderNum", > UtilFormatOut.checkNull(orderId)); > + request.setFieldValue("PCDestAddress1", > UtilFormatOut.checkNull(address.getString("address1"))); > + request.setFieldValue("PCDestAddress2", > UtilFormatOut.checkNull(address.getString("address2"))); > + request.setFieldValue("PCDestCity", > UtilFormatOut.checkNull(address.getString("city"))); > + request.setFieldValue("PCDestState", > UtilFormatOut.checkNull(address.getString("stateProvinceGeoId"))); > + request.setFieldValue("PCDestZip", > UtilFormatOut.checkNull(address.getString("postalCode"))); > + } > + } > + //Display the request > + Debug.log("\nCapture Request:\n ======== " + > request.getXML()); > + results.put("captureAmount", amount); > + } catch (InitializationException ie) { > + Debug.logInfo("Unable to initialize request object", > module); > + } catch (FieldNotFoundException fnfe) { > + Debug.logError("Unable to find XML field in template" + > fnfe.getMessage(), module); > + } catch (Exception e) { > + e.printStackTrace(); > + } > + } > + > + private static void buildRefundTransaction(Map<String, Object> > params, Map<String, Object> props, RequestIF request, Map<String, > Object> results) { > + GenericValue cc = (GenericValue) params.get("creditCard"); > + BigDecimal amount = (BigDecimal) params.get("refundAmount"); > + String amountValue = amount.setScale(decimals, > rounding).movePointRight(2).toPlainString(); > + String number = > UtilFormatOut.checkNull(cc.getString("cardNumber")); > + String expDate = > UtilFormatOut.checkNull(cc.getString("expireDate")); > + expDate = formatExpDateForOrbital(expDate); > + String orderId = > UtilFormatOut.checkNull((String)params.get("orderId")); > + try { > + //If there were no errors preparing the template, we > can now specify the data > + //Basic Auth Fields > + request.setFieldValue("IndustryType", "EC"); > + request.setFieldValue("MessageType", "R"); > + request.setFieldValue("MerchantID", > UtilFormatOut.checkNull(props.get("merchantId").toString())); > + request.setFieldValue("BIN", BIN_VALUE); > + request.setFieldValue("OrderID", > UtilFormatOut.checkNull(orderId)); > + request.setFieldValue("AccountNum", > UtilFormatOut.checkNull(number)); > + request.setFieldValue("Amount", > UtilFormatOut.checkNull(amountValue)); > + request.setFieldValue("Exp", > UtilFormatOut.checkNull(expDate)); > + request.setFieldValue("Comments", "This is a credit > card refund"); > + > + Debug.log("\nRefund Request:\n ======== " + > request.getXML()); > + results.put("refundAmount", amount); > + } catch (InitializationException ie) { > + Debug.logInfo("Unable to initialize request object", > module); > + } catch (FieldNotFoundException fnfe) { > + Debug.logError("Unable to find XML field in template", > module); > + } catch (Exception e) { > + e.printStackTrace(); > + } > + } > + > + private static void buildReleaseTransaction(Map<String, Object> > params, GenericDelegator delegator, Map<String, Object> props, > RequestIF request, Map<String, Object> results) { > + BigDecimal amount = (BigDecimal) params.get("releaseAmount"); > + GenericValue authTransaction = (GenericValue) > params.get("authTransaction"); > + String orderId = > UtilFormatOut.checkNull((String)params.get("orderId")); > + try { > + //If there were no errors preparing the template, we > can now specify the data > + //Basic Auth Fields > + request.setFieldValue("MerchantID", > UtilFormatOut.checkNull(props.get("merchantId").toString())); > + request.setFieldValue("BIN", BIN_VALUE); > + request.setFieldValue("TxRefNum", > UtilFormatOut > .checkNull(authTransaction.get("referenceNum").toString())); > + request.setFieldValue("OrderID", > UtilFormatOut.checkNull(orderId)); > + > + //Display the request > + Debug.log("\nRelease Request:\n ======== " + > request.getXML()); > + results.put("releaseAmount", amount); > + } catch (InitializationException ie) { > + Debug.logInfo("Unable to initialize request object", > module); > + } catch (FieldNotFoundException fnfe) { > + Debug.logError("Unable to find XML field in template" + > fnfe.getMessage(), module); > + } catch (Exception e) { > + e.printStackTrace(); > + } > + } > + > + > + private static void initializeTransactionProcessor() { > + //Create a Transaction Processor > + //The Transaction Processor acquires and releases resources > and executes transactions. > + //It configures a pool of protocol engines, then uses the > pool to execute transactions. > + try { > + tp = new TransactionProcessor(); > + } catch (InitializationException iex) { > + Debug.logError("TransactionProcessor failed to > initialize" + iex.getMessage(), module); > + iex.printStackTrace(); > + } > + } > + > + private static Map<String, Object> processCard(RequestIF > request) { > + Map<String, Object> processCardResult = > FastMap.newInstance(); > + try { > + response = tp.process(request); > + if (response.isApproved()) { > + processCardResult.put("authResult", Boolean.TRUE); > + } else { > + processCardResult.put("authResult", Boolean.FALSE); > + } > + processCardResult.put("processCardResponse", response); > + } catch (TransactionException tex) { > + Debug.logError("TransactionProcessor failed to > initialize" + tex.getMessage(), module); > + tex.printStackTrace(); > + } > + processCardResult.put(ModelService.RESPONSE_MESSAGE, > ModelService.RESPOND_SUCCESS); > + return processCardResult; > + } > + > + private static void processAuthTransResult(Map<String, Object> > processCardResponseContext, Map<String, Object> results) { > + ResponseIF response = (ResponseIF) > processCardResponseContext.get("processCardResponse"); > + Boolean authResult = (Boolean) > processCardResponseContext.get("authResult"); > + results.put("authResult", new > Boolean(authResult.booleanValue())); > + results.put("authFlag", response.getResponseCode()); > + results.put("authMessage", response.getMessage()); > + if (authResult.booleanValue()) { //passed > + results.put("authCode", response.getAuthCode()); > + results.put("authRefNum", response.getTxRefNum()); > + results.put("cvCode", > UtilFormatOut.checkNull(response.getCVV2RespCode())); > + results.put("avsCode", response.getAVSResponseCode()); > + results.put("processAmount", new > BigDecimal(results.get("processAmount").toString())); > + } else { > + results.put("authCode", response.getAuthCode()); > + results.put("processAmount", new BigDecimal("0.00")); > + results.put("authRefNum", OrbitalPaymentServices.ERROR); > + } > + Debug.logInfo("processAuthTransResult: " + > results.toString(),module); > + } > + > + private static void processAuthCaptureTransResult(Map<String, > Object> processCardResponseContext, Map<String, Object> results) { > + ResponseIF response = (ResponseIF) > processCardResponseContext.get("processCardResponse"); > + Boolean authResult = (Boolean) > processCardResponseContext.get("authResult"); > + results.put("authResult", new > Boolean(authResult.booleanValue())); > + results.put("authFlag", response.getResponseCode()); > + results.put("authMessage", response.getMessage()); > + results.put("captureResult", new > Boolean(authResult.booleanValue())); > + results.put("captureFlag", response.getResponseCode()); > + results.put("captureMessage", response.getMessage()); > + results.put("captureRefNum", response.getTxRefNum()); > + if (authResult.booleanValue()) { //passed > + results.put("authCode", response.getAuthCode()); > + results.put("authRefNum", response.getTxRefNum()); > + results.put("cvCode", > UtilFormatOut.checkNull(response.getCVV2RespCode())); > + results.put("avsCode", response.getAVSResponseCode()); > + results.put("processAmount", new > BigDecimal(results.get("processAmount").toString())); > + } else { > + results.put("authCode", response.getAuthCode()); > + results.put("processAmount", new BigDecimal("0.00")); > + results.put("authRefNum", OrbitalPaymentServices.ERROR); > + } > + Debug.logInfo("processAuthCaptureTransResult: " + > results.toString(),module); > + } > + > + private static void processCaptureTransResult(Map<String, > Object> processCardResponseContext, Map<String, Object> results) { > + ResponseIF response = (ResponseIF) > processCardResponseContext.get("processCardResponse"); > + Boolean captureResult = (Boolean) > processCardResponseContext.get("authResult"); > + results.put("captureResult", new > Boolean(captureResult.booleanValue())); > + results.put("captureFlag", response.getResponseCode()); > + results.put("captureMessage", response.getMessage()); > + results.put("captureRefNum", response.getTxRefNum()); > + if (captureResult.booleanValue()) { //passed > + results.put("captureCode", response.getAuthCode()); > + results.put("captureAmount", new > BigDecimal(results.get("captureAmount").toString())); > + } else { > + results.put("captureAmount", new BigDecimal("0.00")); > + } > + Debug.logInfo("processCaptureTransResult: " + > results.toString(),module); > + } > + > + private static void processRefundTransResult(Map<String, > Object> processCardResponseContext, Map<String, Object> results) { > + ResponseIF response = (ResponseIF) > processCardResponseContext.get("processCardResponse"); > + Boolean refundResult = (Boolean) > processCardResponseContext.get("authResult"); > + results.put("refundResult", new > Boolean(refundResult.booleanValue())); > + results.put("refundFlag", response.getResponseCode()); > + results.put("refundMessage", response.getMessage()); > + results.put("refundRefNum", response.getTxRefNum()); > + if (refundResult.booleanValue()) { //passed > + results.put("refundCode", response.getAuthCode()); > + results.put("refundAmount", new > BigDecimal(results.get("refundAmount").toString())); > + } else { > + results.put("refundAmount", new BigDecimal("0.00")); > + } > + Debug.logInfo("processRefundTransResult: " + > results.toString(),module); > + } > + > + private static void processReleaseTransResult(Map<String, > Object> processCardResponseContext, Map<String, Object> results) { > + ResponseIF response = (ResponseIF) > processCardResponseContext.get("processCardResponse"); > + Boolean releaseResult = (Boolean) > processCardResponseContext.get("authResult"); > + results.put("releaseResult", new > Boolean(releaseResult.booleanValue())); > + results.put("releaseFlag", response.getResponseCode()); > + results.put("releaseMessage", response.getMessage()); > + results.put("releaseRefNum", response.getTxRefNum()); > + if (releaseResult.booleanValue()) { //passed > + results.put("releaseCode", response.getAuthCode()); > + results.put("releaseAmount", new > BigDecimal(results.get("releaseAmount").toString())); > + } else { > + results.put("releaseAmount", new BigDecimal("0.00")); > + } > + Debug.logInfo("processReleaseTransResult: " + > results.toString(),module); > + } > + > + private static void printTransResult(ResponseIF response) { > + Map<String, Object> generatedResponse = > FastMap.newInstance(); > + generatedResponse.put("isGood", response.isGood()); > + generatedResponse.put("isError", response.isError()); > + generatedResponse.put("isQuickResponse", > response.isQuickResponse()); > + generatedResponse.put("isApproved", response.isApproved()); > + generatedResponse.put("isDeclined", response.isDeclined()); > + generatedResponse.put("AuthCode", response.getAuthCode()); > + generatedResponse.put("TxRefNum", response.getTxRefNum()); > + generatedResponse.put("ResponseCode", > response.getResponseCode()); > + generatedResponse.put("Status", response.getStatus()); > + generatedResponse.put("Message", response.getMessage()); > + generatedResponse.put("AVSCode", > response.getAVSResponseCode()); > + generatedResponse.put("CVV2ResponseCode", > response.getCVV2RespCode()); > + > + Debug.logInfo("printTransResult === " + > generatedResponse.toString(),module); > + } > + > + private static String formatExpDateForOrbital(String expDate) { > + String formatedDate = expDate.substring(0, 2) + > expDate.substring(5); > + return formatedDate; > + } > + > + private static String getShippingRefForOrder(String orderId, > GenericDelegator delegator) { > + String shippingRef = ""; > + try { > + GenericValue orderHeader = > delegator.findOne("OrderHeader", false, UtilMisc.toMap("orderId", > orderId)); > + GenericValue trackingCodeOrder = > EntityUtil.getFirst(orderHeader.getRelated("TrackingCodeOrder")); > + GenericValue trackingCode = null; > + if (UtilValidate.isNotEmpty(trackingCodeOrder)) { > + trackingCode = > trackingCodeOrder.getRelatedOne("TrackingCode"); > + } > + if (UtilValidate.isNotEmpty(trackingCode) && > UtilValidate.isNotEmpty(trackingCode.getString("description"))) { > + // get tracking code description and provide it > into shipping reference. > + shippingRef = > trackingCode.getString("trackingCodeId") + "====" + > trackingCode.getString("description"); > + } else { > + shippingRef = "No Tracking Info processed in order"; > + } > + } catch (GenericEntityException e) { > + Debug.logError("Shipping Ref not found returning empty > string", module); > + e.printStackTrace(); > + } > + return shippingRef; > + } > + > + private static Map<String, Object> validateRequest(Map<String, > Object> params, Map props, RequestIF request) { > + Map<String, Object> result = FastMap.newInstance(); > + result.put(ModelService.RESPONSE_MESSAGE, > ModelService.RESPOND_SUCCESS); > + return result; > + } > +} > \ No newline at end of file > > Propchange: ofbiz/trunk/applications/accounting/src/org/ofbiz/ > accounting/thirdparty/orbital/OrbitalPaymentServices.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: ofbiz/trunk/applications/accounting/src/org/ofbiz/ > accounting/thirdparty/orbital/OrbitalPaymentServices.java > ------------------------------------------------------------------------------ > svn:keywords = Date Rev Author URL Id > > Propchange: ofbiz/trunk/applications/accounting/src/org/ofbiz/ > accounting/thirdparty/orbital/OrbitalPaymentServices.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Modified: ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml > URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml?rev=806643&r1=806642&r2=806643&view=diff > = > = > = > = > = > = > = > = > ====================================================================== > --- ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml > (original) > +++ ofbiz/trunk/specialpurpose/ecommerce/data/DemoProduct.xml Fri > Aug 21 17:00:55 2009 > @@ -84,6 +84,12 @@ > <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="EXT_PAYPAL" > paymentServiceTypeEnumId="PRDS_PAY_REFUND" paymentService="" > paymentCustomMethodId="PAYPAL_REFUND" > paymentGatewayConfigId="PAYPAL_CONFIG"/> > <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="EXT_PAYPAL" > paymentServiceTypeEnumId="PRDS_PAY_RELEASE" paymentService="" > paymentCustomMethodId="PAYPAL_CAPTURE" > paymentGatewayConfigId="PAYPAL_CONFIG"/> > --> > + <!-- Example Orbital Gateway Settings --> > + <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="CREDIT_CARD" > paymentServiceTypeEnumId="PRDS_PAY_REAUTH" > paymentService="orbitalCCAuth" > paymentCustomMethodId="CC_AUTH_ORBITAL" > paymentGatewayConfigId="ORBITAL_CONFIG"/> > + <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="CREDIT_CARD" > paymentServiceTypeEnumId="PRDS_PAY_AUTH" > paymentService="orbitalCCAuthCapture" > paymentCustomMethodId="CC_AUTH_CAPTR_ORBTL" > paymentGatewayConfigId="ORBITAL_CONFIG"/> > + <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="CREDIT_CARD" > paymentServiceTypeEnumId="PRDS_PAY_CAPTURE" > paymentService="orbitalCCCapture" > paymentCustomMethodId="CC_CAPTURE_ORBITAL" > paymentGatewayConfigId="ORBITAL_CONFIG"/> > + <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="CREDIT_CARD" > paymentServiceTypeEnumId="PRDS_PAY_REFUND" > paymentService="orbitalCCRefund" > paymentCustomMethodId="CC_REFUND_ORBITAL" > paymentGatewayConfigId="ORBITAL_CONFIG"/> > + <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="CREDIT_CARD" > paymentServiceTypeEnumId="PRDS_PAY_RELEASE" > paymentService="orbitalCCRelease" > paymentCustomMethodId="CC_RELEASE_ORBITAL" > paymentGatewayConfigId="ORBITAL_CONFIG"/> > > <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="EXT_WORLDPAY" > paymentServiceTypeEnumId="PRDS_PAY_EXTERNAL" paymentService="" > paymentCustomMethodId="" paymentGatewayConfigId="WORLDPAY_CONFIG"/> > <ProductStorePaymentSetting productStoreId="9000" > paymentMethodTypeId="EXT_OFFLINE" > paymentServiceTypeEnumId="PRDS_PAY_EXTERNAL" paymentService="" > paymentCustomMethodId=""/> > > smime.p7s (3K) Download Attachment |
Free forum by Nabble | Edit this page |