From 12f78a52a8de504cb9c4dc9936ddf0577a300852 Mon Sep 17 00:00:00 2001 From: renatoma Date: Mon, 14 Dec 2020 17:29:52 +0100 Subject: [PATCH 1/9] Removed wrong import after merge error --- .../v6/controllers/pages/AdyenSummaryCheckoutStepController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/pages/AdyenSummaryCheckoutStepController.java b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/pages/AdyenSummaryCheckoutStepController.java index 700ee139b..1e17d616f 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/pages/AdyenSummaryCheckoutStepController.java +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/pages/AdyenSummaryCheckoutStepController.java @@ -91,7 +91,6 @@ import static com.adyen.v6.constants.Adyenv6coreConstants.RATEPAY; import static com.adyen.v6.facades.DefaultAdyenCheckoutFacade.MODEL_CHECKOUT_SHOPPER_HOST; import static com.adyen.v6.facades.DefaultAdyenCheckoutFacade.MODEL_ENVIRONMENT_MODE; -import static com.adyen.v6.facades.DefaultAdyenCheckoutFacade.MODEL_ORIGIN_KEY; @Controller @RequestMapping(value = SUMMARY_CHECKOUT_PREFIX) From cf0c43a5e7429406313cb4f973cc20cca91ed838 Mon Sep 17 00:00:00 2001 From: Renato Martins Date: Fri, 18 Dec 2020 12:07:00 +0100 Subject: [PATCH 2/9] [PW-3538]: Cancel pending orders after OFFER_CLOSED notification (#228) --- .../v6/service/AdyenNotificationService.java | 8 +++ .../DefaultAdyenNotificationService.java | 69 ++++++++++++++++--- 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/adyenv6core/src/com/adyen/v6/service/AdyenNotificationService.java b/adyenv6core/src/com/adyen/v6/service/AdyenNotificationService.java index f1a38d857..5b1cb1611 100644 --- a/adyenv6core/src/com/adyen/v6/service/AdyenNotificationService.java +++ b/adyenv6core/src/com/adyen/v6/service/AdyenNotificationService.java @@ -29,6 +29,7 @@ * Service for Adyen notifications manipulation */ public interface AdyenNotificationService { + /** * Process NotificationItemModel * Handles multiple eventCodes @@ -69,4 +70,11 @@ public interface AdyenNotificationService { * Process notification with eventCode=REFUND */ PaymentTransactionEntryModel processRefundEvent(NotificationItemModel notificationItem); + + /** + * Process notification with eventCode=OFFER_CLOSED + * @return + */ + PaymentTransactionModel processOfferClosedEvent(NotificationItemModel notificationItem); + } diff --git a/adyenv6core/src/com/adyen/v6/service/DefaultAdyenNotificationService.java b/adyenv6core/src/com/adyen/v6/service/DefaultAdyenNotificationService.java index 4f81fcf94..306a1afce 100644 --- a/adyenv6core/src/com/adyen/v6/service/DefaultAdyenNotificationService.java +++ b/adyenv6core/src/com/adyen/v6/service/DefaultAdyenNotificationService.java @@ -23,7 +23,9 @@ import java.util.Date; import java.util.UUID; -import com.adyen.v6.facades.AdyenCheckoutFacade; +import de.hybris.platform.core.enums.OrderStatus; +import de.hybris.platform.payment.dto.TransactionStatus; +import de.hybris.platform.payment.enums.PaymentTransactionType; import org.apache.log4j.Logger; import com.adyen.model.notification.NotificationRequest; import com.adyen.model.notification.NotificationRequestItem; @@ -34,19 +36,12 @@ import com.adyen.v6.repository.OrderRepository; import com.adyen.v6.repository.PaymentTransactionRepository; import com.google.gson.Gson; -import de.hybris.platform.commerceservices.enums.SalesApplication; import de.hybris.platform.commerceservices.order.CommercePlaceOrderStrategy; -import de.hybris.platform.commerceservices.service.data.CommerceCheckoutParameter; -import de.hybris.platform.commerceservices.service.data.CommerceOrderResult; -import de.hybris.platform.core.model.order.CartModel; import de.hybris.platform.core.model.order.OrderModel; -import de.hybris.platform.order.InvalidCartException; import de.hybris.platform.payment.dto.TransactionStatusDetails; import de.hybris.platform.payment.model.PaymentTransactionEntryModel; import de.hybris.platform.payment.model.PaymentTransactionModel; -import de.hybris.platform.servicelayer.internal.i18n.I18NConstants; import de.hybris.platform.servicelayer.model.ModelService; -import de.hybris.platform.servicelayer.session.SessionExecutionBody; import de.hybris.platform.servicelayer.session.SessionService; public class DefaultAdyenNotificationService implements AdyenNotificationService { @@ -195,6 +190,61 @@ public PaymentTransactionEntryModel processRefundEvent(NotificationItemModel not return paymentTransactionEntryModel; } + @Override + public PaymentTransactionModel processOfferClosedEvent(NotificationItemModel notificationItemModel) { + String orderCode = notificationItemModel.getMerchantReference(); + if(!notificationItemModel.getSuccess()) { + LOG.warn("Order " + orderCode + " received unexpected OFFER_CLOSED event with success=false"); + return null; + } + + OrderModel orderModel = orderRepository.getOrderModel(orderCode); + if (orderModel == null) { + LOG.warn("Order " + orderCode + " was not found, skipping OFFER_CLOSED event..."); + return null; + } + if (isOrderAuthorized(orderModel)) { + LOG.warn("Order " + orderCode + " already authorised, skipping OFFER_CLOSED event..."); + return null; + } + if (OrderStatus.CANCELLED.equals(orderModel.getStatus()) || OrderStatus.PROCESSING_ERROR.equals(orderModel.getStatus())) { + LOG.warn("Order " + orderCode + " already cancelled, skipping OFFER_CLOSED event..."); + return null; + } + + orderModel.setStatus(OrderStatus.PROCESSING_ERROR); + orderModel.setStatusInfo("Adyen OFFER_CLOSED: " + notificationItemModel.getPspReference()); + getModelService().save(orderModel); + + return adyenTransactionService.storeFailedAuthorizationFromNotification(notificationItemModel, orderModel); + } + + private boolean isTransactionAuthorized(final PaymentTransactionModel paymentTransactionModel) { + for (final PaymentTransactionEntryModel entry : paymentTransactionModel.getEntries()) { + if (entry.getType().equals(PaymentTransactionType.AUTHORIZATION) + && TransactionStatus.ACCEPTED.name().equals(entry.getTransactionStatus())) { + return true; + } + } + + return false; + } + + private boolean isOrderAuthorized(final OrderModel order) { + if(order.getPaymentTransactions() == null || order.getPaymentTransactions().isEmpty()) { + return false; + } + + //A single not authorized transaction means not authorized + for (final PaymentTransactionModel paymentTransactionModel : order.getPaymentTransactions()) { + if (!isTransactionAuthorized(paymentTransactionModel)) { + return false; + } + } + + return true; + } + @Override public void processNotification(NotificationItemModel notificationItemModel) { PaymentTransactionModel paymentTransaction; @@ -218,6 +268,9 @@ public void processNotification(NotificationItemModel notificationItemModel) { case NotificationRequestItem.EVENT_CODE_REFUND: processRefundEvent(notificationItemModel); break; + case NotificationRequestItem.EVENT_CODE_OFFER_CLOSED: + processOfferClosedEvent(notificationItemModel); + break; } } From 2c881fb99a927e80a80457988f2f6dcef8bc6095 Mon Sep 17 00:00:00 2001 From: renatoma Date: Thu, 24 Dec 2020 13:11:06 +0100 Subject: [PATCH 3/9] Apple pay component (WIP) --- .../pages/AdyenComponentController.java | 3 ++ .../tags/responsive/checkoutOrderSummary.tag | 8 ++-- .../checkout/multi/checkoutSummaryPage.jsp | 8 +++- .../responsive/common/js/adyen.checkout.js | 44 ++++++++++++++++++- adyenv6core/resources/adyenv6core-beans.xml | 14 +++--- adyenv6core/resources/adyenv6core-items.xml | 19 ++++++++ .../v6/constants/Adyenv6coreConstants.java | 2 + .../facades/DefaultAdyenCheckoutFacade.java | 42 ++++++++++++++---- .../com/adyen/v6/populator/CartPopulator.java | 2 + 9 files changed, 123 insertions(+), 19 deletions(-) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/pages/AdyenComponentController.java b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/pages/AdyenComponentController.java index a18cc312b..34aa3b7fb 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/pages/AdyenComponentController.java +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/pages/AdyenComponentController.java @@ -22,6 +22,7 @@ import com.adyen.model.checkout.PaymentMethodDetails; import com.adyen.model.checkout.PaymentsResponse; +import com.adyen.model.checkout.details.ApplePayDetails; import com.adyen.model.checkout.details.MbwayDetails; import com.adyen.model.checkout.details.PayPalDetails; import com.adyen.service.exception.ApiException; @@ -98,6 +99,8 @@ public String componentPayment(final HttpServletRequest request) throws AdyenCom paymentMethodDetails = gson.fromJson(requestJson.get("paymentMethodDetails"), PayPalDetails.class); } else if("mbway".equals(paymentMethod)) { paymentMethodDetails = gson.fromJson(requestJson.get("paymentMethodDetails"), MbwayDetails.class); + } else if("applepay".equals(paymentMethod)) { + paymentMethodDetails = gson.fromJson(requestJson.get("paymentMethodDetails"), ApplePayDetails.class); } else { throw new InvalidCartException("checkout.error.paymentethod.formentry.invalid"); } diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/checkoutOrderSummary.tag b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/checkoutOrderSummary.tag index aee1c36be..89515cb23 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/checkoutOrderSummary.tag +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/checkoutOrderSummary.tag @@ -11,9 +11,9 @@ <%-- Components --%> - + <%-- Paypal button --%> - +
-
+
@@ -33,7 +33,7 @@ <%-- Paypal has it's own button --%> - +