From 4eee79d9d107063a31b03a5f2ff95f69a08d6b73 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Thu, 26 Sep 2024 14:48:48 +0200 Subject: [PATCH] AD-315 I can't pay with any method if the first payment attempt is canceled --- .../PaymentCanceledController.java | 37 +++++++++++++++++++ .../controllers/PlaceOrderController.java | 14 +------ adyenv6core/resources/adyenv6core-spring.xml | 1 + .../impl/DefaultAdyenCheckoutApiFacade.java | 3 +- .../adyen/v6/facades/AdyenCheckoutFacade.java | 2 + .../adyen/v6/facades/AdyenOrderFacade.java | 3 ++ .../impl/DefaultAdyenCheckoutFacade.java | 27 +++++++++++++- .../facades/impl/DefaultAdyenOrderFacade.java | 16 +++++++- .../PlaceOrderControllerBase.java | 1 + 9 files changed, 87 insertions(+), 17 deletions(-) create mode 100644 adyenocc/src/com/adyen/commerce/controllers/PaymentCanceledController.java diff --git a/adyenocc/src/com/adyen/commerce/controllers/PaymentCanceledController.java b/adyenocc/src/com/adyen/commerce/controllers/PaymentCanceledController.java new file mode 100644 index 00000000..35d010d9 --- /dev/null +++ b/adyenocc/src/com/adyen/commerce/controllers/PaymentCanceledController.java @@ -0,0 +1,37 @@ +package com.adyen.commerce.controllers; + +import com.adyen.commerce.constants.AdyenoccConstants; +import com.adyen.v6.facades.AdyenCheckoutFacade; +import de.hybris.platform.commerceservices.request.mapping.annotation.ApiVersion; +import de.hybris.platform.order.InvalidCartException; +import de.hybris.platform.order.exceptions.CalculationException; +import de.hybris.platform.webservicescommons.swagger.ApiBaseSiteIdUserIdAndCartIdParam; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value = AdyenoccConstants.ADYEN_USER_PREFIX) +@ApiVersion("v2") +@Tag(name = "Adyen") +public class PaymentCanceledController { + + @Autowired + private AdyenCheckoutFacade adyenCheckoutFacade; + + @Secured({"ROLE_CUSTOMERGROUP", "ROLE_CLIENT", "ROLE_CUSTOMERMANAGERGROUP", "ROLE_TRUSTED_CLIENT"}) + @PostMapping(value = "/payment-canceled/{orderCode}") + @Operation(operationId = "paymentCanceled", summary = "Handle payment canceled request", description = + "Restores cart from order code and data in session") + @ApiBaseSiteIdUserIdAndCartIdParam + public ResponseEntity onCancel(@PathVariable String orderCode) throws InvalidCartException, CalculationException { + adyenCheckoutFacade.restoreCartFromOrderOCC(orderCode); + return ResponseEntity.ok().build(); + } +} diff --git a/adyenocc/src/com/adyen/commerce/controllers/PlaceOrderController.java b/adyenocc/src/com/adyen/commerce/controllers/PlaceOrderController.java index b54d63e3..58fc5d00 100644 --- a/adyenocc/src/com/adyen/commerce/controllers/PlaceOrderController.java +++ b/adyenocc/src/com/adyen/commerce/controllers/PlaceOrderController.java @@ -26,10 +26,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -91,15 +88,6 @@ public ResponseEntity onAdditionalDetails(@RequestBody PaymentDetailsReq return ResponseEntity.ok(response); } - @Secured({"ROLE_CUSTOMERGROUP", "ROLE_CLIENT", "ROLE_CUSTOMERMANAGERGROUP", "ROLE_TRUSTED_CLIENT"}) - @PostMapping(value = "/payment-canceled") - @Operation(operationId = "paymentCanceled", summary = "Handle payment canceled request", description = - "Restores cart from order code and data in session") - @ApiBaseSiteIdUserIdAndCartIdParam - public ResponseEntity onCancel() throws InvalidCartException, CalculationException { - super.handleCancel(); - return ResponseEntity.ok().build(); - } @Override public String getPaymentRedirectReturnUrl() { diff --git a/adyenv6core/resources/adyenv6core-spring.xml b/adyenv6core/resources/adyenv6core-spring.xml index f47b8f08..0269acbd 100644 --- a/adyenv6core/resources/adyenv6core-spring.xml +++ b/adyenv6core/resources/adyenv6core-spring.xml @@ -227,6 +227,7 @@ + diff --git a/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java b/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java index a8c124d7..80ced530 100644 --- a/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java +++ b/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java @@ -108,7 +108,8 @@ public OrderData placeOrderWithPayment(final HttpServletRequest request, final C || PaymentResponse.ResultCodeEnum.IDENTIFYSHOPPER == paymentResponse.getResultCode() || PaymentResponse.ResultCodeEnum.PRESENTTOSHOPPER == paymentResponse.getResultCode()) { LOGGER.info("Placing pending order"); - placePendingOrder(paymentResponse.getResultCode().getValue()); + OrderData orderData = placePendingOrder(paymentResponse.getResultCode().getValue()); + paymentResponse.setMerchantReference(orderData.getCode()); throw new AdyenNonAuthorizedPaymentException(paymentResponse); } if (PaymentResponse.ResultCodeEnum.AUTHORISED == paymentResponse.getResultCode()) { diff --git a/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java index 029812c7..2d543e4f 100644 --- a/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java @@ -211,6 +211,8 @@ public interface AdyenCheckoutFacade { void restoreCartFromOrderCodeInSession() throws InvalidCartException, CalculationException; + void restoreCartFromOrderOCC(String orderCode) throws CalculationException, InvalidCartException; + String getClientKey(); CheckoutConfigDTO getCheckoutConfig() throws ApiException; diff --git a/adyenv6core/src/com/adyen/v6/facades/AdyenOrderFacade.java b/adyenv6core/src/com/adyen/v6/facades/AdyenOrderFacade.java index 0a527f0d..d2545b83 100644 --- a/adyenv6core/src/com/adyen/v6/facades/AdyenOrderFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/AdyenOrderFacade.java @@ -1,7 +1,10 @@ package com.adyen.v6.facades; +import de.hybris.platform.core.model.order.OrderModel; + public interface AdyenOrderFacade { String getPaymentStatus(final String orderCode, final String sessionGuid); String getPaymentStatusOCC(final String code); String getOrderCodeForGUID(final String orderGUID, final String sessionGuid); + OrderModel getOrderModelForCodeOCC(String code); } \ No newline at end of file diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index 3e653208..09a8d50d 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -49,6 +49,7 @@ import com.adyen.v6.exceptions.AdyenNonAuthorizedPaymentException; import com.adyen.v6.facades.AdyenCheckoutFacade; import com.adyen.v6.facades.AdyenExpressCheckoutFacade; +import com.adyen.v6.facades.AdyenOrderFacade; import com.adyen.v6.factory.AdyenPaymentServiceFactory; import com.adyen.v6.forms.AddressForm; import com.adyen.v6.forms.AdyenPaymentForm; @@ -184,6 +185,7 @@ public class DefaultAdyenCheckoutFacade implements AdyenCheckoutFacade { private I18NFacade i18NFacade; private ConfigurationService configurationService; private AdyenMerchantAccountStrategy adyenMerchantAccountStrategy; + private AdyenOrderFacade adyenOrderFacade; public static final Logger LOGGER = Logger.getLogger(DefaultAdyenCheckoutFacade.class); @@ -1554,11 +1556,30 @@ protected void restoreCartFromOrder(String orderCode) throws CalculationExceptio LOGGER.info("Restoring cart from order"); OrderModel orderModel = getOrderRepository().getOrderModel(orderCode); + + if (orderModel == null) { + LOGGER.error("Could not restore cart to session, order with code '" + orderCode + "' not found!"); + return; + } + + restoreCartFromOrderInternal(orderModel); + } + + public void restoreCartFromOrderOCC(String orderCode) throws CalculationException, InvalidCartException { + LOGGER.info("Restoring cart from order"); + + OrderModel orderModel = adyenOrderFacade.getOrderModelForCodeOCC(orderCode); + if (orderModel == null) { LOGGER.error("Could not restore cart to session, order with code '" + orderCode + "' not found!"); return; } + restoreCartFromOrderInternal(orderModel); + } + + protected void restoreCartFromOrderInternal(final OrderModel orderModel) throws CalculationException, InvalidCartException{ + // Get cart from session CartModel cartModel; if (getCartService().hasSessionCart()) { @@ -1573,7 +1594,7 @@ protected void restoreCartFromOrder(String orderCode) throws CalculationExceptio Boolean isAnonymousCheckout = getCheckoutCustomerStrategy().isAnonymousCheckout(); if (!isAnonymousCheckout && hasUserContextChanged(orderModel, cartModel)) { - throw new InvalidCartException("Cart from order '" + orderCode + "' not restored to session, since user or store in session changed."); + throw new InvalidCartException("Cart from order '" + orderModel.getCode() + "' not restored to session, since user or store in session changed."); } //Populate cart entries @@ -1882,4 +1903,8 @@ protected UserFacade getUserFacade() { public void setAdyenMerchantAccountStrategy(AdyenMerchantAccountStrategy adyenMerchantAccountStrategy) { this.adyenMerchantAccountStrategy = adyenMerchantAccountStrategy; } + + public void setAdyenOrderFacade(AdyenOrderFacade adyenOrderFacade) { + this.adyenOrderFacade = adyenOrderFacade; + } } diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenOrderFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenOrderFacade.java index 507c992c..f6346e45 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenOrderFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenOrderFacade.java @@ -39,7 +39,7 @@ public String getPaymentStatus(final String orderCode, final String sessionGuid) @Override public String getPaymentStatusOCC(final String code) { - final OrderModel orderModel = getOrderModelForCodeOCC(code); + final OrderModel orderModel = getOrderModelForCodeOrGuidOCC(code); return getPaymentStatusForOrder(orderModel); } @@ -67,7 +67,19 @@ protected String getPaymentStatusForOrder(final OrderModel orderModel) { return getStatus(paymentTransactions); } - protected OrderModel getOrderModelForCodeOCC(String code) { + public OrderModel getOrderModelForCodeOCC(String code) { + BaseStoreModel currentBaseStore = baseStoreService.getCurrentBaseStore(); + final OrderModel orderModel; + + orderModel = customerAccountService.getOrderForCode((CustomerModel) userService.getCurrentUser(), code, currentBaseStore); + + if (orderModel == null) { + throw new UnknownIdentifierException(String.format(ORDER_NOT_FOUND_FOR_USER_AND_BASE_STORE, code)); + } + return orderModel; + } + + protected OrderModel getOrderModelForCodeOrGuidOCC(String code) { BaseStoreModel currentBaseStore = baseStoreService.getCurrentBaseStore(); final OrderModel orderModel; diff --git a/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java b/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java index f5151b71..8d3b090d 100644 --- a/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java +++ b/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java @@ -208,6 +208,7 @@ private OCCPlaceOrderResponse executeAction(PaymentResponse paymentsResponse) { placeOrderResponse.setPaymentsResponse(paymentsResponse); placeOrderResponse.setExecuteAction(true); placeOrderResponse.setPaymentsAction(paymentsResponse.getAction()); + placeOrderResponse.setOrderNumber(paymentsResponse.getMerchantReference()); return placeOrderResponse; }