blob: 93be9124f0e0ec6ec67644bca9e36217f3e2d3b7 [file] [log] [blame]
/*******************************************************************************
* 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.securepay;
import java.math.BigDecimal;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import org.ofbiz.accounting.payment.PaymentGatewayServices;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.util.EntityQuery;
import org.ofbiz.entity.util.EntityUtilProperties;
import org.ofbiz.service.DispatchContext;
import org.ofbiz.service.ServiceUtil;
import securepay.jxa.api.Payment;
import securepay.jxa.api.Txn;
public class SecurePayPaymentServices {
public static final String module = SecurePayPaymentServices.class.getName();
public final static String resource = "AccountingUiLabels";
public static Map<String, Object> doAuth(DispatchContext dctx, Map<String, Object> context) {
Locale locale = (Locale) context.get("locale");
Delegator delegator = dctx.getDelegator();
String orderId = (String) context.get("orderId");
BigDecimal processAmount = (BigDecimal) context.get("processAmount");
// generate the request/properties
Properties props = buildScProperties(context, delegator);
if (props == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayNotProperlyConfigurated", locale));
}
String merchantId = props.getProperty("merchantID");
String serverURL = props.getProperty("serverurl");
String processtimeout = props.getProperty("processtimeout");
String pwd = props.getProperty("pwd");
String enableamountround = props.getProperty("enableamountround");
String currency = (String) context.get("currency");
BigDecimal multiplyAmount = new BigDecimal(100);
BigDecimal newAmount = null;
int amont;
if (enableamountround.equals("Y")) {
newAmount = new BigDecimal(processAmount.setScale(0, BigDecimal.ROUND_HALF_UP)+".00");
} else {
newAmount = processAmount;
}
if (currency.equals("JPY")) {
amont = newAmount.intValue();
} else {
amont = newAmount.multiply(multiplyAmount).intValue();
}
GenericValue creditCard = (GenericValue) context.get("creditCard");
String expiryDate = (String) creditCard.get("expireDate");
String cardSecurityCode = (String) context.get("cardSecurityCode");
Payment payment = new Payment();
payment.setServerURL(serverURL);
payment.setProcessTimeout(Integer.valueOf(processtimeout));
payment.setMerchantId(merchantId);
Txn txn = payment.addTxn(10, orderId);
txn.setTxnSource(8);
txn.setAmount(Integer.toString(amont));
if (UtilValidate.isNotEmpty(currency)) {
txn.setCurrencyCode(currency);
} else {
txn.setCurrencyCode("AUD");
}
txn.setCardNumber((String) creditCard.get("cardNumber"));
txn.setExpiryDate(expiryDate.substring(0, 3) + expiryDate.substring(5));
if (UtilValidate.isNotEmpty(cardSecurityCode)) {
txn.setCVV(cardSecurityCode);
}
// Send payment to SecurePay for processing
boolean processed = payment.process(pwd);
Map<String, Object> result = ServiceUtil.returnSuccess();
if (UtilValidate.isEmpty(processed)) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayPaymentWasNotSent", locale));
} else {
if (payment.getCount() == 1) {
Txn resp = payment.getTxn(0);
boolean approved = resp.getApproved();
if (approved == false){
result.put("authResult", new Boolean(false));
result.put("authRefNum", "N/A");
result.put("processAmount", BigDecimal.ZERO);
} else {
result.put("authRefNum", resp.getTxnId());
result.put("authResult", new Boolean(true));
result.put("processAmount", processAmount);
}
result.put("authCode", resp.getResponseCode());
result.put("authMessage", resp.getResponseText());
}
}
return result;
}
public static Map<String, Object> ccReAuth(DispatchContext dctx, Map<String, ? extends Object> context) {
return ServiceUtil.returnSuccess();
}
public static Map<String, Object> doCapture(DispatchContext dctx, Map<String, Object> context) {
Locale locale = (Locale) context.get("locale");
Delegator delegator = dctx.getDelegator();
GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
GenericValue authTransaction = (GenericValue) context.get("authTrans");
if (authTransaction == null) {
authTransaction = PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
}
if (authTransaction == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingPaymentTransactionAuthorizationNotFoundCannotCapture", locale));
}
Properties props = buildScProperties(context, delegator);
if (props == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayNotProperlyConfigurated", locale));
}
String merchantId = props.getProperty("merchantID");
String serverURL = props.getProperty("serverurl");
String processtimeout = props.getProperty("processtimeout");
String pwd = props.getProperty("pwd");
String enableamountround = props.getProperty("enableamountround");
String currency = authTransaction.getString("currencyUomId");
BigDecimal captureAmount = (BigDecimal) context.get("captureAmount");
BigDecimal multiplyAmount = new BigDecimal(100);
BigDecimal newAmount = null;
int amont;
if (enableamountround.equals("Y")) {
newAmount = new BigDecimal(captureAmount.setScale(0, BigDecimal.ROUND_HALF_UP)+".00");
} else {
newAmount = captureAmount;
}
if (currency.equals("JPY")) {
amont = newAmount.intValue();
} else {
amont = newAmount.multiply(multiplyAmount).intValue();
}
Payment payment = new Payment();
payment.setServerURL(serverURL);
payment.setProcessTimeout(Integer.valueOf(processtimeout));
payment.setMerchantId(merchantId);
Txn txn = payment.addTxn(11, (String) orderPaymentPreference.get("orderId"));
txn.setTxnSource(8);
txn.setAmount(Integer.toString(amont));
txn.setPreauthId(authTransaction.getString("referenceNum"));
// Send payment to SecurePay for processing
boolean processed = payment.process(pwd);
Map<String, Object> result = ServiceUtil.returnSuccess();
if (UtilValidate.isEmpty(processed)) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayPaymentWasNotSent", locale));
} else {
if (payment.getCount() == 1){
Txn resp = payment.getTxn(0);
boolean approved = resp.getApproved();
if (approved == false){
result.put("captureResult", false);
result.put("captureRefNum", authTransaction.getString("referenceNum"));
result.put("captureAmount", BigDecimal.ZERO);
} else {
result.put("captureResult", true);
result.put("captureAmount", captureAmount);
result.put("captureRefNum", resp.getTxnId());
}
result.put("captureFlag", "C");
result.put("captureCode", resp.getResponseCode());
result.put("captureMessage", resp.getResponseText());
}
}
return result;
}
public static Map<String, Object> doVoid(DispatchContext dctx, Map<String, Object> context) {
Locale locale = (Locale) context.get("locale");
Delegator delegator = dctx.getDelegator();
GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
GenericValue authTransaction = (GenericValue) context.get("authTrans");
if (authTransaction == null) {
authTransaction = PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
}
if (authTransaction == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingPaymentTransactionAuthorizationNotFoundCannotRelease", locale));
}
Properties props = buildScProperties(context, delegator);
if (props == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayNotProperlyConfigurated", locale));
}
String merchantId = props.getProperty("merchantID");
String serverURL = props.getProperty("serverurl");
String processtimeout = props.getProperty("processtimeout");
String pwd = props.getProperty("pwd");
String enableamountround = props.getProperty("enableamountround");
String currency = authTransaction.getString("currencyUomId");
BigDecimal releaseAmount = (BigDecimal) context.get("releaseAmount");
BigDecimal multiplyAmount = new BigDecimal(100);
BigDecimal newAmount = null;
int amont;
if (enableamountround.equals("Y")) {
newAmount = new BigDecimal(releaseAmount.setScale(0, BigDecimal.ROUND_HALF_UP)+".00");
} else {
newAmount = releaseAmount;
}
if (currency.equals("JPY")) {
amont = newAmount.intValue();
} else {
amont = newAmount.multiply(multiplyAmount).intValue();
}
Payment payment = new Payment();
payment.setServerURL(serverURL);
payment.setProcessTimeout(Integer.valueOf(processtimeout));
payment.setMerchantId(merchantId);
Txn txn = payment.addTxn(6, (String) orderPaymentPreference.get("orderId"));
txn.setTxnSource(8);
txn.setAmount(Integer.toString(amont));
txn.setTxnId(authTransaction.getString("referenceNum"));
// Send payment to SecurePay for processing
boolean processed = payment.process(pwd);
Map<String, Object> result = ServiceUtil.returnSuccess();
if (UtilValidate.isEmpty(processed)) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayPaymentWasNotSent", locale));
} else {
if (payment.getCount() == 1){
Txn resp = payment.getTxn(0);
boolean approved = resp.getApproved();
if (approved == false){
result.put("releaseResult", false);
result.put("releaseRefNum", authTransaction.getString("referenceNum"));
result.put("releaseAmount", BigDecimal.ZERO);
} else {
result.put("releaseResult", true);
result.put("releaseAmount", releaseAmount);
result.put("releaseRefNum", resp.getTxnId());
}
result.put("releaseFlag", "U");
result.put("releaseCode", resp.getResponseCode());
result.put("releaseMessage", resp.getResponseText());
}
}
return result;
}
public static Map<String, Object> doRefund(DispatchContext dctx, Map<String, Object> context) {
Locale locale = (Locale) context.get("locale");
Delegator delegator = dctx.getDelegator();
GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
GenericValue authTransaction = PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
if (authTransaction == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingPaymentTransactionAuthorizationNotFoundCannotRefund", locale));
}
String referenceNum = null;
try {
GenericValue paymentGatewayResponse = EntityQuery.use(delegator).from("PaymentGatewayResponse")
.where("orderPaymentPreferenceId", authTransaction.get("orderPaymentPreferenceId"),
"paymentServiceTypeEnumId", "PRDS_PAY_CAPTURE")
.queryFirst();
referenceNum = paymentGatewayResponse != null ? paymentGatewayResponse.get("referenceNum") : authTransaction.getString("referenceNum");
} catch (GenericEntityException e) {
e.printStackTrace();
}
Properties props = buildScProperties(context, delegator);
if (props == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayNotProperlyConfigurated", locale));
}
String merchantId = props.getProperty("merchantID");
String serverURL = props.getProperty("serverurl");
String processtimeout = props.getProperty("processtimeout");
String pwd = props.getProperty("pwd");
String enableamountround = props.getProperty("enableamountround");
String currency = authTransaction.getString("currencyUomId");
BigDecimal refundAmount = (BigDecimal) context.get("refundAmount");
BigDecimal multiplyAmount = new BigDecimal(100);
BigDecimal newAmount = null;
if (enableamountround.equals("Y")) {
newAmount = new BigDecimal(refundAmount.setScale(0, BigDecimal.ROUND_HALF_UP)+".00");
} else {
newAmount = refundAmount;
}
int amont;
if (currency.equals("JPY")) {
amont = newAmount.intValue();
} else {
amont = newAmount.multiply(multiplyAmount).intValue();
}
Payment payment = new Payment();
payment.setServerURL(serverURL);
payment.setProcessTimeout(Integer.valueOf(processtimeout));
payment.setMerchantId(merchantId);
Txn txn = payment.addTxn(4, (String) orderPaymentPreference.get("orderId"));
txn.setTxnSource(8);
txn.setAmount(Integer.toString(amont));
txn.setTxnId(referenceNum);
// Send payment to SecurePay for processing
boolean processed = payment.process(pwd);
Map<String, Object> result = ServiceUtil.returnSuccess();
if (UtilValidate.isEmpty(processed)) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayPaymentWasNotSent", locale));
} else {
if (payment.getCount() == 1){
Txn resp = payment.getTxn(0);
boolean approved = resp.getApproved();
if (approved == false){
result.put("refundResult", false);
result.put("refundRefNum", authTransaction.getString("referenceNum"));
result.put("refundAmount", BigDecimal.ZERO);
} else {
result.put("refundResult", true);
result.put("refundAmount", refundAmount);
result.put("refundRefNum", resp.getTxnId());
}
result.put("refundCode", resp.getResponseCode());
result.put("refundMessage", resp.getResponseText());
result.put("refundFlag", "R");
}
}
return result;
}
public static Map<String, Object> doCredit(DispatchContext dctx, Map<String, Object> context) {
Locale locale = (Locale) context.get("locale");
Delegator delegator = dctx.getDelegator();
// generate the request/properties
Properties props = buildScProperties(context, delegator);
if (props == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayNotProperlyConfigurated", locale));
}
String merchantId = props.getProperty("merchantID");
String serverURL = props.getProperty("serverurl");
String processtimeout = props.getProperty("processtimeout");
String pwd = props.getProperty("pwd");
String enableamountround = props.getProperty("enableamountround");
String referenceCode = (String) context.get("referenceCode");
String currency = (String) context.get("currency");
String cardSecurityCode = (String) context.get("cardSecurityCode");
BigDecimal creditAmount = (BigDecimal) context.get("creditAmount");
BigDecimal multiplyAmount = new BigDecimal(100);
BigDecimal newAmount = null;
int amont;
if (enableamountround.equals("Y")) {
newAmount = new BigDecimal(creditAmount.setScale(0, BigDecimal.ROUND_HALF_UP)+".00");
} else {
newAmount = creditAmount;
}
if (currency.equals("JPY")) {
amont = newAmount.intValue();
} else {
amont = newAmount.multiply(multiplyAmount).intValue();
}
GenericValue creditCard = (GenericValue) context.get("creditCard");
Payment payment = new Payment();
payment.setServerURL(serverURL);
payment.setProcessTimeout(Integer.valueOf(processtimeout));
payment.setMerchantId(merchantId);
Txn txn = payment.addTxn(0, referenceCode);
txn.setTxnSource(8);
txn.setAmount(Integer.toString(amont));
txn.setCardNumber((String) creditCard.get("cardNumber"));
String expiryDate = (String) creditCard.get("expireDate");
txn.setExpiryDate(expiryDate.substring(0, 3) + expiryDate.substring(5));
if (UtilValidate.isNotEmpty(cardSecurityCode)) {
txn.setCVV(cardSecurityCode);
}
// Send payment to SecurePay for processing
boolean processed = payment.process(pwd);
Map<String, Object> result = ServiceUtil.returnSuccess();
if (UtilValidate.isEmpty(processed)) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource,
"AccountingSecurityPayPaymentWasNotSent", locale));
} else {
if (payment.getCount() == 1) {
Txn resp = payment.getTxn(0);
boolean approved = resp.getApproved();
if (approved == false){
result.put("creditResult", false);
result.put("creditRefNum", "N/A");
result.put("creditAmount", BigDecimal.ZERO);
} else {
result.put("creditResult", true);
result.put("creditAmount", creditAmount);
result.put("creditRefNum", resp.getTxnId());
}
result.put("creditCode", resp.getResponseCode());
result.put("creditMessage", resp.getResponseText());
}
}
return result;
}
private static Properties buildScProperties(Map<String, ? extends Object> context, Delegator delegator) {
String paymentGatewayConfigId = (String) context.get("paymentGatewayConfigId");
String configString = (String) context.get("paymentConfig");
if (configString == null) {
configString = "payment.properties";
}
String merchantId = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "merchantId", configString, "payment.securepay.merchantID", null);
String pwd = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "pwd", configString, "payment.securepay.pwd", null);
String serverURL = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "serverURL", configString, "payment.securepay.serverurl", null);
String processTimeout = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "processTimeout", configString, "payment.securepay.processtimeout", null);
String enableAmountRound = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, "enableAmountRound", configString, "payment.securepay.enableamountround", null);
Properties props = new Properties();
props.put("merchantID", merchantId);
props.put("pwd", pwd);
props.put("serverurl", serverURL);
props.put("processtimeout", processTimeout);
props.put("enableamountround", enableAmountRound);
return props;
}
private static String getPaymentGatewayConfigValue(Delegator delegator, String paymentGatewayConfigId, String paymentGatewayConfigParameterName,String resource, String parameterName) {
String returnValue = "";
if (UtilValidate.isNotEmpty(paymentGatewayConfigId)) {
try {
GenericValue securePay = EntityQuery.use(delegator).from("PaymentGatewaySecurePay").where("paymentGatewayConfigId", paymentGatewayConfigId).queryOne();
if (UtilValidate.isNotEmpty(securePay)) {
Object securePayField = securePay.get(paymentGatewayConfigParameterName);
if (securePayField != null) {
returnValue = securePayField.toString().trim();
}
}
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
} else {
String value = EntityUtilProperties.getPropertyValue(resource, parameterName, delegator);
if (value != null) {
returnValue = value.trim();
}
}
return returnValue;
}
private static String getPaymentGatewayConfigValue(Delegator delegator, String paymentGatewayConfigId, String paymentGatewayConfigParameterName,String resource, String parameterName, String defaultValue) {
String returnValue = getPaymentGatewayConfigValue(delegator, paymentGatewayConfigId, paymentGatewayConfigParameterName, resource, parameterName);
if (UtilValidate.isEmpty(returnValue)) {
returnValue = defaultValue;
}
return returnValue;
}
}