Skip to content

Commit

Permalink
AD-254 Develop New Endpoint in OCC to Handle PaymentDetailsRequest an…
Browse files Browse the repository at this point in the history
…d Return PaymentDetailsResponse
  • Loading branch information
pjaneta committed May 28, 2024
1 parent fd80fce commit 43797e1
Show file tree
Hide file tree
Showing 14 changed files with 105 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.adyen.commerce.controllers.api;

import com.adyen.commerce.exceptions.AdyenControllerException;
import com.adyen.commerce.exception.AdyenControllerException;
import de.hybris.platform.acceleratorstorefrontcommons.annotations.RequireHardLogIn;
import de.hybris.platform.acceleratorstorefrontcommons.forms.AddressForm;
import de.hybris.platform.acceleratorstorefrontcommons.forms.validation.AddressValidator;
Expand All @@ -18,7 +18,6 @@
import org.springframework.stereotype.Controller;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.adyen.commerce.controllers.api;


import com.adyen.commerce.exceptions.AdyenControllerException;
import com.adyen.commerce.response.ErrorResponse;
import com.adyen.commerce.exception.AdyenControllerException;
import de.hybris.platform.acceleratorstorefrontcommons.annotations.RequireHardLogIn;
import de.hybris.platform.commercefacades.order.CheckoutFacade;
import de.hybris.platform.commercefacades.user.UserFacade;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.adyen.commerce.controllers.api;

import com.adyen.commerce.exceptions.AdyenControllerException;
import com.adyen.commerce.response.ErrorResponse;
import com.adyen.commerce.exception.AdyenControllerException;
import de.hybris.platform.acceleratorstorefrontcommons.annotations.RequireHardLogIn;
import de.hybris.platform.commercefacades.order.CheckoutFacade;
import de.hybris.platform.commercefacades.order.data.DeliveryModeData;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.adyen.commerce.controllers.api;

import com.adyen.commerce.exceptions.AdyenControllerException;
import com.adyen.commerce.controllerbase.PlaceOrderControllerBase;
import com.adyen.commerce.exception.AdyenControllerException;
import com.adyen.commerce.facades.AdyenCheckoutApiFacade;
import com.adyen.commerce.request.PlaceOrderRequest;
import com.adyen.commerce.response.PlaceOrderResponse;
Expand All @@ -9,7 +10,6 @@
import com.adyen.model.checkout.PaymentResponse;
import com.adyen.service.exception.ApiException;
import com.adyen.v6.exceptions.AdyenNonAuthorizedPaymentException;
import com.adyen.v6.util.AdyenUtil;
import de.hybris.platform.acceleratorfacades.flow.CheckoutFlowFacade;
import de.hybris.platform.acceleratorservices.urlresolver.SiteBaseUrlResolutionService;
import de.hybris.platform.acceleratorstorefrontcommons.annotations.RequireHardLogIn;
Expand Down Expand Up @@ -37,6 +37,7 @@

import static com.adyen.commerce.constants.AdyencheckoutaddonapiWebConstants.ADYEN_CHECKOUT_API_PREFIX;
import static com.adyen.commerce.constants.AdyencheckoutaddonapiWebConstants.AUTHORISE_3D_SECURE_PAYMENT_URL;
import static com.adyen.commerce.constants.AdyenwebcommonsConstants.CHECKOUT_ERROR_AUTHORIZATION_FAILED;
import static com.adyen.commerce.util.ErrorMessageUtil.getErrorMessageByRefusalReason;
import static com.adyen.commerce.util.FieldValidationUtil.getFieldCodesFromValidation;
import static com.adyen.model.checkout.PaymentResponse.ResultCodeEnum.CHALLENGESHOPPER;
Expand All @@ -45,18 +46,13 @@
import static com.adyen.model.checkout.PaymentResponse.ResultCodeEnum.PRESENTTOSHOPPER;
import static com.adyen.model.checkout.PaymentResponse.ResultCodeEnum.REDIRECTSHOPPER;
import static com.adyen.model.checkout.PaymentResponse.ResultCodeEnum.REFUSED;
import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_BCMC;
import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_CC;
import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_SCHEME;


