Java tutorial
/** * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved. * Copyright (c) 2011 Andago Ingenieria S.L.. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.shopping; import com.liferay.portal.kernel.io.unsync.UnsyncBufferedReader; import com.liferay.portal.kernel.io.unsync.UnsyncPrintWriter; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.portlet.LiferayPortletResponse; import com.liferay.portal.kernel.servlet.SessionErrors; import com.liferay.portal.kernel.upload.UploadPortletRequest; import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.HttpUtil; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.security.auth.PrincipalException; import com.liferay.portal.service.ServiceContext; import com.liferay.portal.service.ServiceContextFactory; import com.liferay.portal.theme.ThemeDisplay; import com.liferay.portal.util.PortalUtil; import com.liferay.shopping.model.ShoppingCart; import com.liferay.shopping.model.ShoppingCategory; import com.liferay.shopping.model.ShoppingCoupon; import com.liferay.shopping.model.ShoppingItem; import com.liferay.shopping.model.ShoppingItemField; import com.liferay.shopping.model.ShoppingItemPrice; import com.liferay.shopping.model.ShoppingItemPriceConstants; import com.liferay.shopping.model.ShoppingOrder; import com.liferay.shopping.service.ShoppingCartLocalServiceUtil; import com.liferay.shopping.service.ShoppingCategoryServiceUtil; import com.liferay.shopping.service.ShoppingCouponServiceUtil; import com.liferay.shopping.service.ShoppingItemLocalServiceUtil; import com.liferay.shopping.service.ShoppingItemServiceUtil; import com.liferay.shopping.service.ShoppingOrderLocalServiceUtil; import com.liferay.shopping.service.ShoppingOrderServiceUtil; import com.liferay.shopping.service.persistence.ShoppingItemFieldUtil; import com.liferay.shopping.service.persistence.ShoppingItemPriceUtil; import com.liferay.shopping.util.ShoppingPreferences; import com.liferay.shopping.util.ShoppingUtil; import com.liferay.shopping.util.WebKeys; import com.liferay.util.bridges.mvc.MVCPortlet; import java.io.File; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Calendar; import java.util.Enumeration; import java.util.List; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; /** * @author Brian Wing Shun Chan * @author Alvaro del Castillo */ public class ShoppingPortlet extends MVCPortlet { // CATEGORY public void deleteCategory(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { long categoryId = ParamUtil.getLong(actionRequest, "categoryId"); ShoppingCategoryServiceUtil.deleteCategory(categoryId); } public void updateCategory(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { try { long categoryId = ParamUtil.getLong(actionRequest, "categoryId"); long parentCategoryId = ParamUtil.getLong(actionRequest, "parentCategoryId"); String name = ParamUtil.getString(actionRequest, "name"); String description = ParamUtil.getString(actionRequest, "description"); boolean mergeWithParentCategory = ParamUtil.getBoolean(actionRequest, "mergeWithParentCategory"); ServiceContext serviceContext = ServiceContextFactory.getInstance(ShoppingCategory.class.getName(), actionRequest); if (categoryId <= 0) { // Add category ShoppingCategoryServiceUtil.addCategory(parentCategoryId, name, description, serviceContext); } else { // Update category ShoppingCategoryServiceUtil.updateCategory(categoryId, parentCategoryId, name, description, mergeWithParentCategory, serviceContext); } } catch (Exception e) { if (e instanceof NoSuchCategoryException || e instanceof PrincipalException) { SessionErrors.add(actionRequest, e.getClass().getName()); // setForward(actionRequest, "portlet.shopping.error"); actionResponse.setRenderParameter("jspPage", "/error.jsp"); } else if (e instanceof CategoryNameException) { SessionErrors.add(actionRequest, e.getClass().getName()); actionResponse.setRenderParameter("jspPage", "/edit_category.jsp"); } else { throw e; } } } // ITEM public void deleteItem(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { long itemId = ParamUtil.getLong(actionRequest, "itemId"); ShoppingItemServiceUtil.deleteItem(itemId); } public void updateItem(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { try { UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(actionRequest); ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); long itemId = ParamUtil.getLong(uploadPortletRequest, "itemId"); long groupId = themeDisplay.getScopeGroupId(); long categoryId = ParamUtil.getLong(uploadPortletRequest, "categoryId"); String sku = ParamUtil.getString(uploadPortletRequest, "sku"); String name = ParamUtil.getString(uploadPortletRequest, "name"); String description = ParamUtil.getString(uploadPortletRequest, "description"); String properties = ParamUtil.getString(uploadPortletRequest, "properties"); int fieldsCount = ParamUtil.getInteger(uploadPortletRequest, "fieldsCount", 1); List<ShoppingItemField> itemFields = new ArrayList<ShoppingItemField>(); for (int i = 0; i < fieldsCount; i++) { String fieldName = ParamUtil.getString(uploadPortletRequest, "fieldName" + i); String fieldValues = ParamUtil.getString(uploadPortletRequest, "fieldValues" + i); String fieldDescription = ParamUtil.getString(uploadPortletRequest, "fieldDescription" + i); ShoppingItemField itemField = ShoppingItemFieldUtil.create(0); itemField.setName(fieldName); itemField.setValues(fieldValues); itemField.setDescription(fieldDescription); itemFields.add(itemField); } String fieldsQuantities = ParamUtil.getString(uploadPortletRequest, "fieldsQuantities"); int pricesCount = ParamUtil.getInteger(uploadPortletRequest, "pricesCount", 1); List<ShoppingItemPrice> itemPrices = new ArrayList<ShoppingItemPrice>(); for (int i = 0; i < pricesCount; i++) { int minQuantity = ParamUtil.getInteger(uploadPortletRequest, "minQuantity" + i); int maxQuantity = ParamUtil.getInteger(uploadPortletRequest, "maxQuantity" + i); double price = ParamUtil.getDouble(uploadPortletRequest, "price" + i); double discount = ParamUtil.getDouble(uploadPortletRequest, "discount" + i) / 100; boolean taxable = ParamUtil.getBoolean(uploadPortletRequest, "taxable" + i); double shipping = ParamUtil.getDouble(uploadPortletRequest, "shipping" + i); boolean useShippingFormula = ParamUtil.getBoolean(uploadPortletRequest, "useShippingFormula" + i); boolean active = ParamUtil.getBoolean(uploadPortletRequest, "active" + i); int defaultPrice = ParamUtil.getInteger(uploadPortletRequest, "defaultPrice"); int status = ShoppingItemPriceConstants.STATUS_ACTIVE_DEFAULT; if ((defaultPrice != i) && active) { status = ShoppingItemPriceConstants.STATUS_ACTIVE; } ShoppingItemPrice itemPrice = ShoppingItemPriceUtil.create(0); itemPrice.setMinQuantity(minQuantity); itemPrice.setMaxQuantity(maxQuantity); itemPrice.setPrice(price); itemPrice.setDiscount(discount); itemPrice.setTaxable(taxable); itemPrice.setShipping(shipping); itemPrice.setUseShippingFormula(useShippingFormula); itemPrice.setStatus(status); itemPrices.add(itemPrice); } boolean requiresShipping = ParamUtil.getBoolean(uploadPortletRequest, "requiresShipping"); int stockQuantity = ParamUtil.getInteger(uploadPortletRequest, "stockQuantity"); boolean featured = ParamUtil.getBoolean(uploadPortletRequest, "featured"); Boolean sale = null; boolean smallImage = ParamUtil.getBoolean(uploadPortletRequest, "smallImage"); String smallImageURL = ParamUtil.getString(uploadPortletRequest, "smallImageURL"); File smallFile = uploadPortletRequest.getFile("smallFile"); boolean mediumImage = ParamUtil.getBoolean(uploadPortletRequest, "mediumImage"); String mediumImageURL = ParamUtil.getString(uploadPortletRequest, "mediumImageURL"); File mediumFile = uploadPortletRequest.getFile("mediumFile"); boolean largeImage = ParamUtil.getBoolean(uploadPortletRequest, "largeImage"); String largeImageURL = ParamUtil.getString(uploadPortletRequest, "largeImageURL"); File largeFile = uploadPortletRequest.getFile("largeFile"); ServiceContext serviceContext = ServiceContextFactory.getInstance(ShoppingItem.class.getName(), actionRequest); if (itemId <= 0) { // Add item ShoppingItemServiceUtil.addItem(groupId, categoryId, sku, name, description, properties, fieldsQuantities, requiresShipping, stockQuantity, featured, sale, smallImage, smallImageURL, smallFile, mediumImage, mediumImageURL, mediumFile, largeImage, largeImageURL, largeFile, itemFields, itemPrices, serviceContext); } else { // Update item ShoppingItemServiceUtil.updateItem(itemId, groupId, categoryId, sku, name, description, properties, fieldsQuantities, requiresShipping, stockQuantity, featured, sale, smallImage, smallImageURL, smallFile, mediumImage, mediumImageURL, mediumFile, largeImage, largeImageURL, largeFile, itemFields, itemPrices, serviceContext); } } catch (Exception e) { if (e instanceof NoSuchCategoryException || e instanceof NoSuchItemException || e instanceof PrincipalException) { SessionErrors.add(actionRequest, e.getClass().getName()); // setForward(actionRequest, "portlet.shopping.error"); actionResponse.setRenderParameter("jspPage", "/error.jsp"); } else if (e instanceof DuplicateItemSKUException || e instanceof ItemLargeImageNameException || e instanceof ItemLargeImageSizeException || e instanceof ItemMediumImageNameException || e instanceof ItemMediumImageSizeException || e instanceof ItemNameException || e instanceof ItemSKUException || e instanceof ItemSmallImageNameException || e instanceof ItemSmallImageSizeException) { SessionErrors.add(actionRequest, e.getClass().getName()); actionResponse.setRenderParameter("jspPage", "/edit_item.jsp"); } else { throw e; } } } // COUPONS public void deleteCoupons(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); long[] deleteCouponIds = StringUtil.split(ParamUtil.getString(actionRequest, "deleteCouponIds"), 0L); for (int i = 0; i < deleteCouponIds.length; i++) { ShoppingCouponServiceUtil.deleteCoupon(themeDisplay.getScopeGroupId(), deleteCouponIds[i]); } } public void updateCoupon(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { try { long couponId = ParamUtil.getLong(actionRequest, "couponId"); String code = ParamUtil.getString(actionRequest, "code"); boolean autoCode = ParamUtil.getBoolean(actionRequest, "autoCode"); String name = ParamUtil.getString(actionRequest, "name"); String description = ParamUtil.getString(actionRequest, "description"); int startDateMonth = ParamUtil.getInteger(actionRequest, "startDateMonth"); int startDateDay = ParamUtil.getInteger(actionRequest, "startDateDay"); int startDateYear = ParamUtil.getInteger(actionRequest, "startDateYear"); int startDateHour = ParamUtil.getInteger(actionRequest, "startDateHour"); int startDateMinute = ParamUtil.getInteger(actionRequest, "startDateMinute"); int startDateAmPm = ParamUtil.getInteger(actionRequest, "startDateAmPm"); if (startDateAmPm == Calendar.PM) { startDateHour += 12; } int endDateMonth = ParamUtil.getInteger(actionRequest, "endDateMonth"); int endDateDay = ParamUtil.getInteger(actionRequest, "endDateDay"); int endDateYear = ParamUtil.getInteger(actionRequest, "endDateYear"); int endDateHour = ParamUtil.getInteger(actionRequest, "endDateHour"); int endDateMinute = ParamUtil.getInteger(actionRequest, "endDateMinute"); int endDateAmPm = ParamUtil.getInteger(actionRequest, "endDateAmPm"); boolean neverExpire = ParamUtil.getBoolean(actionRequest, "neverExpire"); if (endDateAmPm == Calendar.PM) { endDateHour += 12; } boolean active = ParamUtil.getBoolean(actionRequest, "active"); String limitCategories = ParamUtil.getString(actionRequest, "limitCategories"); String limitSkus = ParamUtil.getString(actionRequest, "limitSkus"); double minOrder = ParamUtil.getDouble(actionRequest, "minOrder", -1.0); double discount = ParamUtil.getDouble(actionRequest, "discount", -1.0); String discountType = ParamUtil.getString(actionRequest, "discountType"); ServiceContext serviceContext = ServiceContextFactory.getInstance(ShoppingCoupon.class.getName(), actionRequest); if (couponId <= 0) { // Add coupon _log.error("AA CouponId: " + couponId); ShoppingCouponServiceUtil.addCoupon(code, autoCode, name, description, startDateMonth, startDateDay, startDateYear, startDateHour, startDateMinute, endDateMonth, endDateDay, endDateYear, endDateHour, endDateMinute, neverExpire, active, limitCategories, limitSkus, minOrder, discount, discountType, serviceContext); } else { // Update coupon _log.error("UPDATE CouponId: " + couponId); ShoppingCouponServiceUtil.updateCoupon(couponId, name, description, startDateMonth, startDateDay, startDateYear, startDateHour, startDateMinute, endDateMonth, endDateDay, endDateYear, endDateHour, endDateMinute, neverExpire, active, limitCategories, limitSkus, minOrder, discount, discountType, serviceContext); } } catch (Exception e) { if (e instanceof NoSuchCouponException || e instanceof PrincipalException) { SessionErrors.add(actionRequest, e.getClass().getName()); // setForward(actionRequest, "portlet.shopping.error"); actionResponse.setRenderParameter("jspPage", "/error.jsp"); } else if (e instanceof CouponCodeException || e instanceof CouponDateException || e instanceof CouponDescriptionException || e instanceof CouponDiscountException || e instanceof CouponEndDateException || e instanceof CouponLimitCategoriesException || e instanceof CouponLimitSKUsException || e instanceof CouponMinimumOrderException || e instanceof CouponNameException || e instanceof CouponStartDateException || e instanceof DuplicateCouponCodeException) { if (e instanceof CouponLimitCategoriesException) { CouponLimitCategoriesException clce = (CouponLimitCategoriesException) e; SessionErrors.add(actionRequest, e.getClass().getName(), clce.getCategoryIds()); } else if (e instanceof CouponLimitSKUsException) { CouponLimitSKUsException clskue = (CouponLimitSKUsException) e; SessionErrors.add(actionRequest, e.getClass().getName(), clskue.getSkus()); } else { SessionErrors.add(actionRequest, e.getClass().getName()); } actionResponse.setRenderParameter("jspPage", "/edit_coupon.jsp"); } else { throw e; } } } // CART public void updateCart(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { try { String cmd = ParamUtil.getString(actionRequest, Constants.CMD); ShoppingCart cart = ShoppingUtil.getCart(actionRequest); if (cmd.equals(Constants.ADD)) { long itemId = ParamUtil.getLong(actionRequest, "itemId"); String fields = ParamUtil.getString(actionRequest, "fields"); if (Validator.isNotNull(fields)) { fields = "|" + fields; } ShoppingItem item = ShoppingItemLocalServiceUtil.getItem(itemId); if (item.getMinQuantity() > 0) { for (int i = 0; i < item.getMinQuantity(); i++) { cart.addItemId(itemId, fields); } } else { cart.addItemId(itemId, fields); } } else { String itemIds = ParamUtil.getString(actionRequest, "itemIds"); String couponCodes = ParamUtil.getString(actionRequest, "couponCodes"); int altShipping = ParamUtil.getInteger(actionRequest, "altShipping"); boolean insure = ParamUtil.getBoolean(actionRequest, "insure"); cart.setItemIds(itemIds); cart.setCouponCodes(couponCodes); cart.setAltShipping(altShipping); cart.setInsure(insure); } ShoppingCartLocalServiceUtil.updateCart(cart.getUserId(), cart.getGroupId(), cart.getItemIds(), cart.getCouponCodes(), cart.getAltShipping(), cart.isInsure()); if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) { addSuccessMessage(actionRequest, actionResponse); actionResponse.setRenderParameter("jspPage", "/cart.jsp"); } } catch (Exception e) { if (e instanceof NoSuchItemException || e instanceof PrincipalException) { SessionErrors.add(actionRequest, e.getClass().getName()); // setForward(actionRequest, "portlet.shopping.error"); } else if (e instanceof CartMinQuantityException || e instanceof CouponActiveException || e instanceof CouponEndDateException || e instanceof CouponStartDateException || e instanceof NoSuchCouponException) { _log.error("Cart Exception: " + e.getClass().getName()); SessionErrors.add(actionRequest, e.getClass().getName(), e); } else { throw e; } } } // ORDERS public void deleteOrders(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); long[] deleteOrderIds = StringUtil.split(ParamUtil.getString(actionRequest, "deleteOrderIds"), 0L); for (int i = 0; i < deleteOrderIds.length; i++) { ShoppingOrderServiceUtil.deleteOrder(themeDisplay.getScopeGroupId(), deleteOrderIds[i]); } } public void sendEmail(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); long orderId = ParamUtil.getLong(actionRequest, "orderId"); String emailType = ParamUtil.getString(actionRequest, "emailType"); ShoppingOrderServiceUtil.sendEmail(themeDisplay.getScopeGroupId(), orderId, emailType); } public void updateOrder(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { try { ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); String number = ParamUtil.getString(actionRequest, "number"); String ppTxnId = ParamUtil.getString(actionRequest, "ppTxnId"); String ppPaymentStatus = ShoppingUtil .getPpPaymentStatus(ParamUtil.getString(actionRequest, "ppPaymentStatus")); double ppPaymentGross = ParamUtil.getDouble(actionRequest, "ppPaymentGross"); String ppReceiverEmail = ParamUtil.getString(actionRequest, "ppReceiverEmail"); String ppPayerEmail = ParamUtil.getString(actionRequest, "ppPayerEmail"); ShoppingOrderServiceUtil.completeOrder(themeDisplay.getScopeGroupId(), number, ppTxnId, ppPaymentStatus, ppPaymentGross, ppReceiverEmail, ppPayerEmail); } catch (Exception e) { if (e instanceof NoSuchOrderException || e instanceof PrincipalException) { SessionErrors.add(actionRequest, e.getClass().getName()); actionResponse.setRenderParameter("jspPage", "/error.jsp"); // return mapping.findForward("portlet.shopping.error"); } else { throw e; } } } // CHECKOUT public void updateLatestOrder(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); String billingFirstName = ParamUtil.getString(actionRequest, "billingFirstName"); String billingLastName = ParamUtil.getString(actionRequest, "billingLastName"); String billingEmailAddress = ParamUtil.getString(actionRequest, "billingEmailAddress"); String billingCompany = ParamUtil.getString(actionRequest, "billingCompany"); String billingStreet = ParamUtil.getString(actionRequest, "billingStreet"); String billingCity = ParamUtil.getString(actionRequest, "billingCity"); String billingStateSel = ParamUtil.getString(actionRequest, "billingStateSel"); String billingState = billingStateSel; if (Validator.isNull(billingStateSel)) { billingState = ParamUtil.getString(actionRequest, "billingState"); } String billingZip = ParamUtil.getString(actionRequest, "billingZip"); String billingCountry = ParamUtil.getString(actionRequest, "billingCountry"); String billingPhone = ParamUtil.getString(actionRequest, "billingPhone"); boolean shipToBilling = ParamUtil.getBoolean(actionRequest, "shipToBilling"); String shippingFirstName = ParamUtil.getString(actionRequest, "shippingFirstName"); String shippingLastName = ParamUtil.getString(actionRequest, "shippingLastName"); String shippingEmailAddress = ParamUtil.getString(actionRequest, "shippingEmailAddress"); String shippingCompany = ParamUtil.getString(actionRequest, "shippingCompany"); String shippingStreet = ParamUtil.getString(actionRequest, "shippingStreet"); String shippingCity = ParamUtil.getString(actionRequest, "shippingCity"); String shippingStateSel = ParamUtil.getString(actionRequest, "shippingStateSel"); String shippingState = shippingStateSel; if (Validator.isNull(shippingStateSel)) { shippingState = ParamUtil.getString(actionRequest, "shippingState"); } String shippingZip = ParamUtil.getString(actionRequest, "shippingZip"); String shippingCountry = ParamUtil.getString(actionRequest, "shippingCountry"); String shippingPhone = ParamUtil.getString(actionRequest, "shippingPhone"); String ccName = ParamUtil.getString(actionRequest, "ccName"); String ccType = ParamUtil.getString(actionRequest, "ccType"); String ccNumber = ParamUtil.getString(actionRequest, "ccNumber"); int ccExpMonth = ParamUtil.getInteger(actionRequest, "ccExpMonth"); int ccExpYear = ParamUtil.getInteger(actionRequest, "ccExpYear"); String ccVerNumber = ParamUtil.getString(actionRequest, "ccVerNumber"); String comments = ParamUtil.getString(actionRequest, "comments"); try { ShoppingOrder order = ShoppingOrderLocalServiceUtil.updateLatestOrder(themeDisplay.getUserId(), themeDisplay.getScopeGroupId(), billingFirstName, billingLastName, billingEmailAddress, billingCompany, billingStreet, billingCity, billingState, billingZip, billingCountry, billingPhone, shipToBilling, shippingFirstName, shippingLastName, shippingEmailAddress, shippingCompany, shippingStreet, shippingCity, shippingState, shippingZip, shippingCountry, shippingPhone, ccName, ccType, ccNumber, ccExpMonth, ccExpYear, ccVerNumber, comments); actionRequest.setAttribute(WebKeys.SHOPPING_ORDER, order); actionResponse.setRenderParameter("jspPage", "/checkout_second.jsp"); } catch (Exception e) { if (e instanceof BillingCityException || e instanceof BillingCountryException || e instanceof BillingEmailAddressException || e instanceof BillingFirstNameException || e instanceof BillingLastNameException || e instanceof BillingPhoneException || e instanceof BillingStateException || e instanceof BillingStreetException || e instanceof BillingZipException || e instanceof CCExpirationException || e instanceof CCNameException || e instanceof CCNumberException || e instanceof CCTypeException || e instanceof ShippingCityException || e instanceof ShippingCountryException || e instanceof ShippingEmailAddressException || e instanceof ShippingFirstNameException || e instanceof ShippingLastNameException || e instanceof ShippingPhoneException || e instanceof ShippingStateException || e instanceof ShippingStreetException || e instanceof ShippingZipException) { SessionErrors.add(actionRequest, e.getClass().getName()); actionResponse.setRenderParameter("jspPage", "/checkout_first.jsp"); // setForward( // actionRequest, "portlet.shopping.checkout_first"); } // else if (e instanceof PrincipalException) { // setForward(actionRequest, "portlet.shopping.error"); // } else { throw e; } } } public void saveLatestOrder(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); LiferayPortletResponse liferayPortletResponse = (LiferayPortletResponse) actionResponse; // updateCart(actionRequest, actionResponse); // updateLatestOrder(actionRequest, actionResponse); ShoppingCart cart = ShoppingUtil.getCart(actionRequest); ShoppingOrder order = ShoppingOrderLocalServiceUtil.saveLatestOrder(cart); actionRequest.setAttribute(WebKeys.SHOPPING_ORDER, order); ShoppingPreferences preferences = ShoppingPreferences.getInstance(themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId()); if (preferences.usePayPal()) { String returnURL = ShoppingUtil.getPayPalReturnURL(liferayPortletResponse.createActionURL(), order); String notifyURL = ShoppingUtil.getPayPalNotifyURL(themeDisplay); double total = ShoppingUtil.calculateTotal(cart.getItems(), order.getBillingState(), cart.getCoupon(), cart.getAltShipping(), cart.isInsure()); String redirectURL = ShoppingUtil.getPayPalRedirectURL(preferences, order, total, returnURL, notifyURL); _log.error(redirectURL); actionResponse.sendRedirect(redirectURL); } else { ShoppingOrderLocalServiceUtil.sendEmail(order, "confirmation"); actionResponse.setRenderParameter("jspPage", "/checkout_third.jsp"); } } public void editOrder(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { String cmd = ParamUtil.getString(actionRequest, Constants.CMD); try { if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) { updateOrder(actionRequest, actionResponse); } else if (cmd.equals(Constants.DELETE)) { deleteOrders(actionRequest, actionResponse); } else if (cmd.equals("sendEmail")) { sendEmail(actionRequest, actionResponse); } sendRedirect(actionRequest, actionResponse); } catch (Exception e) { if (e instanceof NoSuchOrderException || e instanceof PrincipalException) { SessionErrors.add(actionRequest, e.getClass().getName()); // setForward(actionRequest, "portlet.shopping.error"); } else { throw e; } } } // PayPal Notification public void paypalNotification(ActionRequest request, ActionResponse response) throws Exception { String invoice = null; _log.error("Receiving notification from PayPal"); try { if (_log.isDebugEnabled()) { _log.debug("Receiving notification from PayPal"); } String query = "cmd=_notify-validate"; Enumeration<String> enu = request.getParameterNames(); while (enu.hasMoreElements()) { String name = enu.nextElement(); String value = request.getParameter(name); query = query + "&" + name + "=" + HttpUtil.encodeURL(value); } if (_log.isDebugEnabled()) { _log.debug("Sending response to PayPal " + query); } URL url = new URL("https://www.paypal.com/cgi-bin/webscr"); URLConnection urlc = url.openConnection(); urlc.setDoOutput(true); urlc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); PrintWriter pw = new UnsyncPrintWriter(urlc.getOutputStream()); pw.println(query); pw.close(); UnsyncBufferedReader unsyncBufferedReader = new UnsyncBufferedReader( new InputStreamReader(urlc.getInputStream())); String payPalStatus = unsyncBufferedReader.readLine(); unsyncBufferedReader.close(); String itemName = ParamUtil.getString(request, "item_name"); String itemNumber = ParamUtil.getString(request, "item_number"); invoice = ParamUtil.getString(request, "invoice"); String txnId = ParamUtil.getString(request, "txn_id"); String paymentStatus = ParamUtil.getString(request, "payment_status"); double paymentGross = ParamUtil.getDouble(request, "mc_gross"); String receiverEmail = ParamUtil.getString(request, "receiver_email"); String payerEmail = ParamUtil.getString(request, "payer_email"); _log.error("Receiving response from PayPal " + payPalStatus); if (_log.isDebugEnabled()) { _log.debug("Receiving response from PayPal"); _log.debug("Item name " + itemName); _log.debug("Item number " + itemNumber); _log.debug("Invoice " + invoice); _log.debug("Transaction ID " + txnId); _log.debug("Payment status " + paymentStatus); _log.debug("Payment gross " + paymentGross); _log.debug("Receiver email " + receiverEmail); _log.debug("Payer email " + payerEmail); } if (payPalStatus.equals("VERIFIED") && validate(request)) { ShoppingOrderLocalServiceUtil.completeOrder(invoice, txnId, paymentStatus, paymentGross, receiverEmail, payerEmail, true); } else if (payPalStatus.equals("INVALID")) { } } catch (Exception e) { PortalUtil.sendError(e, request, response); } } protected boolean validate(ActionRequest request) throws Exception { // Invoice String ppInvoice = ParamUtil.getString(request, "invoice"); ShoppingOrder order = ShoppingOrderLocalServiceUtil.getOrder(ppInvoice); ShoppingPreferences shoppingPrefs = ShoppingPreferences.getInstance(order.getCompanyId(), order.getGroupId()); // Receiver email address String ppReceiverEmail = ParamUtil.getString(request, "receiver_email"); String payPalEmailAddress = shoppingPrefs.getPayPalEmailAddress(); if (!payPalEmailAddress.equals(ppReceiverEmail)) { return false; } // Payment gross double ppGross = ParamUtil.getDouble(request, "mc_gross"); double orderTotal = ShoppingUtil.calculateTotal(order); if (orderTotal != ppGross) { return false; } // Payment currency String ppCurrency = ParamUtil.getString(request, "mc_currency"); String currencyId = shoppingPrefs.getCurrencyId(); if (!currencyId.equals(ppCurrency)) { return false; } // Transaction ID String ppTxnId = ParamUtil.getString(request, "txn_id"); try { ShoppingOrderLocalServiceUtil.getPayPalTxnIdOrder(ppTxnId); return false; } catch (NoSuchOrderException nsoe) { } return true; } private static Log _log = LogFactoryUtil.getLog(ShoppingPortlet.class); }