From 7538eb43bcf3a4b25b51ff2124b72170610c9e4e Mon Sep 17 00:00:00 2001 From: rajni Date: Tue, 2 Apr 2019 14:52:28 +0200 Subject: [PATCH 01/23] [PW-1094]: Added 3DS2 request submission support. --- .../constants/AdyenControllerConstants.java | 1 + .../AdyenSummaryCheckoutStepController.java | 21 +++++++ .../pages/checkout/multi/3ds2_payment.jsp | 29 +++++++++ .../multi/selectPaymentMethodPage.jsp | 3 + .../responsive/common/js/adyen.checkout.js | 30 ++++++++++ .../responsive/common/js/threeds2-js-utils.js | 1 + adyenv6core/resources/adyenv6core-beans.xml | 1 + adyenv6core/resources/adyenv6core-items.xml | 8 +++ .../facades/DefaultAdyenCheckoutFacade.java | 19 +++++- .../adyen/v6/factory/AdyenRequestFactory.java | 60 +++++++++++++++++++ .../com/adyen/v6/forms/AdyenPaymentForm.java | 12 ++++ .../src/com/adyen/v6/model/RequestInfo.java | 14 +++++ .../com/adyen/v6/populator/CartPopulator.java | 1 + 13 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds2_payment.jsp create mode 100644 adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/threeds2-js-utils.js diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/constants/AdyenControllerConstants.java b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/constants/AdyenControllerConstants.java index 3b691a568..8576d6c5d 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/constants/AdyenControllerConstants.java +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/constants/AdyenControllerConstants.java @@ -42,6 +42,7 @@ interface MultiStepCheckout String SelectPaymentMethod = ADDON_PREFIX + "pages/checkout/multi/selectPaymentMethodPage"; String Validate3DSecurePaymentPage = ADDON_PREFIX + "pages/checkout/multi/3d-secure-payment-validation"; String HppPaymentPage = ADDON_PREFIX + "pages/checkout/multi/hpp-payment"; + String Validate3DS2PaymentPage = ADDON_PREFIX +"pages/checkout/multi/3ds2_payment"; } } 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 63035096b..2b3537726 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 @@ -65,6 +65,8 @@ import static com.adyen.constants.ApiConstants.Redirect.Data.MD; import static com.adyen.constants.ApiConstants.Redirect.Data.PAREQ; import static com.adyen.constants.BrandCodes.PAYPAL_ECS; +import static com.adyen.model.checkout.PaymentsResponse.ResultCodeEnum.CHALLENGESHOPPER; +import static com.adyen.model.checkout.PaymentsResponse.ResultCodeEnum.IDENTIFYSHOPPER; import static com.adyen.model.checkout.PaymentsResponse.ResultCodeEnum.REDIRECTSHOPPER; import static com.adyen.model.checkout.PaymentsResponse.ResultCodeEnum.REFUSED; import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_BOLETO; @@ -199,6 +201,25 @@ else if (PAYMENT_METHOD_MULTIBANCO.equals(cartData.getAdyenPaymentMethod())) { if (REFUSED == paymentsResponse.getResultCode()) { errorMessage = getErrorMessageByRefusalReason(paymentsResponse.getRefusalReason()); } + if(IDENTIFYSHOPPER == paymentsResponse.getResultCode()) + { + if (adyenPaymentMethod.equals(PAYMENT_METHOD_CC)) { + LOGGER.debug("IDENTIFYSHOPPER!!!! terminating it here for now"); + model.addAttribute("paymentData", paymentsResponse.getPaymentData()); + model.addAttribute("resultObject", paymentsResponse.getAuthentication().get("threeds2.fingerprintToken")); + return AdyenControllerConstants.Views.Pages.MultiStepCheckout.Validate3DS2PaymentPage; + } + } + if(CHALLENGESHOPPER == paymentsResponse.getResultCode()) + { + if (adyenPaymentMethod.equals(PAYMENT_METHOD_CC)) { + LOGGER.debug("CHALLENGESHOPPER!!!! terminating it here for now"); + model.addAttribute("paymentData", paymentsResponse.getPaymentData()); + model.addAttribute("resultObject", paymentsResponse.getAuthentication().get("threeds2.challengeToken")); + return AdyenControllerConstants.Views.Pages.MultiStepCheckout.Validate3DS2PaymentPage; + } + + } } catch (Exception e) { LOGGER.error(ExceptionUtils.getStackTrace(e)); } diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds2_payment.jsp b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds2_payment.jsp new file mode 100644 index 000000000..fcffa0829 --- /dev/null +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds2_payment.jsp @@ -0,0 +1,29 @@ +<%@ page trimDirectiveWhitespaces="true" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + +
+
+ +
+ + + +

