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;
}