@RequestMapping("/api/checkout")
@Controller
public class AdyenPlaceOrderController {
public class AdyenPlaceOrderController extends PlaceOrderControllerBase {
private static final Logger LOGGER = Logger.getLogger(AdyenPlaceOrderController.class);

private static final String CHECKOUT_ERROR_AUTHORIZATION_FAILED = "checkout.error.authorization.failed";
private static final String CHECKOUT_ERROR_POS_CONFIGURATION = "checkout.error.authorization.pos.configuration";
private static final String CHECKOUT_ERROR_FORM_ENTRY_INVALID = "checkout.error.paymentethod.formentry.invalid";
public static final String GET_TYPE = "getType";

Expand Down Expand Up @@ -134,7 +130,7 @@ private ResponseEntity<PlaceOrderResponse> handlePayment(HttpServletRequest requ
String errorMessage = CHECKOUT_ERROR_AUTHORIZATION_FAILED;

try {
cartData.setAdyenReturnUrl(get3DSReturnUrl());
cartData.setAdyenReturnUrl(getPaymentRedirectReturnUrl());
OrderData orderData = adyenCheckoutApiFacade.placeOrderWithPayment(request, cartData, placeOrderRequest.getPaymentRequest());

PlaceOrderResponse placeOrderResponse = new PlaceOrderResponse();
Expand Down Expand Up @@ -191,10 +187,6 @@ private ResponseEntity<PlaceOrderResponse> executeAction(PaymentResponse payment
return ResponseEntity.ok(placeOrderResponse);
}

private boolean is3DSPaymentMethod(String adyenPaymentMethod) {
return adyenPaymentMethod.equals(PAYMENT_METHOD_SCHEME) || adyenPaymentMethod.equals(PAYMENT_METHOD_CC) || adyenPaymentMethod.equals(PAYMENT_METHOD_BCMC) || AdyenUtil.isOneClick(adyenPaymentMethod);
}

private boolean isCartValid() {

if (checkoutFlowFacade.hasNoDeliveryAddress()) {
Expand Down Expand Up @@ -231,11 +223,17 @@ private boolean isCartValid() {
return true;
}

private String get3DSReturnUrl() {
private String getPaymentRedirectReturnUrl() {
String url = ADYEN_CHECKOUT_API_PREFIX + AUTHORISE_3D_SECURE_PAYMENT_URL;

BaseSiteModel currentBaseSite = baseSiteService.getCurrentBaseSite();

return siteBaseUrlResolutionService.getWebsiteUrlForSite(currentBaseSite, true, url);
}


@Override
public AdyenCheckoutApiFacade getAdyenCheckoutApiFacade() {
return adyenCheckoutApiFacade;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.adyen.commerce.controllers.exceptionhandlers;

import com.adyen.commerce.exceptions.AdyenControllerException;
import com.adyen.commerce.exception.AdyenControllerException;
import com.adyen.commerce.response.ErrorResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.adyen.commerce.controllers;

import com.adyen.commerce.constants.AdyenoccConstants;
import com.adyen.commerce.controllerbase.PlaceOrderControllerBase;
import com.adyen.commerce.facades.AdyenCheckoutApiFacade;
import com.adyen.commerce.response.PlaceOrderResponse;
import com.adyen.model.checkout.PaymentDetailsRequest;
import com.fasterxml.jackson.core.JsonProcessingException;
import de.hybris.platform.commerceservices.request.mapping.annotation.ApiVersion;
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.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = AdyenoccConstants.ADYEN_USER_CART_PREFIX)
@ApiVersion("v2")
@Tag(name = "Adyen")
public class PlaceOrderController extends PlaceOrderControllerBase {

@Autowired
private AdyenCheckoutApiFacade adyenCheckoutApiFacade;


@PostMapping(value = "/additional-details", produces= MediaType.APPLICATION_JSON_VALUE)
@Operation(operationId = "additionalDetails", summary = "Handle additional details action", description =
"Places pending order based on additional details request")
@ApiBaseSiteIdUserIdAndCartIdParam
public ResponseEntity<String> onAdditionalDetails(@RequestBody PaymentDetailsRequest detailsRequest) throws JsonProcessingException {
PlaceOrderResponse placeOrderResponse = handleAdditionalDetails(detailsRequest);

String response = objectMapper.writeValueAsString(placeOrderResponse);
return ResponseEntity.ok(response);
}

@Override
public AdyenCheckoutApiFacade getAdyenCheckoutApiFacade() {
return adyenCheckoutApiFacade;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.adyen.commerce.exceptionhandler;

import com.adyen.commerce.exception.AdyenOCCControllerException;
import com.adyen.commerce.exception.AdyenControllerException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class AdyenOCCControllerExceptionHandler {

@ExceptionHandler(value = AdyenOCCControllerException.class)
public ResponseEntity<Void> handleAdyenControllerException(AdyenOCCControllerException exception) {
@ExceptionHandler(value = AdyenControllerException.class)
public ResponseEntity<Void> handleAdyenControllerException(AdyenControllerException exception) {
return ResponseEntity.badRequest().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ public final class AdyenwebcommonsConstants extends GeneratedAdyenwebcommonsCons
public static final String EXTENSIONNAME = "adyenwebcommons";
public static final String REDIRECT_PREFIX = "redirect:";

public static final String CHECKOUT_ERROR_AUTHORIZATION_FAILED = "checkout.error.authorization.failed";


private AdyenwebcommonsConstants()
{
//empty to avoid instantiating this constant class
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.adyen.commerce.controllerbase;

import com.adyen.commerce.exception.AdyenControllerException;
import com.adyen.commerce.facades.AdyenCheckoutApiFacade;
import com.adyen.commerce.response.PlaceOrderResponse;
import com.adyen.model.checkout.PaymentDetailsRequest;
import com.adyen.service.exception.ApiException;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.hybris.platform.commercefacades.order.data.OrderData;
import org.apache.log4j.Logger;

import static com.adyen.commerce.constants.AdyenwebcommonsConstants.CHECKOUT_ERROR_AUTHORIZATION_FAILED;

public abstract class PlaceOrderControllerBase {
private static final Logger LOGGER = Logger.getLogger(PlaceOrderControllerBase.class);
protected static final ObjectMapper objectMapper = new ObjectMapper();


public PlaceOrderResponse handleAdditionalDetails(final PaymentDetailsRequest paymentDetailsRequest) {
try {
OrderData orderData = getAdyenCheckoutApiFacade().placeOrderWithAdditionalDetails(paymentDetailsRequest);
PlaceOrderResponse placeOrderResponse = new PlaceOrderResponse();
placeOrderResponse.setOrderNumber(orderData.getCode());
return placeOrderResponse;
} catch (ApiException e) {
LOGGER.error("ApiException: " + e);
throw new AdyenControllerException(CHECKOUT_ERROR_AUTHORIZATION_FAILED);
} catch (Exception e) {
LOGGER.error("Exception", e);
throw new AdyenControllerException(CHECKOUT_ERROR_AUTHORIZATION_FAILED);
}
}

public abstract AdyenCheckoutApiFacade getAdyenCheckoutApiFacade();
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import javax.servlet.http.HttpServletRequest;

import static com.adyen.commerce.constants.AdyenwebcommonsConstants.CHECKOUT_ERROR_AUTHORIZATION_FAILED;
import static com.adyen.commerce.util.ErrorMessageUtil.getErrorMessageByRefusalReason;
import static com.adyen.model.checkout.PaymentDetailsResponse.ResultCodeEnum;
import static com.adyen.model.checkout.PaymentDetailsResponse.ResultCodeEnum.REFUSED;
Expand All @@ -25,7 +26,6 @@ public abstract class RedirectControllerBase {
private static final String REDIRECT_RESULT = "redirectResult";
private static final String PAYLOAD = "payload";
private static final String NON_AUTHORIZED_ERROR = "Handling AdyenNonAuthorizedPaymentException. Checking PaymentResponse.";
private static final String CHECKOUT_ERROR_AUTHORIZATION_FAILED = "checkout.error.authorization.failed";
private static final String REDIRECTING_TO_CART_PAGE = "Redirecting to cart page...";


Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.adyen.commerce.exceptions;
package com.adyen.commerce.exception;

import com.adyen.commerce.response.ErrorResponse;

Expand Down

0 comments on commit 43797e1

Please sign in to comment.