Hello you are on 3DS2 page

+ + + + + + +
+
+ + + + + diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/selectPaymentMethodPage.jsp b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/selectPaymentMethodPage.jsp index 3b9f325d6..9f73b8895 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/selectPaymentMethodPage.jsp +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/selectPaymentMethodPage.jsp @@ -40,6 +40,7 @@ return false; } AdyenCheckoutHybris.setCustomPaymentMethodValues(); + AdyenCheckoutHybris.setBrowserData(); $( "#adyen-encrypted-form" ).submit(); } ); @@ -108,6 +109,8 @@ + +
2&&void 0!==arguments[2]?arguments[2]:"0",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"0",a=arguments.length>4?arguments[4]:void 0;if(!n||0===n.length)throw new Error("Name parameter missing for iframe");e instanceof HTMLElement?r.container=e:r.container=document.body;var i=document.createElement("iframe");i.classList.add(n+"Class"),i.width=t,i.height=o,i.name=n,i.setAttribute("frameborder","0"),i.setAttribute("border","0");var d=document.createTextNode("

Your browser does not support iframes.

");return i.appendChild(d),r.container.appendChild(i),function(e,n){e.attachEvent?e.attachEvent("onload",function(){n&&"function"===typeof n&&n(e.contentWindow)}):e.onload=function(){n&&"function"===typeof n&&n(e.contentWindow)}}(i,a),i},createForm:function(e,n,t,r,o){if(!e||!n||!t||!r||!o)throw new Error("Not all required parameters provided for form creation");if(0===e.length||0===n.length||0===t.length||0===r.length||0===o.length)throw new Error("Not all required parameters have suitable values");var a=document.createElement("form");a.style.display="none",a.name=e,a.action=n,a.method="POST",a.target=t;var i=document.createElement("input");return i.name=r,i.value=o,a.appendChild(i),a},getBrowserInfo:function(){var e=window&&window.screen?window.screen.width:"",n=window&&window.screen?window.screen.height:"",t=window&&window.screen?window.screen.colorDepth:"",r=window&&window.navigator?window.navigator.userAgent:"",o=!(!window||!window.navigator)&&navigator.javaEnabled(),a="";return window&&window.navigator&&(a=window.navigator.language?window.navigator.language:window.navigator.browserLanguage),{screenWidth:e,screenHeight:n,colorDepth:t,userAgent:r,timeZoneOffset:(new Date).getTimezoneOffset(),language:a,javaEnabled:o}},base64Url:{encode:function(e){var n=window.btoa(e).split("=")[0];return n=(n=n.replace("/+/g","-")).replace("///g","_")},decode:function(e){var n=e;switch((n=(n=n.replace("/-/g","+")).replace("/_/g","/")).length%4){case 0:break;case 2:n+="==";break;case 3:n+="=";break;default:window.console&&window.console.log&&window.console.log("### base64url::decodeBase64URL:: Illegal base64url string!")}try{return window.atob(n)}catch(e){throw new Error(e)}}},config:{challengeWindowSizes:o,validateChallengeWindowSize:a,getChallengeWindowSize:function(e){return o[a(e)]},THREEDS_METHOD_TIMEOUT:1e4,CHALLENGE_TIMEOUT:6e5}};n.default=i}]).default}); \ No newline at end of file diff --git a/adyenv6core/resources/adyenv6core-beans.xml b/adyenv6core/resources/adyenv6core-beans.xml index 889a5203b..fe5c01d62 100644 --- a/adyenv6core/resources/adyenv6core-beans.xml +++ b/adyenv6core/resources/adyenv6core-beans.xml @@ -33,6 +33,7 @@ + diff --git a/adyenv6core/resources/adyenv6core-items.xml b/adyenv6core/resources/adyenv6core-items.xml index 2f58d94f4..9109adc28 100644 --- a/adyenv6core/resources/adyenv6core-items.xml +++ b/adyenv6core/resources/adyenv6core-items.xml @@ -248,6 +248,14 @@ Credit Card Type + + Browser Info for 3DS 2 + + + HYBRIS.LONG_STRING + + + Credit Card expiration date diff --git a/adyenv6core/src/com/adyen/v6/facades/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/DefaultAdyenCheckoutFacade.java index 6f1ab0084..3f080cc74 100644 --- a/adyenv6core/src/com/adyen/v6/facades/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/DefaultAdyenCheckoutFacade.java @@ -434,6 +434,20 @@ public OrderData authorisePayment(final HttpServletRequest request, final CartDa } lockSessionCart(); } + if ("IdentifyShopper".equals(paymentsResponse.getResultCode())) { + if (PAYMENT_METHOD_CC.equals(adyenPaymentMethod) || adyenPaymentMethod.indexOf(PAYMENT_METHOD_ONECLICK) == 0) { + getSessionService().setAttribute(SESSION_MD, paymentsResponse.getRedirect().getData().get(MD)); + getSessionService().setAttribute(SESSION_PAYMENT_DATA, paymentsResponse.getPaymentData()); + } + lockSessionCart(); + } + if ("ChallengeShopper".equals(paymentsResponse.getResultCode())) { + if (PAYMENT_METHOD_CC.equals(adyenPaymentMethod) || adyenPaymentMethod.indexOf(PAYMENT_METHOD_ONECLICK) == 0) { + getSessionService().setAttribute(SESSION_MD, paymentsResponse.getRedirect().getData().get(MD)); + getSessionService().setAttribute(SESSION_PAYMENT_DATA, paymentsResponse.getPaymentData()); + } + lockSessionCart(); + } throw new AdyenNonAuthorizedPaymentException(paymentsResponse); } @@ -634,7 +648,7 @@ public void initializeCheckoutData(Model model) { alternativePaymentMethods = alternativePaymentMethods.stream() .filter(paymentMethod -> ! paymentMethod.getType().isEmpty() && !isHiddenPaymentMethod(paymentMethod)) - .collect(Collectors.toList()); + .collect(Collectors.toList()); } catch (ApiException | IOException e) { LOGGER.error(ExceptionUtils.getStackTrace(e)); } @@ -788,6 +802,9 @@ public PaymentInfoModel createPaymentInfo(final CartModel cartModel, AdyenPaymen paymentInfo.setAdyenCardHolder(adyenPaymentForm.getCardHolder()); + //required for 3DS2 + paymentInfo.setAdyenBrowserInfo(adyenPaymentForm.getBrowserInfo()); + modelService.save(paymentInfo); return paymentInfo; diff --git a/adyenv6core/src/com/adyen/v6/factory/AdyenRequestFactory.java b/adyenv6core/src/com/adyen/v6/factory/AdyenRequestFactory.java index f0deae7c8..d10042827 100644 --- a/adyenv6core/src/com/adyen/v6/factory/AdyenRequestFactory.java +++ b/adyenv6core/src/com/adyen/v6/factory/AdyenRequestFactory.java @@ -23,6 +23,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Currency; +import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; @@ -33,6 +34,7 @@ import com.adyen.model.Address; import com.adyen.model.Amount; import com.adyen.model.Installments; +import com.adyen.model.BrowserInfo; import com.adyen.model.Name; import com.adyen.model.PaymentRequest; import com.adyen.model.PaymentRequest3d; @@ -53,6 +55,7 @@ import com.adyen.v6.enums.AdyenCardTypeEnum; import com.adyen.v6.enums.RecurringContractMode; import com.adyen.v6.model.RequestInfo; +import com.google.gson.Gson; import de.hybris.platform.commercefacades.order.data.CartData; import de.hybris.platform.commercefacades.order.data.OrderEntryData; import de.hybris.platform.commercefacades.user.data.AddressData; @@ -77,6 +80,7 @@ public class AdyenRequestFactory { private static final String PLATFORM_NAME = "Hybris"; private static final String PLATFORM_VERSION_PROPERTY = "build.version.api"; + private static final String IS_3DS2_ALLOWED_PROPERTY = "is3DS2allowed"; public PaymentRequest3d create3DAuthorizationRequest(final String merchantAccount, final HttpServletRequest request, final String md, final String paRes) { return createBasePaymentRequest(new PaymentRequest3d(), request, merchantAccount).set3DRequestData(md, paRes); @@ -164,6 +168,17 @@ public PaymentsRequest createPaymentsRequest(final String merchantAccount, //For credit cards if (PAYMENT_METHOD_CC.equals(adyenPaymentMethod)) { updatePaymentRequestForCC(paymentsRequest, cartData, recurringContractMode); + Boolean is3DS2allowed = is3DS2Allowed(); + + LOG.debug("is3DS2allowed"+ is3DS2allowed); + + if(is3DS2allowed) + { + LOG.debug("payment request before enhancement"+ paymentsRequest.toString()); + paymentsRequest = enhanceForThreeDS2(paymentsRequest, cartData); + LOG.debug("payment request after enhancement"+ paymentsRequest.toString()); + } + } //For one click else if (adyenPaymentMethod.indexOf(PAYMENT_METHOD_ONECLICK) == 0) { @@ -192,6 +207,39 @@ else if (cartData.getAdyenPaymentMethod().indexOf(PAYMENT_METHOD_BOLETO) == 0) { return paymentsRequest; } + public PaymentsRequest enhanceForThreeDS2(PaymentsRequest paymentsRequest, CartData cartData) + { + if ( paymentsRequest.getAdditionalData()==null) + { + paymentsRequest.setAdditionalData(new HashMap<>()); + } + paymentsRequest.getAdditionalData().put("allow3DS2", is3DS2Allowed().toString()); + paymentsRequest.setChannel(PaymentsRequest.ChannelEnum.WEB); + BrowserInfo browserInfo = new Gson().fromJson(cartData.getAdyenBrowserInfo(), BrowserInfo.class); + + LOG.debug("browserInfo before update :" + browserInfo.toString()); + + browserInfo = updateBrowserInfoFromRequest(browserInfo, paymentsRequest); + + LOG.debug("browserInfo after update :" + browserInfo.toString()); + + paymentsRequest.setBrowserInfo(browserInfo); + + LOG.debug(paymentsRequest.getBrowserInfo()); + + return paymentsRequest; + } + + public BrowserInfo updateBrowserInfoFromRequest(BrowserInfo browserInfo, PaymentsRequest paymentsRequest) + { + if(browserInfo!= null) + { + browserInfo.setUserAgent(paymentsRequest.getBrowserInfo().getUserAgent()); + browserInfo.setAcceptHeader(paymentsRequest.getBrowserInfo().getAcceptHeader()); + } + return browserInfo; + } + public ApplicationInfo updateApplicationInfo(ApplicationInfo applicationInfo) { if (applicationInfo == null) { applicationInfo = new ApplicationInfo(); @@ -223,9 +271,13 @@ private void updatePaymentRequest(final String merchantAccount, final CartData c String userAgent = requestInfo.getUserAgent(); String acceptHeader = requestInfo.getAcceptHeader(); String shopperIP = requestInfo.getShopperIp(); + String origin = requestInfo.getOrigin(); + + LOG.debug("requestinfo is 1 "+ requestInfo.toString()); paymentsRequest.setAmountData(amount, currency).reference(reference).merchantAccount(merchantAccount).addBrowserInfoData(userAgent, acceptHeader). shopperIP(shopperIP).setCountryCode(getCountryCode(cartData)); + paymentsRequest.setOrigin(origin); // set shopper details from CustomerModel. if (customerModel != null) { @@ -360,6 +412,9 @@ public DisableRequest createDisableRequest(final String merchantAccount, final S private T createBasePaymentRequest(T abstractPaymentRequest, HttpServletRequest request, final String merchantAccount) { String userAgent = request.getHeader("User-Agent"); String acceptHeader = request.getHeader("Accept"); + LOG.debug("userAgent is "+ userAgent); + LOG.debug("acceptHeader is "+ acceptHeader); + String shopperIP = request.getRemoteAddr(); abstractPaymentRequest.merchantAccount(merchantAccount).setBrowserInfoData(userAgent, acceptHeader).shopperIP(shopperIP); @@ -711,6 +766,11 @@ private String getPlatformVersion() { return getConfigurationService().getConfiguration().getString(PLATFORM_VERSION_PROPERTY); } + private Boolean is3DS2Allowed() + { + return getConfigurationService().getConfiguration().getBoolean(IS_3DS2_ALLOWED_PROPERTY); + } + public ConfigurationService getConfigurationService() { return configurationService; } diff --git a/adyenv6core/src/com/adyen/v6/forms/AdyenPaymentForm.java b/adyenv6core/src/com/adyen/v6/forms/AdyenPaymentForm.java index b42d341c7..0c75c0b72 100644 --- a/adyenv6core/src/com/adyen/v6/forms/AdyenPaymentForm.java +++ b/adyenv6core/src/com/adyen/v6/forms/AdyenPaymentForm.java @@ -69,6 +69,17 @@ public class AdyenPaymentForm { // used in openinvoice and boleto private String socialSecurityNumber; + //3DS 2.0 + private String browserInfo; + + public String getBrowserInfo() { + return browserInfo; + } + + public void setBrowserInfo(String browserInfo) { + this.browserInfo = browserInfo; + } + public String getCseToken() { return cseToken; } @@ -251,6 +262,7 @@ public String toString() { sb.append(" lastName: ").append(Util.toIndentedString(lastName)).append("\n"); sb.append(" dfValue: ").append(Util.toIndentedString(dfValue)).append("\n"); sb.append(" cardBrand: ").append(Util.toIndentedString(cardBrand)).append("\n"); + sb.append(" browserInfo: ").append(Util.toIndentedString(browserInfo)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/adyenv6core/src/com/adyen/v6/model/RequestInfo.java b/adyenv6core/src/com/adyen/v6/model/RequestInfo.java index 7ae2398ff..0820f30e6 100644 --- a/adyenv6core/src/com/adyen/v6/model/RequestInfo.java +++ b/adyenv6core/src/com/adyen/v6/model/RequestInfo.java @@ -30,15 +30,29 @@ public class RequestInfo { private String userAgent; private String acceptHeader; private String shopperIp; + private String origin; public RequestInfo(HttpServletRequest request) { this.userAgent = request.getHeader(USER_AGENT_HEADER); this.acceptHeader = request.getHeader(ACCEPT_HEADER); this.shopperIp = request.getRemoteAddr(); + this.origin = getOrigin(request); } private RequestInfo() { + } + + public String getOrigin(HttpServletRequest request) { + String currentRequestURL = request.getRequestURL().toString(); + int requestUrlLength = currentRequestURL.length(); + int requestUriLength = request.getRequestURI().length(); + + String baseURL = currentRequestURL.substring(0, requestUrlLength - requestUriLength); + return baseURL; + } + public String getOrigin() { + return this.origin; } public static RequestInfo empty() { diff --git a/adyenv6core/src/com/adyen/v6/populator/CartPopulator.java b/adyenv6core/src/com/adyen/v6/populator/CartPopulator.java index 50b81ba08..0fc77ee9a 100644 --- a/adyenv6core/src/com/adyen/v6/populator/CartPopulator.java +++ b/adyenv6core/src/com/adyen/v6/populator/CartPopulator.java @@ -53,6 +53,7 @@ public void populate(final CartModel source, final CartData target) throws Conve target.setAdyenEncryptedExpiryYear(paymentInfo.getEncryptedExpiryYear()); target.setAdyenEncryptedSecurityCode(paymentInfo.getEncryptedSecurityCode()); target.setAdyenInstallments(paymentInfo.getAdyenInstallments()); + target.setAdyenBrowserInfo(paymentInfo.getAdyenBrowserInfo()); } } From bd456fa121b760f241bb90070d1fc39413efcd17 Mon Sep 17 00:00:00 2001 From: rajni Date: Fri, 26 Apr 2019 12:07:50 +0200 Subject: [PATCH 02/23] [PW-1095]: New controller added for 3DS2 results --- .../AdyenSummaryCheckoutStepController.java | 56 ++++++++-- .../pages/checkout/multi/3ds2_payment.jsp | 100 +++++++++++++++--- .../multi/selectPaymentMethodPage.jsp | 4 +- .../project.properties.template | 4 +- ...ar => adyen-java-api-library-2.1.0-rc.jar} | Bin 632167 -> 632758 bytes .../adyen/v6/facades/AdyenCheckoutFacade.java | 5 + .../facades/DefaultAdyenCheckoutFacade.java | 53 ++++++++-- .../adyen/v6/factory/AdyenRequestFactory.java | 53 ++++------ .../adyen/v6/service/AdyenPaymentService.java | 1 + .../service/DefaultAdyenPaymentService.java | 8 ++ 10 files changed, 220 insertions(+), 64 deletions(-) rename adyenv6core/lib/{adyen-java-api-library-2.0.2-rc.jar => adyen-java-api-library-2.1.0-rc.jar} (88%) 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 2b3537726..c476515f5 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 @@ -64,7 +64,13 @@ import de.hybris.platform.site.BaseSiteService; import static com.adyen.constants.ApiConstants.Redirect.Data.MD; import static com.adyen.constants.ApiConstants.Redirect.Data.PAREQ; +import static com.adyen.constants.ApiConstants.Redirect.Data.PAYMENT_DATA; +import static com.adyen.constants.ApiConstants.ThreeDS2Property.CHALLENGE_TOKEN; +import static com.adyen.constants.ApiConstants.ThreeDS2Property.FINGERPRINT_TOKEN; +import static com.adyen.constants.ApiConstants.ThreeDS2Property.THREEDS2_CHALLENGE_TOKEN; +import static com.adyen.constants.ApiConstants.ThreeDS2Property.THREEDS2_FINGERPRINT_TOKEN; import static com.adyen.constants.BrandCodes.PAYPAL_ECS; +import static com.adyen.constants.HPPConstants.Response.SHOPPER_LOCALE; import static com.adyen.model.checkout.PaymentsResponse.ResultCodeEnum.CHALLENGESHOPPER; import static com.adyen.model.checkout.PaymentsResponse.ResultCodeEnum.IDENTIFYSHOPPER; import static com.adyen.model.checkout.PaymentsResponse.ResultCodeEnum.REDIRECTSHOPPER; @@ -74,6 +80,8 @@ import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_ONECLICK; import static com.adyen.v6.constants.Adyenv6coreConstants.RATEPAY; import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_MULTIBANCO; +import static com.adyen.v6.facades.DefaultAdyenCheckoutFacade.MODEL_CHECKOUT_SHOPPER_HOST; +import static com.adyen.v6.facades.DefaultAdyenCheckoutFacade.MODEL_ORIGIN_KEY; @Controller @RequestMapping(value = AdyenControllerConstants.SUMMARY_CHECKOUT_PREFIX) @@ -204,18 +212,22 @@ else if (PAYMENT_METHOD_MULTIBANCO.equals(cartData.getAdyenPaymentMethod())) { if(IDENTIFYSHOPPER == paymentsResponse.getResultCode()) { if (adyenPaymentMethod.equals(PAYMENT_METHOD_CC)) { - LOGGER.debug("IDENTIFYSHOPPER!!!! terminating it here for now"); - model.addAttribute("paymentData", paymentsResponse.getPaymentData()); - model.addAttribute("resultObject", paymentsResponse.getAuthentication().get("threeds2.fingerprintToken")); + model.addAttribute(MODEL_CHECKOUT_SHOPPER_HOST,adyenCheckoutFacade.getCheckoutShopperHost()); + model.addAttribute(SHOPPER_LOCALE, adyenCheckoutFacade.getShopperLocale()); + model.addAttribute(MODEL_ORIGIN_KEY, adyenCheckoutFacade.getOriginKey()); + model.addAttribute(PAYMENT_DATA, paymentsResponse.getPaymentData()); + model.addAttribute(FINGERPRINT_TOKEN, paymentsResponse.getAuthentication().get(THREEDS2_FINGERPRINT_TOKEN)); return AdyenControllerConstants.Views.Pages.MultiStepCheckout.Validate3DS2PaymentPage; } } if(CHALLENGESHOPPER == paymentsResponse.getResultCode()) { if (adyenPaymentMethod.equals(PAYMENT_METHOD_CC)) { - LOGGER.debug("CHALLENGESHOPPER!!!! terminating it here for now"); - model.addAttribute("paymentData", paymentsResponse.getPaymentData()); - model.addAttribute("resultObject", paymentsResponse.getAuthentication().get("threeds2.challengeToken")); + model.addAttribute(MODEL_CHECKOUT_SHOPPER_HOST,adyenCheckoutFacade.getCheckoutShopperHost()); + model.addAttribute(SHOPPER_LOCALE, adyenCheckoutFacade.getShopperLocale()); + model.addAttribute(MODEL_ORIGIN_KEY, adyenCheckoutFacade.getOriginKey()); + model.addAttribute(PAYMENT_DATA, paymentsResponse.getPaymentData()); + model.addAttribute(CHALLENGE_TOKEN, paymentsResponse.getAuthentication().get(THREEDS2_CHALLENGE_TOKEN)); return AdyenControllerConstants.Views.Pages.MultiStepCheckout.Validate3DS2PaymentPage; } @@ -229,6 +241,38 @@ else if (PAYMENT_METHOD_MULTIBANCO.equals(cartData.getAdyenPaymentMethod())) { return enterStep(model, redirectModel); } + @RequestMapping(value = "/3ds2-adyen-response", method = RequestMethod.POST) + @RequireHardLogIn + public String authorise3DS2Payment(final Model model, + final RedirectAttributes redirectModel, + final HttpServletRequest request) throws CMSItemNotFoundException, CommerceCartModificationException, UnknownHostException { + + String errorMessage = "checkout.error.authorization.failed"; + try { + OrderData orderData = adyenCheckoutFacade.handle3DS2Response(request); + LOGGER.debug("Redirecting to confirmation"); + return redirectToOrderConfirmationPage(orderData); + } catch (AdyenNonAuthorizedPaymentException e) { + PaymentsResponse paymentsResponse = e.getPaymentsResponse(); + if(paymentsResponse!=null && paymentsResponse.getResultCode()== CHALLENGESHOPPER) + { + model.addAttribute(MODEL_CHECKOUT_SHOPPER_HOST,adyenCheckoutFacade.getCheckoutShopperHost()); + model.addAttribute(SHOPPER_LOCALE, adyenCheckoutFacade.getShopperLocale()); + model.addAttribute(MODEL_ORIGIN_KEY, adyenCheckoutFacade.getOriginKey()); + model.addAttribute(PAYMENT_DATA, paymentsResponse.getPaymentData()); + model.addAttribute(CHALLENGE_TOKEN, paymentsResponse.getAuthentication().get("threeds2.challengeToken")); + return AdyenControllerConstants.Views.Pages.MultiStepCheckout.Validate3DS2PaymentPage; + } + if (paymentsResponse != null && paymentsResponse.getResultCode() == PaymentsResponse.ResultCodeEnum.REFUSED) { + errorMessage = getErrorMessageByRefusalReason(paymentsResponse.getRefusalReason()); + } + } catch (Exception e) { + return REDIRECT_PREFIX + "/cart"; + } + LOGGER.debug("Redirecting to final step of checkout"); + return redirectToSummaryWithError(redirectModel, errorMessage); + } + @RequestMapping(value = AUTHORISE_3D_SECURE_PAYMENT_URL, method = RequestMethod.POST) @RequireHardLogIn public String authorise3DSecurePayment(final Model model, diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds2_payment.jsp b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds2_payment.jsp index fcffa0829..77325cc5f 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds2_payment.jsp +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds2_payment.jsp @@ -1,27 +1,99 @@ <%@ page trimDirectiveWhitespaces="true" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - -
-
+ + + + + + + + +
+
+
+
+ + + + + -
-
+
+
+ diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/selectPaymentMethodPage.jsp b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/selectPaymentMethodPage.jsp index 9f73b8895..b07e12b75 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/selectPaymentMethodPage.jsp +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/selectPaymentMethodPage.jsp @@ -17,9 +17,9 @@ - + - + - + + - + - +