| /******************************************************************************* |
| * 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.apache.ofbiz.accounting.thirdparty.eway; |
| |
| import java.math.BigDecimal; |
| import java.util.Locale; |
| import java.util.Map; |
| |
| import org.apache.ofbiz.accounting.payment.PaymentGatewayServices; |
| import org.apache.ofbiz.base.util.Debug; |
| import org.apache.ofbiz.base.util.UtilFormatOut; |
| import org.apache.ofbiz.base.util.UtilProperties; |
| import org.apache.ofbiz.base.util.UtilValidate; |
| import org.apache.ofbiz.entity.Delegator; |
| import org.apache.ofbiz.entity.GenericEntityException; |
| import org.apache.ofbiz.entity.GenericValue; |
| import org.apache.ofbiz.entity.util.EntityQuery; |
| import org.apache.ofbiz.entity.util.EntityUtilProperties; |
| import org.apache.ofbiz.service.DispatchContext; |
| import org.apache.ofbiz.service.ServiceUtil; |
| |
| public class EwayServices { |
| |
| public static final String module = EwayServices.class.getName(); |
| public final static String resource = "AccountingUiLabels"; |
| |
| // eway charge (auth w/ capture) |
| public static Map<String, Object> ewayCharge(DispatchContext dctx, Map<String, Object> context) { |
| String orderId = (String) context.get("orderId"); |
| String cvv2 = (String) context.get("cardSecurityCode"); |
| String custIp = (String) context.get("customerIpAddress"); |
| BigDecimal processAmount = (BigDecimal) context.get("processAmount"); |
| GenericValue cc = (GenericValue) context.get("creditCard"); |
| GenericValue address = (GenericValue) context.get("billingAddress"); |
| GenericValue party = (GenericValue) context.get("billToParty"); |
| |
| GatewayRequest req = initRequest(dctx, context, false); |
| req.setCustomerInvoiceRef(orderId); |
| req.setTotalAmount(processAmount); |
| req.setCustomerIPAddress(custIp); |
| |
| // bill to party info |
| req.setCustomerFirstName(UtilFormatOut.checkNull(party.getString("firstName"))); |
| req.setCustomerLastName(UtilFormatOut.checkNull(party.getString("lastName"))); |
| |
| // card info |
| String ccName = cc.getString("firstNameOnCard") + " " + cc.getString("lastNameOnCard"); |
| req.setCardHoldersName(ccName); |
| req.setCardNumber(cc.getString("cardNumber")); |
| if (cc.get("expireDate") != null) { |
| String[] exp = cc.getString("expireDate").split("\\/"); |
| req.setCardExpiryMonth(exp[0]); |
| req.setCardExpiryYear(exp[1]); |
| } |
| |
| // security code |
| if (UtilValidate.isNotEmpty(cvv2)) { |
| req.setCVN(cvv2); |
| } |
| |
| // billing address |
| if (address != null) { |
| String street = address.getString("address1") + ((UtilValidate.isNotEmpty(address.getString("address2"))) ? " " + address.getString("address2") : ""); |
| req.setCustomerAddress(street); |
| req.setCustomerPostcode(address.getString("postalCode")); |
| req.setCustomerBillingCountry(address.getString("countryGeoId")); |
| } |
| |
| // send the request |
| GatewayConnector con = new GatewayConnector(); |
| GatewayResponse reply; |
| try { |
| reply = con.sendRequest(req); |
| } catch (Exception e) { |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| // process the result |
| Map<String, Object> result = ServiceUtil.returnSuccess(); |
| Boolean authResult = reply.getTrxnStatus(); |
| |
| // auth fields |
| result.put("authResult", new Boolean(authResult.booleanValue())); |
| result.put("authMessage", reply.getTrxnError()); |
| result.put("authCode", reply.getAuthCode()); |
| result.put("authRefNum", reply.getTrxnNumber()); |
| result.put("scoreCode", Double.valueOf(reply.getBeagleScore()).toString()); |
| result.put("processAmount", reply.getTransactionAmount()); |
| |
| // capture fields |
| result.put("captureResult", result.get("authResult")); |
| result.put("captureMessage", result.get("authMessage")); |
| result.put("captureRefNum", result.get("authRefNum")); |
| |
| return result; |
| } |
| |
| // eway refund |
| public static Map<String, Object> ewayRefund(DispatchContext dctx, Map<String, Object> context) { |
| Delegator delegator = dctx.getDelegator(); |
| GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference"); |
| BigDecimal refundAmount = (BigDecimal) context.get("refundAmount"); |
| Locale locale = (Locale) context.get("locale"); |
| |
| // original charge transaction |
| GenericValue chargeTrans = PaymentGatewayServices.getCaptureTransaction(paymentPref); |
| if (chargeTrans == null) { |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "AccountingPaymentTransactionAuthorizationNotFoundCannotRefund", locale)); |
| } |
| |
| // credit card used for transaction |
| GenericValue cc = null; |
| try { |
| cc = delegator.getRelatedOne("CreditCard", paymentPref, false); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "AccountingPaymentUnableToGetCCInfo", locale)); |
| } |
| |
| // orig ref number |
| String refNum = chargeTrans.getString("referenceNum"); |
| String orderId = paymentPref.getString("orderId"); |
| |
| GatewayRequest req = initRequest(dctx, context, true); |
| req.setCustomerInvoiceRef(orderId); |
| req.setTotalAmount(refundAmount); |
| req.setTrxnNumber(refNum); |
| |
| // set the card expire date |
| if (cc.get("expireDate") != null) { |
| String[] exp = cc.getString("expireDate").split("\\/"); |
| req.setCardExpiryMonth(exp[0]); |
| req.setCardExpiryYear(exp[1]); |
| } |
| |
| // send the request |
| GatewayConnector con = new GatewayConnector(); |
| GatewayResponse reply; |
| try { |
| reply = con.sendRequest(req); |
| } catch (Exception e) { |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| // process the result |
| Map<String, Object> result = ServiceUtil.returnSuccess(); |
| Boolean refundResult = reply.getTrxnStatus(); |
| result.put("refundResult", new Boolean(refundResult.booleanValue())); |
| result.put("refundMessage", reply.getTrxnError()); |
| result.put("refundCode", reply.getAuthCode()); |
| result.put("refundRefNum", reply.getTrxnNumber()); |
| result.put("refundAmount", reply.getTransactionAmount()); |
| |
| return result; |
| } |
| |
| // eway release (does a refund) |
| public static Map<String, Object> ewayRelease(DispatchContext dctx, Map<String, Object> context) { |
| Delegator delegator = dctx.getDelegator(); |
| GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference"); |
| BigDecimal releaseAmount = (BigDecimal) context.get("releaseAmount"); |
| Locale locale = (Locale) context.get("locale"); |
| |
| // original charge transaction |
| GenericValue chargeTrans = (GenericValue) context.get("authTrans"); |
| if (chargeTrans == null) { |
| chargeTrans = PaymentGatewayServices.getAuthTransaction(paymentPref); |
| } |
| |
| if (chargeTrans == null) { |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "AccountingPaymentTransactionAuthorizationNotFoundCannotRelease", locale)); |
| } |
| |
| // credit card used for transaction |
| GenericValue cc = null; |
| try { |
| cc = delegator.getRelatedOne("CreditCard", paymentPref, false); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(UtilProperties.getMessage(resource, |
| "AccountingPaymentUnableToGetCCInfo", locale)); |
| } |
| |
| // orig ref number |
| String refNum = chargeTrans.getString("referenceNum"); |
| String orderId = paymentPref.getString("orderId"); |
| |
| GatewayRequest req = initRequest(dctx, context, true); |
| req.setCustomerInvoiceRef(orderId); |
| req.setTotalAmount(releaseAmount); |
| req.setTrxnNumber(refNum); |
| |
| // set the card expire date |
| if (cc.get("expireDate") != null) { |
| String[] exp = cc.getString("expireDate").split("\\/"); |
| req.setCardExpiryMonth(exp[0]); |
| req.setCardExpiryYear(exp[1]); |
| } |
| |
| // send the request |
| GatewayConnector con = new GatewayConnector(); |
| GatewayResponse reply; |
| try { |
| reply = con.sendRequest(req); |
| } catch (Exception e) { |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| // process the result |
| Map<String, Object> result = ServiceUtil.returnSuccess(); |
| Boolean refundResult = reply.getTrxnStatus(); |
| result.put("releaseResult", new Boolean(refundResult.booleanValue())); |
| result.put("releaseMessage", reply.getTrxnError()); |
| result.put("releaseCode", reply.getAuthCode()); |
| result.put("releaseRefNum", reply.getTrxnNumber()); |
| result.put("releaseAmount", reply.getTransactionAmount()); |
| |
| return result; |
| } |
| |
| |
| private static GatewayRequest initRequest(DispatchContext dctx, Map<String, Object> context, boolean refund) { |
| String pgcId = (String) context.get("paymentGatewayConfigId"); |
| String cfgStr = (String) context.get("paymentConfig"); |
| Delegator delegator = dctx.getDelegator(); |
| |
| String customerId = getPaymentGatewayConfigValue(delegator, pgcId, "customerId", cfgStr, "payment.eway.customerId"); |
| String refundPwd = getPaymentGatewayConfigValue(delegator, pgcId, "refundPwd", cfgStr, "payment.eway.refundPwd"); |
| Boolean testMode = "Y".equalsIgnoreCase(getPaymentGatewayConfigValue(delegator, pgcId, "testMode", cfgStr, "payment.eway.testMode")); |
| Boolean beagle = "Y".equalsIgnoreCase(getPaymentGatewayConfigValue(delegator, pgcId, "enableBeagle", cfgStr, "payment.eway.enableBeagle")); |
| Boolean cvn = "Y".equalsIgnoreCase(getPaymentGatewayConfigValue(delegator, pgcId, "enableCvn", cfgStr, "payment.eway.enableCvn")); |
| |
| // the request mode |
| int requestMode = refund ? GatewayRequest.REQUEST_METHOD_REFUND : beagle ? |
| GatewayRequest.REQUEST_METHOD_BEAGLE : cvn ? GatewayRequest.REQUEST_METHOD_CVN : 0; |
| |
| // create the request object |
| GatewayRequest req = new GatewayRequest(requestMode); |
| req.setTestMode(testMode); |
| req.setCustomerID(customerId); |
| if (refund) { |
| req.setRefundPassword(refundPwd); |
| } |
| |
| return req; |
| } |
| |
| private static String getPaymentGatewayConfigValue(Delegator delegator, String cfgId, String cfgParamName, |
| String resource, String resParamName) { |
| String returnValue = ""; |
| if (UtilValidate.isNotEmpty(cfgId)) { |
| try { |
| GenericValue gv = EntityQuery.use(delegator).from("PaymentGatewayEway") |
| .where("paymantGatewayConfigId", cfgId).cache().queryOne(); |
| if (gv != null) { |
| Object field = gv.get(cfgParamName); |
| if (field != null) { |
| returnValue = field.toString().trim(); |
| } |
| } |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| } |
| } else { |
| String value = EntityUtilProperties.getPropertyValue(resource, resParamName, delegator); |
| if (value != null) { |
| returnValue = value.trim(); |
| } |
| } |
| return returnValue; |
| } |
| } |