blob: 21d7e760b07bb3464cad791c97960d6b4c5ef0c3 [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.apache.ofbiz.order.thirdparty.paypal;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.UtilHttp;
import org.apache.ofbiz.base.util.UtilMisc;
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.order.shoppingcart.ShoppingCart;
import org.apache.ofbiz.order.shoppingcart.ShoppingCartEvents;
import org.apache.ofbiz.product.store.ProductStoreWorker;
import org.apache.ofbiz.service.GenericServiceException;
import org.apache.ofbiz.service.LocalDispatcher;
import org.apache.ofbiz.service.ServiceUtil;
public class ExpressCheckoutEvents {
public static final String resourceErr = "AccountingErrorUiLabels";
public static final String module = ExpressCheckoutEvents.class.getName();
public static enum CheckoutType {PAYFLOW, STANDARD, NONE}
public static String setExpressCheckout(HttpServletRequest request, HttpServletResponse response) {
Locale locale = UtilHttp.getLocale(request);
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
CheckoutType checkoutType = determineCheckoutType(request);
if (!checkoutType.equals(CheckoutType.NONE)) {
String serviceName = null;
if (checkoutType.equals(CheckoutType.PAYFLOW)) {
serviceName = "payflowSetExpressCheckout";
} else if (checkoutType.equals(CheckoutType.STANDARD)) {
serviceName = "payPalSetExpressCheckout";
}
Map<String, ? extends Object> inMap = UtilMisc.toMap("userLogin", cart.getUserLogin(), "cart", cart);
Map<String, Object> result = null;
try {
result = dispatcher.runSync(serviceName, inMap);
} catch (GenericServiceException e) {
Debug.logInfo(e, module);
request.setAttribute("_EVENT_MESSAGE_", UtilProperties.getMessage(resourceErr, "AccountingPayPalCommunicationError", locale));
return "error";
}
if (ServiceUtil.isError(result)) {
Debug.logError(ServiceUtil.getErrorMessage(result), module);
request.setAttribute("_EVENT_MESSAGE_", UtilProperties.getMessage(resourceErr, "AccountingPayPalCommunicationError", locale));
return "error";
}
}
return "success";
}
public static String expressCheckoutRedirect(HttpServletRequest request, HttpServletResponse response) {
Delegator delegator = (Delegator) request.getAttribute("delegator");
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
String token = (String) cart.getAttribute("payPalCheckoutToken");
String paymentGatewayConfigId = null;
GenericValue payPalGatewayConfig = null;
String productStoreId = null;
if (UtilValidate.isEmpty(token)) {
Debug.logError("No ExpressCheckout token found in cart, you must do a successful setExpressCheckout before redirecting.", module);
return "error";
}
if (cart != null) {
productStoreId = cart.getProductStoreId();
}
if (productStoreId != null) {
GenericValue payPalPaymentSetting = ProductStoreWorker.getProductStorePaymentSetting(delegator, productStoreId, "EXT_PAYPAL", null, true);
if (payPalPaymentSetting != null) {
paymentGatewayConfigId = payPalPaymentSetting.getString("paymentGatewayConfigId");
}
}
if (paymentGatewayConfigId != null) {
try {
payPalGatewayConfig = EntityQuery.use(delegator).from("PaymentGatewayPayPal").where("paymentGatewayConfigId", paymentGatewayConfigId).cache().queryOne();
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
}
if (payPalGatewayConfig == null) {
request.setAttribute("_EVENT_MESSAGE_", "Couldn't retrieve a PaymentGatewayConfigPayPal record for Express Checkout, cannot continue.");
return "error";
}
StringBuilder redirectUrl = new StringBuilder(payPalGatewayConfig.getString("redirectUrl"));
redirectUrl.append("?cmd=_express-checkout&token=");
redirectUrl.append(token);
try {
response.sendRedirect(redirectUrl.toString());
} catch (IOException e) {
Debug.logError(e, module);
return "error";
}
return "success";
}
public static String expressCheckoutUpdate(HttpServletRequest request, HttpServletResponse response) {
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
CheckoutType checkoutType = determineCheckoutType(request);
if (checkoutType.equals(CheckoutType.STANDARD)) {
Map<String, Object> inMap = new HashMap<String, Object>();
inMap.put("request", request);
inMap.put("response", response);
try {
dispatcher.runSync("payPalCheckoutUpdate", inMap);
} catch (GenericServiceException e) {
Debug.logError(e, module);
}
}
return "success";
}
public static String getExpressCheckoutDetails(HttpServletRequest request, HttpServletResponse response) {
Locale locale = UtilHttp.getLocale(request);
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
CheckoutType checkoutType = determineCheckoutType(request);
if (!checkoutType.equals(CheckoutType.NONE)) {
String serviceName = null;
if (checkoutType.equals(CheckoutType.PAYFLOW)) {
serviceName = "payflowGetExpressCheckout";
} else if (checkoutType.equals(CheckoutType.STANDARD)) {
serviceName = "payPalGetExpressCheckout";
}
Map<String, ? extends Object> inMap = UtilMisc.toMap("userLogin", cart.getUserLogin(), "cart", cart);
Map<String, Object> result = null;
try {
result = dispatcher.runSync(serviceName, inMap);
} catch (GenericServiceException e) {
request.setAttribute("_EVENT_MESSAGE_", UtilProperties.getMessage(resourceErr, "AccountingPayPalCommunicationError", locale));
return "error";
}
if (ServiceUtil.isError(result)) {
Debug.logError(ServiceUtil.getErrorMessage(result), module);
request.setAttribute("_EVENT_MESSAGE_", ServiceUtil.getErrorMessage(result));
return "error";
}
}
return "success";
}
public static Map<String, Object> doExpressCheckout(String productStoreId, String orderId, GenericValue paymentPref, GenericValue userLogin, Delegator delegator, LocalDispatcher dispatcher) {
CheckoutType checkoutType = determineCheckoutType(delegator, productStoreId);
if (!checkoutType.equals(CheckoutType.NONE)) {
String serviceName = null;
if (checkoutType.equals(CheckoutType.PAYFLOW)) {
serviceName = "payflowDoExpressCheckout";
} else if (checkoutType.equals(CheckoutType.STANDARD)) {
serviceName = "payPalDoExpressCheckout";
}
Map<String, Object> inMap = new HashMap<String, Object>();
inMap.put("userLogin", userLogin);
inMap.put("orderPaymentPreference", paymentPref);
Map<String, Object> result = null;
try {
result = dispatcher.runSync(serviceName, inMap);
} catch (GenericServiceException e) {
return ServiceUtil.returnError(e.getMessage());
}
return result;
}
return ServiceUtil.returnSuccess();
}
public static String expressCheckoutCancel(HttpServletRequest request, HttpServletResponse response) {
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
cart.removeAttribute("payPalCheckoutToken");
return "success";
}
public static CheckoutType determineCheckoutType(HttpServletRequest request) {
Delegator delegator = (Delegator) request.getAttribute("delegator");
ShoppingCart cart = ShoppingCartEvents.getCartObject(request);
return determineCheckoutType(delegator, cart.getProductStoreId());
}
public static CheckoutType determineCheckoutType(Delegator delegator, String productStoreId) {
GenericValue payPalPaymentSetting = ProductStoreWorker.getProductStorePaymentSetting(delegator, productStoreId, "EXT_PAYPAL", null, true);
if (payPalPaymentSetting != null && payPalPaymentSetting.getString("paymentGatewayConfigId") != null) {
try {
GenericValue paymentGatewayConfig = payPalPaymentSetting.getRelatedOne("PaymentGatewayConfig", false);
String paymentGatewayConfigTypeId = paymentGatewayConfig.getString("paymentGatewayConfigTypeId");
if (paymentGatewayConfig != null) {
if ("PAYFLOWPRO".equals(paymentGatewayConfigTypeId)) {
return CheckoutType.PAYFLOW;
} else if ("PAYPAL".equals(paymentGatewayConfigTypeId)) {
GenericValue payPalConfig = paymentGatewayConfig.getRelatedOne("PaymentGatewayPayPal", false);
// TODO: Probably better off with an indicator field to indicate Express Checkout use
if (UtilValidate.isNotEmpty(payPalConfig.get("apiUserName"))) {
return CheckoutType.STANDARD;
}
}
}
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
}
return CheckoutType.NONE;
}
}