From 2465cd4a4d1bbbc47d3c7f63f15c94ccf8f3cae8 Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Mon, 9 Dec 2024 20:33:02 +0100 Subject: [PATCH 01/26] AD-304: Fix to click to pay locale --- .../src/components/payment/Payment.tsx | 3 +- .../src/reducers/adyenConfigReducer.ts | 1 + .../src/types/adyenConfigData.ts | 1 + .../adyenv6backoffice-backoffice-config.xml | 3 ++ adyenv6core/resources/adyenv6core-items.xml | 4 +++ .../com/adyen/v6/dto/CheckoutConfigDTO.java | 14 ++++++--- .../v6/dto/CheckoutConfigDTOBuilder.java | 4 +++ .../impl/DefaultAdyenCheckoutFacade.java | 30 +++++++++++++------ .../PlaceOrderControllerBase.java | 2 +- .../validators/PaymentRequestValidator.java | 20 ++++++++----- 10 files changed, 60 insertions(+), 22 deletions(-) diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx index 2043b7e5..135cd4f8 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx @@ -137,7 +137,8 @@ class Payment extends React.Component { enableStoreDetails: this.props.adyenConfig.showRememberTheseDetails, clickToPayConfiguration: { merchantDisplayName: this.props.adyenConfig.merchantDisplayName, - shopperEmail: this.props.adyenConfig.shopperEmail + shopperEmail: this.props.adyenConfig.shopperEmail, + locale: this.props.adyenConfig.clicktoPayLocale, } } } diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts index c260fe30..1d4ec44a 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts @@ -29,6 +29,7 @@ export const adyenConfigInitialState : AdyenConfigData = { storedPaymentMethodList: [], merchantDisplayName: "", shopperEmail: "", + clicktoPayLocale: "", } export function adyenConfigReducer(adyenConfig: AdyenConfigData, action: RootAction): AdyenConfigData { diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts index 8b3d1a61..54972159 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts @@ -28,6 +28,7 @@ export interface AdyenConfigData { sepaDirectDebit: boolean; merchantDisplayName: string, shopperEmail: string, + clicktoPayLocale: string, } interface SessionData { diff --git a/adyenv6backoffice/resources/adyenv6backoffice-backoffice-config.xml b/adyenv6backoffice/resources/adyenv6backoffice-backoffice-config.xml index a614c056..e1cd525e 100644 --- a/adyenv6backoffice/resources/adyenv6backoffice-backoffice-config.xml +++ b/adyenv6backoffice/resources/adyenv6backoffice-backoffice-config.xml @@ -67,6 +67,9 @@ + + + diff --git a/adyenv6core/resources/adyenv6core-items.xml b/adyenv6core/resources/adyenv6core-items.xml index 251c15c7..9e9c30dc 100644 --- a/adyenv6core/resources/adyenv6core-items.xml +++ b/adyenv6core/resources/adyenv6core-items.xml @@ -349,6 +349,10 @@ Configuration for express payment methods + + Click to Pay Locale in form eq. en_US + + diff --git a/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTO.java b/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTO.java index 017f1957..a2923d67 100644 --- a/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTO.java +++ b/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTO.java @@ -37,13 +37,14 @@ public class CheckoutConfigDTO { private boolean showComboCard; private boolean showPos; private boolean immediateCapture; - private String countryCode; + private String countryCode; private boolean cardHolderNameRequired; private boolean sepaDirectDebit; private BigDecimal amountDecimal; private ExpressPaymentConfigDto expressPaymentConfig; private String merchantDisplayName; private String shopperEmail; + private String clickToPayLocale; // Getters and setters for the new field public ExpressPaymentConfigDto getExpressPaymentConfig() { @@ -54,9 +55,6 @@ public void setExpressPaymentConfig(ExpressPaymentConfigDto expressPaymentConfig this.expressPaymentConfig = expressPaymentConfigDto; } - - - public List getAlternativePaymentMethods() { return alternativePaymentMethods; } @@ -288,4 +286,12 @@ public String getShopperEmail() { public void setShopperEmail(String shopperEmail) { this.shopperEmail = shopperEmail; } + + public String getClickToPayLocale() { + return clickToPayLocale; + } + + public void setClickToPayLocale(String clickToPayLocale) { + this.clickToPayLocale = clickToPayLocale; + } } \ No newline at end of file diff --git a/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTOBuilder.java b/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTOBuilder.java index aff81b9f..9736bb6d 100644 --- a/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTOBuilder.java +++ b/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTOBuilder.java @@ -169,6 +169,10 @@ public CheckoutConfigDTOBuilder setShopperEmail(String shopperEmail) { return this; } + public CheckoutConfigDTOBuilder setClickToPayLocale(String clickToPayLocale) { + checkoutConfigDTO.setClickToPayLocale(clickToPayLocale); + return this; + } public CheckoutConfigDTO build() { return checkoutConfigDTO; diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index 03827917..e7eb9df6 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -117,7 +117,17 @@ import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.math.BigDecimal; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -225,7 +235,7 @@ public class DefaultAdyenCheckoutFacade implements AdyenCheckoutFacade { public static final String MODEL_CONNECTED_TERMINAL_LIST = "connectedTerminalList"; public static final String MODEL_ENVIRONMENT_MODE = "environmentMode"; public static final String MODEL_AMOUNT = "amount"; - public static final String MODEL_AMOUNT_DECIMAL= "amountDecimal"; + public static final String MODEL_AMOUNT_DECIMAL = "amountDecimal"; public static final String MODEL_IMMEDIATE_CAPTURE = "immediateCapture"; public static final String MODEL_PAYPAL_MERCHANT_ID = "paypalMerchantId"; public static final String MODEL_COUNTRY_CODE = "countryCode"; @@ -433,7 +443,7 @@ public OrderData authorisePayment(final HttpServletRequest request, final CartDa RequestInfo requestInfo = new RequestInfo(request); requestInfo.setShopperLocale(getShopperLocale()); - PaymentResponse paymentResponse = getAdyenPaymentService().processPaymentRequest(cartData,null, requestInfo, customer); + PaymentResponse paymentResponse = getAdyenPaymentService().processPaymentRequest(cartData, null, requestInfo, customer); PaymentResponse.ResultCodeEnum resultCode = paymentResponse.getResultCode(); PaymentResponseAction action = paymentResponse.getAction(); @@ -765,7 +775,7 @@ public CheckoutConfigDTO getReactCheckoutConfig() throws ApiException { CheckoutConfigDTOBuilder checkoutConfigDTOBuilder = new CheckoutConfigDTOBuilder(); - checkoutConfigDTOBuilder + checkoutConfigDTOBuilder .setPaymentMethods(paymentMethods) .setConnectedTerminalList(connectedTerminalList) .setStoredPaymentMethodList(storedPaymentMethodList) @@ -789,7 +799,8 @@ public CheckoutConfigDTO getReactCheckoutConfig() throws ApiException { .setCardHolderNameRequired(getHolderNameRequired()) .setAmountDecimal(cartData.getTotalPriceWithTax().getValue()) .setMerchantDisplayName(baseStore.getName()) - .setShopperEmail(customerModel.getContactEmail()); + .setShopperEmail(customerModel.getContactEmail()) + .setClickToPayLocale(baseStore.getClickToPayLocale()); ExpressPaymentConfigModel expressPaymentConfigModel = baseStore.getExpressPaymentConfig(); if (expressPaymentConfigModel != null) { @@ -935,7 +946,8 @@ public CheckoutConfigDTO getCheckoutConfig() throws ApiException { .setSepaDirectDebit(sepaDirectDebit) .setAmountDecimal(cartData.getTotalPriceWithTax().getValue()) .setMerchantDisplayName(baseStore.getName()) - .setShopperEmail(customerModel.getContactEmail()); + .setShopperEmail(customerModel.getContactEmail()) + .setClickToPayLocale(baseStore.getClickToPayLocale()); ExpressPaymentConfigModel expressPaymentConfigModel = baseStore.getExpressPaymentConfig(); if (expressPaymentConfigModel != null) { @@ -1031,7 +1043,7 @@ protected Map getApplePayConfigFromPaymentMethods(List Date: Thu, 19 Dec 2024 08:46:32 +0100 Subject: [PATCH 02/26] AD-304: Fix to click to pay locale --- .../resources/adyenv6backoffice-backoffice-config.xml | 2 +- .../resources/localization/adyenv6core-locales_en.properties | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/adyenv6backoffice/resources/adyenv6backoffice-backoffice-config.xml b/adyenv6backoffice/resources/adyenv6backoffice-backoffice-config.xml index e1cd525e..e3761a47 100644 --- a/adyenv6backoffice/resources/adyenv6backoffice-backoffice-config.xml +++ b/adyenv6backoffice/resources/adyenv6backoffice-backoffice-config.xml @@ -67,7 +67,7 @@ - + diff --git a/adyenv6core/resources/localization/adyenv6core-locales_en.properties b/adyenv6core/resources/localization/adyenv6core-locales_en.properties index 106c4322..9e30d720 100644 --- a/adyenv6core/resources/localization/adyenv6core-locales_en.properties +++ b/adyenv6core/resources/localization/adyenv6core-locales_en.properties @@ -63,7 +63,9 @@ type.basestore.amazonpayRegion.description=The region of the Amazon Seller shop type.basestore.adyenMerchantConfig.name=Adyen Merchant Config type.basestore.adyenMerchantConfig.description=List of merchants that can be used for payments type.basestore.l2L3ESDEnabled.name=L2/L3 Enhanced Data Support -type.BaseStore.l2L3ESDEnabled.description=Enable or disable L2/L3 EDS for US MasterCard and Visa transactions (only for US merchants) +type.basestore.l2L3ESDEnabled.description=Enable or disable L2/L3 EDS for US MasterCard and Visa transactions (only for US merchants) +type.basestore.clickToPayLocale.name = Click to Pay locale +type.basestore.clickToPayLocale.description = Provide locale in shape for eq. en_US for Click to Pay component type.ExpressPaymentConfig.name=Express Payment Config From d1c92ebca1f3fbf6cbb450c7f3ff2ee285ccb5ee Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Thu, 19 Dec 2024 10:35:18 +0100 Subject: [PATCH 03/26] AD-304: Fix to click to pay locale --- .../common/js/adyen-checkout/src/components/payment/Payment.tsx | 2 +- .../common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts | 2 +- .../common/js/adyen-checkout/src/types/adyenConfigData.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx index 135cd4f8..516acf99 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx @@ -138,7 +138,7 @@ class Payment extends React.Component { clickToPayConfiguration: { merchantDisplayName: this.props.adyenConfig.merchantDisplayName, shopperEmail: this.props.adyenConfig.shopperEmail, - locale: this.props.adyenConfig.clicktoPayLocale, + locale: this.props.adyenConfig.clickToPayLocale, } } } diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts index 1d4ec44a..4c910e47 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts @@ -29,7 +29,7 @@ export const adyenConfigInitialState : AdyenConfigData = { storedPaymentMethodList: [], merchantDisplayName: "", shopperEmail: "", - clicktoPayLocale: "", + clickToPayLocale: "", } export function adyenConfigReducer(adyenConfig: AdyenConfigData, action: RootAction): AdyenConfigData { diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts index 54972159..3b993261 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts @@ -28,7 +28,7 @@ export interface AdyenConfigData { sepaDirectDebit: boolean; merchantDisplayName: string, shopperEmail: string, - clicktoPayLocale: string, + clickToPayLocale: string, } interface SessionData { From 1ef81d6a7c228401f30a405bfecd8a223ba6e2a6 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Thu, 19 Dec 2024 15:07:14 +0100 Subject: [PATCH 04/26] AD-321 Implement Configuration for Enabling Express Payments - log fix --- .../tags/responsive/expressCheckoutConfig.tag | 13 ++++++------- .../responsive/common/js/adyen_express_checkout.js | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag index 3cd70d18..65a67cc1 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag @@ -21,7 +21,11 @@ merchantAccount: '${merchantAccount}', label: ['visible-xs', 'hidden-xs'], pageType: '${pageType}', - productCode: '${product.code}' + productCode: '${product.code}', + googlePayExpressEnabledOnCart: ${expressPaymentConfig.googlePayExpressEnabledOnCart}, + applePayExpressEnabledOnCart: ${expressPaymentConfig.applePayExpressEnabledOnCart}, + googlePayExpressEnabledOnProduct: ${expressPaymentConfig.googlePayExpressEnabledOnProduct}, + applePayExpressEnabledOnProduct: ${expressPaymentConfig.applePayExpressEnabledOnProduct}, } var checkoutConfig = { @@ -32,12 +36,7 @@ id: '${sessionData.id}', sessionData: '${sessionData.sessionData}' }, - countryCode: 'US', - googlePayExpressEnabledOnCart: ${expressPaymentConfig.googlePayExpressEnabledOnCart}, - applePayExpressEnabledOnCart: ${expressPaymentConfig.applePayExpressEnabledOnCart}, - googlePayExpressEnabledOnProduct: ${expressPaymentConfig.googlePayExpressEnabledOnProduct}, - applePayExpressEnabledOnProduct: ${expressPaymentConfig.applePayExpressEnabledOnProduct}, - + countryCode: 'US' } window.onload = function() { diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js index 7b12f423..ed044bd7 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js @@ -33,10 +33,10 @@ var AdyenExpressCheckoutHybris = (function () { initExpressCheckout: async function (params, config) { var checkoutPromise = this.initiateCheckout(config); checkoutPromise.then((checkout) => { - if(params.pageType === 'cart' && config.googlePayExpressEnabledOnCart || params.pageType === 'PDP' && config.googlePayExpressEnabledOnProduct) { + if (params.pageType === 'cart' && params.googlePayExpressEnabledOnCart || params.pageType === 'PDP' && params.googlePayExpressEnabledOnProduct) { this.initiateGooglePayExpress(checkout, params) } - if(params.pageType=== 'cart' && config.applePayExpressEnabledOnCart || params.pageType === 'PDP' && config.applePayExpressEnabledOnProduct) { + if (params.pageType === 'cart' && params.applePayExpressEnabledOnCart || params.pageType === 'PDP' && params.applePayExpressEnabledOnProduct) { this.initiateApplePayExpress(checkout, params) } }); From c7af3a973cbec83bbcf0a263ada72df90d72cdd3 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Mon, 30 Dec 2024 14:39:21 +0100 Subject: [PATCH 05/26] AD-334 Add Apple Pay Express Button with Frontend Logic and API Calls to CMS Components on PDP and Cart Pages - Spartacus AD-336 Add Google Pay Express Button with Frontend Logic and API Calls to CMS Components on PDP and Cart Pages - Spartacus Adyen Express configuration --- .../controllers/PaymentMethodsController.java | 27 +++- ...artExpressCheckoutComponentController.java | 2 +- ...uctExpressCheckoutComponentController.java | 7 +- adyenv6core/resources/adyenv6core-spring.xml | 1 + .../v6/dto/ExpressCheckoutConfigDTO.java | 127 ++++++++++++++++ .../dto/ExpressCheckoutConfigDTOBuilder.java | 83 +++++++++++ .../adyen/v6/facades/AdyenCheckoutFacade.java | 19 ++- .../impl/DefaultAdyenCheckoutFacade.java | 136 ++++++++++-------- 8 files changed, 319 insertions(+), 83 deletions(-) create mode 100644 adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTO.java create mode 100644 adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java diff --git a/adyenocc/src/com/adyen/commerce/controllers/PaymentMethodsController.java b/adyenocc/src/com/adyen/commerce/controllers/PaymentMethodsController.java index 6acd1acc..fb3eff4f 100644 --- a/adyenocc/src/com/adyen/commerce/controllers/PaymentMethodsController.java +++ b/adyenocc/src/com/adyen/commerce/controllers/PaymentMethodsController.java @@ -5,12 +5,12 @@ import com.adyen.commerce.constants.AdyenoccConstants; import com.adyen.service.exception.ApiException; -import com.adyen.v6.dto.CheckoutConfigDTO; import com.adyen.v6.facades.AdyenCheckoutFacade; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import de.hybris.platform.commerceservices.request.mapping.annotation.ApiVersion; +import de.hybris.platform.webservicescommons.swagger.ApiBaseSiteIdAndUserIdParam; import de.hybris.platform.webservicescommons.swagger.ApiBaseSiteIdUserIdAndCartIdParam; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -18,11 +18,10 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping(value = AdyenoccConstants.ADYEN_USER_CART_PREFIX) @ApiVersion("v2") @Tag(name = "Adyen") public class PaymentMethodsController @@ -38,7 +37,7 @@ public class PaymentMethodsController private AdyenCheckoutFacade adyenCheckoutFacade; @Secured({ "ROLE_CUSTOMERGROUP", "ROLE_TRUSTED_CLIENT", "ROLE_CUSTOMERMANAGERGROUP" }) - @GetMapping(value = "/checkout-configuration") + @GetMapping(value = AdyenoccConstants.ADYEN_USER_CART_PREFIX + "/checkout-configuration") @Operation(operationId = "getCheckoutConfiguration", summary = "Get checkout configuration", description = "Returns configuration for Adyen dropin component") @ApiBaseSiteIdUserIdAndCartIdParam @@ -46,4 +45,24 @@ public ResponseEntity getCheckoutConfiguration() throws ApiException, Js String response = objectMapper.writeValueAsString(adyenCheckoutFacade.getReactCheckoutConfig()); return ResponseEntity.ok().body(response); } + + @Secured({ "ROLE_CUSTOMERGROUP", "ROLE_TRUSTED_CLIENT", "ROLE_CUSTOMERMANAGERGROUP" }) + @GetMapping(value = AdyenoccConstants.ADYEN_USER_PREFIX + "/checkout-configuration/express/PDP/{productCode}") + @Operation(operationId = "getExpressPDPCheckoutConfiguration", summary = "Get express product page checkout configuration", description = + "Returns configuration for express payments on PDP") + @ApiBaseSiteIdAndUserIdParam + public ResponseEntity getExpressPDPCheckoutConfiguration(@PathVariable String productCode) throws ApiException, JsonProcessingException { + String response = objectMapper.writeValueAsString(adyenCheckoutFacade.initializeExpressCheckoutPDPDataOCC(productCode)); + return ResponseEntity.ok().body(response); + } + + @Secured({ "ROLE_CUSTOMERGROUP", "ROLE_TRUSTED_CLIENT", "ROLE_CUSTOMERMANAGERGROUP" }) + @GetMapping(value = AdyenoccConstants.ADYEN_USER_CART_PREFIX + "/checkout-configuration/express/cart") + @Operation(operationId = "getExpressCartCheckoutConfiguration", summary = "Get express cart page checkout configuration", description = + "Returns configuration for express payments on cart") + @ApiBaseSiteIdUserIdAndCartIdParam + public ResponseEntity getExpressCartCheckoutConfiguration() throws ApiException, JsonProcessingException { + String response = objectMapper.writeValueAsString(adyenCheckoutFacade.initializeExpressCheckoutCartPageDataOCC()); + return ResponseEntity.ok().body(response); + } } diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java index 678a7cae..4e184096 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java @@ -27,7 +27,7 @@ public class AdyenAccCartExpressCheckoutComponentController extends AbstractCMSA protected void fillModel(final HttpServletRequest request, final Model model, final AdyenAccExpressCheckoutCartPageComponentModel component) { try { adyenExpressCheckoutFacade.removeDeliveryModeFromSessionCart(); - adyenCheckoutFacade.initializeApplePayExpressCartPageData(model); + adyenCheckoutFacade.initializeExpressCheckoutCartPageData(model); } catch (ApiException | CalculationException e) { throw new RuntimeException(e); } diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccProductExpressCheckoutComponentController.java b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccProductExpressCheckoutComponentController.java index 528ae66a..82ac3ab7 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccProductExpressCheckoutComponentController.java +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccProductExpressCheckoutComponentController.java @@ -6,15 +6,12 @@ import de.hybris.platform.acceleratorservices.data.RequestContextData; import de.hybris.platform.addonsupport.controllers.cms.AbstractCMSAddOnComponentController; import de.hybris.platform.commercefacades.product.ProductFacade; -import de.hybris.platform.commercefacades.product.ProductOption; -import de.hybris.platform.commercefacades.product.data.ProductData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; -import java.util.Arrays; @Controller(AdyenAccExpressCheckoutProductPageComponentModel._TYPECODE + "Controller") @RequestMapping(value = "/view/" + AdyenAccExpressCheckoutProductPageComponentModel._TYPECODE + "Controller") @@ -30,10 +27,8 @@ public class AdyenAccProductExpressCheckoutComponentController extends AbstractC protected void fillModel(final HttpServletRequest request, final Model model, final AdyenAccExpressCheckoutProductPageComponentModel component) { try { RequestContextData requestContextData = getRequestContextData(request); - requestContextData.getProduct(); - final ProductData productData = productFacade.getProductForCodeAndOptions(requestContextData.getProduct().getCode(), Arrays.asList(ProductOption.BASIC, ProductOption.PRICE)); - adyenCheckoutFacade.initializeApplePayExpressPDPData(model, productData); + adyenCheckoutFacade.initializeExpressCheckoutPDPData(model, requestContextData.getProduct().getCode()); } catch (ApiException e) { throw new RuntimeException(e); } diff --git a/adyenv6core/resources/adyenv6core-spring.xml b/adyenv6core/resources/adyenv6core-spring.xml index 4a0f2f64..f1e603c1 100644 --- a/adyenv6core/resources/adyenv6core-spring.xml +++ b/adyenv6core/resources/adyenv6core-spring.xml @@ -236,6 +236,7 @@ + diff --git a/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTO.java b/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTO.java new file mode 100644 index 00000000..e552518f --- /dev/null +++ b/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTO.java @@ -0,0 +1,127 @@ +package com.adyen.v6.dto; + +import com.adyen.model.checkout.Amount; +import com.adyen.model.checkout.CreateCheckoutSessionResponse; + +import java.math.BigDecimal; + +public class ExpressCheckoutConfigDTO { + private String applePayMerchantId; + private String applePayMerchantName; + private String payPalIntent; + private String shopperLocale; + private String environmentMode; + private String clientKey; + private String merchantAccount; + //TODO: Remove in 13.3 + private CreateCheckoutSessionResponse sessionData; + private Amount amount; + private BigDecimal amountDecimal; + private String dfUrl; + private String checkoutShopperHost; + private ExpressPaymentConfigDto expressPaymentConfig; + + public String getApplePayMerchantId() { + return applePayMerchantId; + } + + public void setApplePayMerchantId(String applePayMerchantId) { + this.applePayMerchantId = applePayMerchantId; + } + + public String getApplePayMerchantName() { + return applePayMerchantName; + } + + public void setApplePayMerchantName(String applePayMerchantName) { + this.applePayMerchantName = applePayMerchantName; + } + + public String getPayPalIntent() { + return payPalIntent; + } + + public void setPayPalIntent(String payPalIntent) { + this.payPalIntent = payPalIntent; + } + + public String getShopperLocale() { + return shopperLocale; + } + + public void setShopperLocale(String shopperLocale) { + this.shopperLocale = shopperLocale; + } + + public String getEnvironmentMode() { + return environmentMode; + } + + public void setEnvironmentMode(String environmentMode) { + this.environmentMode = environmentMode; + } + + public String getClientKey() { + return clientKey; + } + + public void setClientKey(String clientKey) { + this.clientKey = clientKey; + } + + public String getMerchantAccount() { + return merchantAccount; + } + + public void setMerchantAccount(String merchantAccount) { + this.merchantAccount = merchantAccount; + } + + public CreateCheckoutSessionResponse getSessionData() { + return sessionData; + } + + public void setSessionData(CreateCheckoutSessionResponse sessionData) { + this.sessionData = sessionData; + } + + public Amount getAmount() { + return amount; + } + + public void setAmount(Amount amount) { + this.amount = amount; + } + + public BigDecimal getAmountDecimal() { + return amountDecimal; + } + + public void setAmountDecimal(BigDecimal amountDecimal) { + this.amountDecimal = amountDecimal; + } + + public String getDfUrl() { + return dfUrl; + } + + public void setDfUrl(String dfUrl) { + this.dfUrl = dfUrl; + } + + public String getCheckoutShopperHost() { + return checkoutShopperHost; + } + + public void setCheckoutShopperHost(String checkoutShopperHost) { + this.checkoutShopperHost = checkoutShopperHost; + } + + public ExpressPaymentConfigDto getExpressPaymentConfig() { + return expressPaymentConfig; + } + + public void setExpressPaymentConfig(ExpressPaymentConfigDto expressPaymentConfig) { + this.expressPaymentConfig = expressPaymentConfig; + } +} diff --git a/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java b/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java new file mode 100644 index 00000000..6446a58f --- /dev/null +++ b/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java @@ -0,0 +1,83 @@ +package com.adyen.v6.dto; + +import com.adyen.model.checkout.Amount; +import com.adyen.model.checkout.CreateCheckoutSessionResponse; + +import java.math.BigDecimal; + +public class ExpressCheckoutConfigDTOBuilder { + private final ExpressCheckoutConfigDTO expressCheckoutConfigDTO; + + public ExpressCheckoutConfigDTOBuilder() { + this.expressCheckoutConfigDTO = new ExpressCheckoutConfigDTO(); + } + + public ExpressCheckoutConfigDTOBuilder setApplePayMerchantId(String applePayMerchantId) { + expressCheckoutConfigDTO.setApplePayMerchantId(applePayMerchantId); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setApplePayMerchantName(String applePayMerchantName) { + expressCheckoutConfigDTO.setApplePayMerchantName(applePayMerchantName); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setPayPalIntent(String payPalIntent) { + expressCheckoutConfigDTO.setPayPalIntent(payPalIntent); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setShopperLocale(String shopperLocale) { + expressCheckoutConfigDTO.setShopperLocale(shopperLocale); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setEnvironmentMode(String environmentMode) { + expressCheckoutConfigDTO.setEnvironmentMode(environmentMode); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setClientKey(String clientKey) { + expressCheckoutConfigDTO.setClientKey(clientKey); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setMerchantAccount(String merchantAccount) { + expressCheckoutConfigDTO.setMerchantAccount(merchantAccount); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setSessionData(CreateCheckoutSessionResponse sessionData) { + expressCheckoutConfigDTO.setSessionData(sessionData); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setAmount(Amount amount) { + expressCheckoutConfigDTO.setAmount(amount); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setAmountDecimal(BigDecimal amountDecimal) { + expressCheckoutConfigDTO.setAmountDecimal(amountDecimal); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setDfUrl(String dfUrl) { + expressCheckoutConfigDTO.setDfUrl(dfUrl); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setCheckoutShopperHost(String checkoutShopperHost) { + expressCheckoutConfigDTO.setCheckoutShopperHost(checkoutShopperHost); + return this; + } + + public ExpressCheckoutConfigDTOBuilder setExpressPaymentConfigDto(ExpressPaymentConfigDto expressPaymentConfigDto) { + expressCheckoutConfigDTO.setExpressPaymentConfig(expressPaymentConfigDto); + return this; + } + + public ExpressCheckoutConfigDTO build() { + return expressCheckoutConfigDTO; + } +} \ No newline at end of file diff --git a/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java index 2d543e4f..e5a7c389 100644 --- a/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java @@ -20,27 +20,20 @@ */ package com.adyen.v6.facades; -import com.adyen.model.checkout.CheckoutPaymentMethod; -import com.adyen.model.checkout.PaymentCompletionDetails; -import com.adyen.model.checkout.PaymentDetailsRequest; -import com.adyen.model.checkout.PaymentDetailsResponse; -import com.adyen.model.checkout.PaymentRequest; -import com.adyen.model.checkout.PaymentResponse; +import com.adyen.model.checkout.*; import com.adyen.service.exception.ApiException; import com.adyen.v6.controllers.dtos.PaymentResultDTO; import com.adyen.v6.dto.CheckoutConfigDTO; +import com.adyen.v6.dto.ExpressCheckoutConfigDTO; import com.adyen.v6.forms.AdyenPaymentForm; import de.hybris.platform.commercefacades.order.data.CartData; import de.hybris.platform.commercefacades.order.data.OrderData; -import de.hybris.platform.commercefacades.product.data.ProductData; -import de.hybris.platform.commercefacades.user.data.AddressData; import de.hybris.platform.commercewebservicescommons.dto.order.PaymentDetailsWsDTO; import de.hybris.platform.core.model.order.CartModel; import de.hybris.platform.core.model.order.payment.PaymentInfoModel; import de.hybris.platform.order.InvalidCartException; import de.hybris.platform.order.exceptions.CalculationException; import org.springframework.ui.Model; -import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; import javax.servlet.http.HttpServletRequest; @@ -149,9 +142,13 @@ public interface AdyenCheckoutFacade { void initializeSummaryData(Model model) throws ApiException; - void initializeApplePayExpressCartPageData(Model model) throws ApiException; + void initializeExpressCheckoutCartPageData(Model model) throws ApiException; - void initializeApplePayExpressPDPData(Model model, ProductData productData) throws ApiException; + void initializeExpressCheckoutPDPData(Model model, String productCode) throws ApiException; + + ExpressCheckoutConfigDTO initializeExpressCheckoutCartPageDataOCC() throws ApiException; + + ExpressCheckoutConfigDTO initializeExpressCheckoutPDPDataOCC(String productCode) throws ApiException; /** * Returns whether Boleto should be shown as an available payment method on the checkout page diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index e7eb9df6..9319250c 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -22,17 +22,7 @@ import com.adyen.commerce.data.PaymentMethodsCartData; -import com.adyen.model.checkout.Amount; -import com.adyen.model.checkout.CreateCheckoutSessionResponse; -import com.adyen.model.checkout.PaymentCompletionDetails; -import com.adyen.model.checkout.PaymentDetailsRequest; -import com.adyen.model.checkout.PaymentDetailsResponse; -import com.adyen.model.checkout.PaymentMethod; -import com.adyen.model.checkout.PaymentMethodsResponse; -import com.adyen.model.checkout.PaymentRequest; -import com.adyen.model.checkout.PaymentResponse; -import com.adyen.model.checkout.PaymentResponseAction; -import com.adyen.model.checkout.StoredPaymentMethod; +import com.adyen.model.checkout.*; import com.adyen.model.nexo.ErrorConditionType; import com.adyen.model.nexo.ResultType; import com.adyen.model.recurring.Recurring; @@ -41,9 +31,7 @@ import com.adyen.v6.constants.Adyenv6coreConstants; import com.adyen.v6.controllers.dtos.PaymentResultDTO; import com.adyen.v6.converters.PosPaymentResponseConverter; -import com.adyen.v6.dto.CheckoutConfigDTO; -import com.adyen.v6.dto.CheckoutConfigDTOBuilder; -import com.adyen.v6.dto.ExpressPaymentConfigDto; +import com.adyen.v6.dto.*; import com.adyen.v6.enums.AdyenCardTypeEnum; import com.adyen.v6.enums.AdyenRegions; import com.adyen.v6.enums.RecurringContractMode; @@ -72,6 +60,8 @@ import de.hybris.platform.commercefacades.order.OrderFacade; import de.hybris.platform.commercefacades.order.data.CartData; import de.hybris.platform.commercefacades.order.data.OrderData; +import de.hybris.platform.commercefacades.product.ProductFacade; +import de.hybris.platform.commercefacades.product.ProductOption; import de.hybris.platform.commercefacades.product.data.ProductData; import de.hybris.platform.commercefacades.user.UserFacade; import de.hybris.platform.commercefacades.user.data.AddressData; @@ -117,37 +107,13 @@ import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.adyen.constants.ApiConstants.ThreeDS2Property.THREEDS2_CHALLENGE_TOKEN; import static com.adyen.constants.ApiConstants.ThreeDS2Property.THREEDS2_FINGERPRINT_TOKEN; -import static com.adyen.v6.constants.Adyenv6coreConstants.ISSUER_PAYMENT_METHODS; -import static com.adyen.v6.constants.Adyenv6coreConstants.OPENINVOICE_METHODS_ALLOW_SOCIAL_SECURITY_NUMBER; -import static com.adyen.v6.constants.Adyenv6coreConstants.OPENINVOICE_METHODS_API; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYBRIGHT; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHODS_ALLOW_SOCIAL_SECURITY_NUMBER; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_AMAZONPAY; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_APPLEPAY; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_BOLETO; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_KLARNA; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_ONLINEBANKING_IN; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_ONLINEBANKING_PL; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_SCHEME; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_SEPA_DIRECTDEBIT; -import static com.adyen.v6.constants.Adyenv6coreConstants.SHOPPER_LOCALE; +import static com.adyen.v6.constants.Adyenv6coreConstants.*; import static de.hybris.platform.order.impl.DefaultCartService.SESSION_CART_PARAMETER_NAME; /** @@ -199,6 +165,7 @@ public class DefaultAdyenCheckoutFacade implements AdyenCheckoutFacade { private ConfigurationService configurationService; private AdyenMerchantAccountStrategy adyenMerchantAccountStrategy; private AdyenOrderFacade adyenOrderFacade; + private ProductFacade productFacade; public static final Logger LOGGER = Logger.getLogger(DefaultAdyenCheckoutFacade.class); @@ -1099,7 +1066,17 @@ public void initializeSummaryData(Model model) throws ApiException { model.addAttribute(LOCALE, gson.toJson(setLocale(cartData.getAdyenAmazonPayConfiguration(), shopperLocale))); } - public void initializeApplePayExpressCartPageData(Model model) throws ApiException { + public void initializeExpressCheckoutCartPageData(Model model) throws ApiException { + ExpressCheckoutConfigDTO expressCheckoutConfigDTO = initializeExpressCheckoutCartPageDataOCC(); + populateExpressCheckoutConfigModel(model, expressCheckoutConfigDTO); + } + + public void initializeExpressCheckoutPDPData(Model model, String productCode) throws ApiException { + ExpressCheckoutConfigDTO expressCheckoutConfigDTO = initializeExpressCheckoutPDPDataOCC(productCode); + populateExpressCheckoutConfigModel(model, expressCheckoutConfigDTO); + } + + public ExpressCheckoutConfigDTO initializeExpressCheckoutCartPageDataOCC() throws ApiException { final CartData cartData = getCheckoutFacade().getCheckoutCart(); if (cartData != null && cartData.getTotalPriceWithTax() != null && cartData.getTotalPriceWithTax().getCurrencyIso() != null) { final String currencyIso = cartData.getTotalPriceWithTax().getCurrencyIso(); @@ -1107,22 +1084,30 @@ public void initializeApplePayExpressCartPageData(Model model) throws ApiExcepti BigDecimal expressDeliveryModeValue = getExpressDeliveryModeValue(currencyIso); amountValue = amountValue.add(expressDeliveryModeValue); - initializeApplePayExpressDataInternal(amountValue, currencyIso, model); + return initializeExpressCheckoutDataInternal(amountValue, currencyIso); } + + throw new IllegalArgumentException("CartData is null or empty"); } - public void initializeApplePayExpressPDPData(Model model, ProductData productData) throws ApiException { - final String currencyIso = productData.getPrice().getCurrencyIso(); - BigDecimal amountValue = productData.getPrice().getValue(); - BigDecimal expressDeliveryModeValue = getExpressDeliveryModeValue(currencyIso); + public ExpressCheckoutConfigDTO initializeExpressCheckoutPDPDataOCC(String productCode) throws ApiException { + final ProductData productData = productFacade.getProductForCodeAndOptions(productCode, Arrays.asList(ProductOption.BASIC, ProductOption.PRICE)); + + if (productData != null) { + final String currencyIso = productData.getPrice().getCurrencyIso(); + BigDecimal amountValue = productData.getPrice().getValue(); + BigDecimal expressDeliveryModeValue = getExpressDeliveryModeValue(currencyIso); - amountValue = amountValue.add(expressDeliveryModeValue); + amountValue = amountValue.add(expressDeliveryModeValue); - initializeApplePayExpressDataInternal(amountValue, currencyIso, model); + return initializeExpressCheckoutDataInternal(amountValue, currencyIso); + } + throw new IllegalArgumentException("ProductData is null or empty"); } - protected void initializeApplePayExpressDataInternal(BigDecimal amountValue, String currency, Model model) throws ApiException { + protected ExpressCheckoutConfigDTO initializeExpressCheckoutDataInternal(BigDecimal amountValue, String currency) throws ApiException { final BaseStoreModel baseStore = baseStoreService.getCurrentBaseStore(); + final ExpressCheckoutConfigDTOBuilder expressCheckoutConfigDTOBuilder = new ExpressCheckoutConfigDTOBuilder(); try { PaymentMethodsResponse paymentMethodsResponse = getAdyenPaymentService().getPaymentMethodsResponse(amountValue, @@ -1133,8 +1118,8 @@ protected void initializeApplePayExpressDataInternal(BigDecimal amountValue, Str Map applePayConfig = getApplePayConfigFromPaymentMethods(paymentMethodsResponse.getPaymentMethods()); if (!CollectionUtils.isEmpty(applePayConfig)) { - model.addAttribute(MODEL_APPLEPAY_MERCHANT_IDENTIFIER, applePayConfig.get("merchantId")); - model.addAttribute(MODEL_APPLEPAY_MERCHANT_NAME, applePayConfig.get("merchantName")); + expressCheckoutConfigDTOBuilder.setApplePayMerchantId(applePayConfig.get("merchantId")) + .setApplePayMerchantName(applePayConfig.get("merchantName")); } else { LOGGER.warn("Empty apple pay config"); } @@ -1145,18 +1130,43 @@ protected void initializeApplePayExpressDataInternal(BigDecimal amountValue, Str final Amount amount = AmountUtil.createAmount(amountValue, currency); - model.addAttribute(SHOPPER_LOCALE, getShopperLocale()); - model.addAttribute(MODEL_ENVIRONMENT_MODE, getEnvironmentMode()); - model.addAttribute(MODEL_CLIENT_KEY, baseStore.getAdyenClientKey()); - model.addAttribute(MODEL_MERCHANT_ACCOUNT, adyenMerchantAccountStrategy.getWebMerchantAccount()); - model.addAttribute(SESSION_DATA, getAdyenSessionData(amount)); - model.addAttribute(MODEL_AMOUNT, amount); - model.addAttribute(MODEL_AMOUNT_DECIMAL, amountValue); - model.addAttribute(MODEL_DF_URL, getAdyenPaymentService().getDeviceFingerprintUrl()); - model.addAttribute(MODEL_CHECKOUT_SHOPPER_HOST, getCheckoutShopperHost()); + expressCheckoutConfigDTOBuilder.setShopperLocale(getShopperLocale()) + .setEnvironmentMode(getEnvironmentMode()) + .setClientKey(baseStore.getAdyenClientKey()) + .setMerchantAccount(adyenMerchantAccountStrategy.getWebMerchantAccount()) + .setSessionData(getAdyenSessionData(amount)) + .setAmount(amount) + .setAmountDecimal(amountValue) + .setDfUrl(getAdyenPaymentService().getDeviceFingerprintUrl()) + .setCheckoutShopperHost(getCheckoutShopperHost()); + if (baseStore.getExpressPaymentConfig() != null) { - model.addAttribute(EXPRESS_PAYMENT_CONFIG, getExpressPaymentConfigDto(baseStore.getExpressPaymentConfig())); + expressCheckoutConfigDTOBuilder.setExpressPaymentConfigDto(getExpressPaymentConfigDto(baseStore.getExpressPaymentConfig())); } + + return expressCheckoutConfigDTOBuilder.build(); + } + + protected void populateExpressCheckoutConfigModel(final Model model, final ExpressCheckoutConfigDTO expressCheckoutConfigDTO){ + if(StringUtils.isNotEmpty(expressCheckoutConfigDTO.getApplePayMerchantId())){ + model.addAttribute(MODEL_APPLEPAY_MERCHANT_IDENTIFIER, expressCheckoutConfigDTO.getApplePayMerchantId()); + } + if(StringUtils.isNotEmpty(expressCheckoutConfigDTO.getApplePayMerchantName())){ + model.addAttribute(MODEL_APPLEPAY_MERCHANT_NAME, expressCheckoutConfigDTO.getApplePayMerchantName()); + } + if(expressCheckoutConfigDTO.getExpressPaymentConfig() != null){ + model.addAttribute(EXPRESS_PAYMENT_CONFIG, expressCheckoutConfigDTO.getExpressPaymentConfig()); + } + + model.addAttribute(SHOPPER_LOCALE, expressCheckoutConfigDTO.getShopperLocale()); + model.addAttribute(MODEL_ENVIRONMENT_MODE, expressCheckoutConfigDTO.getEnvironmentMode()); + model.addAttribute(MODEL_CLIENT_KEY, expressCheckoutConfigDTO.getClientKey()); + model.addAttribute(MODEL_MERCHANT_ACCOUNT,expressCheckoutConfigDTO.getMerchantAccount()); + model.addAttribute(SESSION_DATA, expressCheckoutConfigDTO.getSessionData()); + model.addAttribute(MODEL_AMOUNT, expressCheckoutConfigDTO.getAmount()); + model.addAttribute(MODEL_AMOUNT_DECIMAL, expressCheckoutConfigDTO.getAmountDecimal()); + model.addAttribute(MODEL_DF_URL, expressCheckoutConfigDTO.getExpressPaymentConfig()); + model.addAttribute(MODEL_CHECKOUT_SHOPPER_HOST, expressCheckoutConfigDTO.getCheckoutShopperHost()); } protected BigDecimal getExpressDeliveryModeValue(final String currencyIso) { @@ -1977,4 +1987,8 @@ public void setAdyenMerchantAccountStrategy(AdyenMerchantAccountStrategy adyenMe public void setAdyenOrderFacade(AdyenOrderFacade adyenOrderFacade) { this.adyenOrderFacade = adyenOrderFacade; } + + public void setProductFacade(ProductFacade productFacade) { + this.productFacade = productFacade; + } } From da61218bcdad2a2b6a3329f37f336d897edaac87 Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Tue, 24 Dec 2024 08:03:19 +0100 Subject: [PATCH 06/26] AD-291: Google Payments, fix for java-lib update --- .../src/components/payment/Payment.tsx | 33 ++++++++++++------- .../impl/DefaultAdyenRequestService.java | 4 +-- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx index 516acf99..e12e562e 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx @@ -21,7 +21,13 @@ import {routes} from "../../router/routes"; import {Navigate} from "react-router-dom"; import {PaymentError} from "./PaymentError"; import {ScrollHere} from "../common/ScrollTo"; -import {CoreConfiguration,CardConfiguration, UIElement} from "@adyen/adyen-web"; +import { + CoreConfiguration, + CardConfiguration, + UIElement, + SubmitActions, + AdditionalDetailsActions +} from "@adyen/adyen-web"; interface State { useDifferentBillingAddress: boolean @@ -124,8 +130,8 @@ class Payment extends React.Component { onError: (error: AdyenCheckoutError, element?: UIElement) => { this.handleError() }, - onSubmit: (state: any, element: UIElement) => this.handlePayment(state.data), - onAdditionalDetails: (state: any, element?: UIElement) => this.handleAdditionalDetails(state.data) + onSubmit: (state: any, element: UIElement, actions: SubmitActions) => this.handlePayment(state.data, actions), + onAdditionalDetails: (state: any, element: UIElement,actions: AdditionalDetailsActions) => this.handleAdditionalDetails(state.data, actions) } } @@ -176,22 +182,22 @@ class Payment extends React.Component { this.resetDropInComponent(); } - private async handlePayment(data: any) { + private async handlePayment(data: any, actions: SubmitActions) { let adyenPaymentForm = PaymentService.preparePlaceOrderRequest(data, this.state.useDifferentBillingAddress, this.isSaveInAddressBook(), this.props.billingAddress); - await this.executePaymentRequest(adyenPaymentForm) + await this.executePaymentRequest(adyenPaymentForm, actions) } - private async handleAdditionalDetails(data: any) { - await this.executeAdditionalDetails(data) + private async handleAdditionalDetails(data: any,actions: AdditionalDetailsActions) { + await this.executeAdditionalDetails(data,actions) } private isSaveInAddressBook(): boolean { return this.state.saveInAddressBook && this.state.useDifferentBillingAddress } - private async handleResponse(response: Promise) { + private async handleResponse(response: Promise, actions: SubmitActions) { this.setState({errorFieldCodes: []}) let responseData = await response; @@ -200,6 +206,9 @@ class Payment extends React.Component { if (responseData.executeAction) { this.dropIn.handleAction(responseData.paymentsAction) } else { + actions.resolve({ + resultCode: 'Authorised' + }); this.setState({orderNumber: responseData.orderNumber}) this.setState({redirectToNextStep: true}) } @@ -211,12 +220,12 @@ class Payment extends React.Component { } } - private async executePaymentRequest(adyenPaymentForm: PlaceOrderRequest) { - await this.handleResponse(PaymentService.placeOrder(adyenPaymentForm)); + private async executePaymentRequest(adyenPaymentForm: PlaceOrderRequest, actions: SubmitActions) { + await this.handleResponse(PaymentService.placeOrder(adyenPaymentForm), actions); } - private async executeAdditionalDetails(details: any) { - await this.handleResponse(PaymentService.sendAdditionalDetails(details)); + private async executeAdditionalDetails(details: any, actions: AdditionalDetailsActions) { + await this.handleResponse(PaymentService.sendAdditionalDetails(details), actions); } private resetDropInComponent() { diff --git a/adyenv6core/src/com/adyen/commerce/services/impl/DefaultAdyenRequestService.java b/adyenv6core/src/com/adyen/commerce/services/impl/DefaultAdyenRequestService.java index 23097bdf..806772a7 100644 --- a/adyenv6core/src/com/adyen/commerce/services/impl/DefaultAdyenRequestService.java +++ b/adyenv6core/src/com/adyen/commerce/services/impl/DefaultAdyenRequestService.java @@ -43,8 +43,8 @@ public void populateL2L3AdditionalData(final Map additionalData, if (cartData.getTotalTax() != null) { additionalData.put(TOTAL_TAX_AMOUNT, String.valueOf(cartData.getTotalTax().getValue())); } - if (StringUtils.isNotEmpty(cartData.getMerchantCustomerId())) { - additionalData.put(CUSTOMER_REFERENCE, cartData.getMerchantCustomerId()); + if (StringUtils.isNotEmpty(cartData.getUser().getUid())) { + additionalData.put(CUSTOMER_REFERENCE, cartData.getUser().getUid()); } // not required but available if (cartData.getDeliveryCost() != null) { From 51efb845fdc14bdfa087dd6c2b8384a010d8640d Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Thu, 2 Jan 2025 19:30:58 +0100 Subject: [PATCH 07/26] AD-390: Removing session --- .../src/components/payment/Payment.tsx | 4 - .../impl/DefaultAdyenCheckoutFacade.java | 16 ---- .../adyen/v6/facades/impl/SessionRequest.java | 59 ------------ .../v6/facades/impl/SessionResponse.java | 92 ------------------- .../populator/AdyenOrderEntryPopulator.java | 4 +- 5 files changed, 3 insertions(+), 172 deletions(-) delete mode 100644 adyenv6core/src/com/adyen/v6/facades/impl/SessionRequest.java delete mode 100644 adyenv6core/src/com/adyen/v6/facades/impl/SessionResponse.java diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx index e12e562e..c8af21f4 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx @@ -116,10 +116,6 @@ class Payment extends React.Component { environment: this.castToEnvironment(this.props.adyenConfig.environmentMode), clientKey: this.props.adyenConfig.adyenClientKey, countryCode: this.props.adyenConfig.countryCode, - session: { - id: this.props.adyenConfig.sessionData.id, - sessionData: this.props.adyenConfig.sessionData.sessionData - }, analytics: { enabled: false }, diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index e7eb9df6..39e24e63 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -783,7 +783,6 @@ public CheckoutConfigDTO getReactCheckoutConfig() throws ApiException { .setAdyenClientKey(baseStore.getAdyenClientKey()) .setAdyenPaypalMerchantId(baseStore.getAdyenPaypalMerchantId()) .setDeviceFingerPrintUrl(adyenPaymentService.getDeviceFingerprintUrl()) - .setSessionData(getAdyenSessionData(showRememberDetails())) .setSelectedPaymentMethod(cartData.getAdyenPaymentMethod()) .setShowRememberTheseDetails(showRememberDetails()) .setCheckoutShopperHost(getCheckoutShopperHost()) @@ -929,7 +928,6 @@ public CheckoutConfigDTO getCheckoutConfig() throws ApiException { .setAdyenClientKey(baseStore.getAdyenClientKey()) .setAdyenPaypalMerchantId(baseStore.getAdyenPaypalMerchantId()) .setDeviceFingerPrintUrl(adyenCheckoutApiService.getDeviceFingerprintUrl()) - .setSessionData(getAdyenSessionData(showRememberDetails())) .setSelectedPaymentMethod(cartData.getAdyenPaymentMethod()) .setShowRememberTheseDetails(showRememberDetails()) .setCheckoutShopperHost(getCheckoutShopperHost()) @@ -1040,19 +1038,6 @@ protected Map getApplePayConfigFromPaymentMethods(List(); } - protected CreateCheckoutSessionResponse getAdyenSessionData(final boolean storePaymentMethod) throws ApiException { - try { - final CartData cartData = getCheckoutFacade().getCheckoutCart(); - return getAdyenPaymentService().getPaymentSessionData(cartData, storePaymentMethod); - } catch (JsonProcessingException e) { - LOGGER.error("Processing json failed. ", e); - return null; - } catch (IOException e) { - LOGGER.error("Exception during geting Adyen session data. ", e); - return null; - } - } - protected CreateCheckoutSessionResponse getAdyenSessionData(Amount amount) throws ApiException { try { return getAdyenPaymentService().getPaymentSessionData(amount); @@ -1095,7 +1080,6 @@ public void initializeSummaryData(Model model) throws ApiException { model.addAttribute(MODEL_AMAZONPAY_CONFIGURATION, gson.toJson(cartData.getAdyenAmazonPayConfiguration())); model.addAttribute(MODEL_COUNTRY_CODE, countryCode); model.addAttribute(MODEL_DELIVERY_ADDRESS, gson.toJson(cartData.getDeliveryAddress())); - model.addAttribute(SESSION_DATA, getAdyenSessionData(showRememberDetails())); model.addAttribute(LOCALE, gson.toJson(setLocale(cartData.getAdyenAmazonPayConfiguration(), shopperLocale))); } diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/SessionRequest.java b/adyenv6core/src/com/adyen/v6/facades/impl/SessionRequest.java deleted file mode 100644 index b87d3d8e..00000000 --- a/adyenv6core/src/com/adyen/v6/facades/impl/SessionRequest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.adyen.v6.facades.impl; - -import com.adyen.model.checkout.Amount; - -public class SessionRequest { - private String merchantAccount; - private String returnUrl; - private String reference; - private String countryCode; - private Amount amount; - - public SessionRequest(String merchantAccount, String returnUrl, String reference, String countryCode, Amount amount) { - this.merchantAccount = merchantAccount; - this.returnUrl = returnUrl; - this.reference = reference; - this.countryCode = countryCode; - this.amount = amount; - } - - public String getMerchantAccount() { - return merchantAccount; - } - - public void setMerchantAccount(String merchantAccount) { - this.merchantAccount = merchantAccount; - } - - public String getReturnUrl() { - return returnUrl; - } - - public void setReturnUrl(String returnUrl) { - this.returnUrl = returnUrl; - } - - public String getReference() { - return reference; - } - - public void setReference(String reference) { - this.reference = reference; - } - - public String getCountryCode() { - return countryCode; - } - - public void setCountryCode(String countryCode) { - this.countryCode = countryCode; - } - - public Amount getAmount() { - return amount; - } - - public void setAmount(Amount amount) { - this.amount = amount; - } -} diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/SessionResponse.java b/adyenv6core/src/com/adyen/v6/facades/impl/SessionResponse.java deleted file mode 100644 index e87be8f2..00000000 --- a/adyenv6core/src/com/adyen/v6/facades/impl/SessionResponse.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.adyen.v6.facades.impl; - -import com.adyen.model.checkout.Amount; - -public class SessionResponse { - - private String countryCode; - private String expiresAt; - private String merchantAccount; - private String returnUrl; - private String sessionData; - private String id; - private String reference; - private Amount amount; - - public SessionResponse(){ - - } - public SessionResponse(String countryCode, String expiresAt, String merchantAccount, String returnUrl, String sessionData, String id, Amount amount) { - this.countryCode = countryCode; - this.expiresAt = expiresAt; - this.merchantAccount = merchantAccount; - this.returnUrl = returnUrl; - this.sessionData = sessionData; - this.id = id; - this.amount = amount; - } - - public String getReference(){ - return reference; - } - - public void setReference(String reference) { - this.reference = reference; - } - - public String getCountryCode() { - return countryCode; - } - - public void setCountryCode(String countryCode) { - this.countryCode = countryCode; - } - - public String getExpiresAt() { - return expiresAt; - } - - public void setExpiresAt(String expiresAt) { - this.expiresAt = expiresAt; - } - - public String getMerchantAccount() { - return merchantAccount; - } - - public void setMerchantAccount(String merchantAccount) { - this.merchantAccount = merchantAccount; - } - - public String getReturnUrl() { - return returnUrl; - } - - public void setReturnUrl(String returnUrl) { - this.returnUrl = returnUrl; - } - - public String getSessionData() { - return sessionData; - } - - public void setSessionData(String sessionData) { - this.sessionData = sessionData; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Amount getAmount() { - return amount; - } - - public void setAmount(Amount amount) { - this.amount = amount; - } -} diff --git a/adyenv6core/src/com/adyen/v6/populator/AdyenOrderEntryPopulator.java b/adyenv6core/src/com/adyen/v6/populator/AdyenOrderEntryPopulator.java index ec6e32a8..faebd80a 100644 --- a/adyenv6core/src/com/adyen/v6/populator/AdyenOrderEntryPopulator.java +++ b/adyenv6core/src/com/adyen/v6/populator/AdyenOrderEntryPopulator.java @@ -35,6 +35,8 @@ public class AdyenOrderEntryPopulator extends OrderEntryPopulator { public void populate(@Nonnull final AbstractOrderEntryModel source, @Nonnull final OrderEntryData target) { target.setTaxValues(source.getTaxValues()); - target.setUnitOfMeasure(source.getUnit().getName()); + if (source.getUnit() != null) { + target.setUnitOfMeasure(source.getUnit().getName()); + } } } From c15988ec74eafe9830bd3cb57ebfab97e72dec14 Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Fri, 3 Jan 2025 10:41:33 +0100 Subject: [PATCH 08/26] AD-390: Payment result refactoring --- .../src/components/payment/Payment.tsx | 2 +- .../src/service/paymentService.ts | 6 +++-- .../commerce/dto/OrderPaymentResult.java | 22 +++++++++++++++++++ .../facades/AdyenCheckoutApiFacade.java | 3 ++- .../impl/DefaultAdyenCheckoutApiFacade.java | 7 ++++-- .../DefaultAdyenExpressCheckoutFacade.java | 8 ++++--- .../PlaceOrderControllerBase.java | 6 +++-- .../response/OCCPlaceOrderResponse.java | 1 + 8 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 adyenv6core/src/com/adyen/commerce/dto/OrderPaymentResult.java diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx index c8af21f4..3ac47517 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx @@ -203,7 +203,7 @@ class Payment extends React.Component { this.dropIn.handleAction(responseData.paymentsAction) } else { actions.resolve({ - resultCode: 'Authorised' + resultCode: responseData.paymentsResponse.resultCode }); this.setState({orderNumber: responseData.orderNumber}) this.setState({redirectToNextStep: true}) diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/service/paymentService.ts b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/service/paymentService.ts index 0ffec335..ce7f1f42 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/service/paymentService.ts +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/service/paymentService.ts @@ -2,7 +2,7 @@ import {AxiosError, AxiosResponse} from "axios"; import {CSRFToken, urlContextPath} from "../util/baseUrlUtil"; import {AddressData, PlaceOrderRequest} from "../types/paymentForm"; import {AddressModel} from "../reducers/types"; -import {PaymentAction} from "@adyen/adyen-web"; +import {PaymentAction,PaymentResponseData} from "@adyen/adyen-web"; import {ErrorResponse} from "../types/errorResponse"; import {adyenAxios} from "../axios/AdyenAxios"; @@ -10,6 +10,7 @@ export interface PlaceOrderResponse { success: boolean, executeAction?: boolean, paymentsAction?: PaymentAction, + paymentsResponse?: PaymentResponseData, error?: string, errorFieldCodes?: string[] orderNumber?: string @@ -30,7 +31,8 @@ export class PaymentService { success: true, executeAction: placeOrderData.executeAction, paymentsAction: placeOrderData.paymentsAction, - orderNumber: placeOrderData.orderNumber + orderNumber: placeOrderData.orderNumber, + paymentsResponse: placeOrderData.paymentsResponse } }) .catch((errorResponse: AxiosError): PlaceOrderResponse | void => { diff --git a/adyenv6core/src/com/adyen/commerce/dto/OrderPaymentResult.java b/adyenv6core/src/com/adyen/commerce/dto/OrderPaymentResult.java new file mode 100644 index 00000000..81f5a2f6 --- /dev/null +++ b/adyenv6core/src/com/adyen/commerce/dto/OrderPaymentResult.java @@ -0,0 +1,22 @@ +package com.adyen.commerce.dto; + +import com.adyen.model.checkout.PaymentResponse; +import de.hybris.platform.commercefacades.order.data.OrderData; + +public class OrderPaymentResult { + private OrderData orderData; + private PaymentResponse paymentResponse; + + public OrderPaymentResult(OrderData orderData, PaymentResponse paymentResponse) { + this.orderData = orderData; + this.paymentResponse = paymentResponse; + } + + public OrderData getOrderData() { + return orderData; + } + + public PaymentResponse getPaymentResponse() { + return paymentResponse; + } +} diff --git a/adyenv6core/src/com/adyen/commerce/facades/AdyenCheckoutApiFacade.java b/adyenv6core/src/com/adyen/commerce/facades/AdyenCheckoutApiFacade.java index 70ad21bf..01839eac 100644 --- a/adyenv6core/src/com/adyen/commerce/facades/AdyenCheckoutApiFacade.java +++ b/adyenv6core/src/com/adyen/commerce/facades/AdyenCheckoutApiFacade.java @@ -1,5 +1,6 @@ package com.adyen.commerce.facades; +import com.adyen.commerce.dto.OrderPaymentResult; import com.adyen.model.checkout.PaymentDetailsRequest; import com.adyen.model.checkout.PaymentRequest; import com.adyen.v6.facades.AdyenCheckoutFacade; @@ -13,7 +14,7 @@ public interface AdyenCheckoutApiFacade extends AdyenCheckoutFacade { void preHandlePlaceOrder(PaymentRequest paymentRequest, String adyenPaymentMethod, AddressForm billingAddress, Boolean useAdyenDeliveryAddress); - OrderData placeOrderWithPayment(final HttpServletRequest request, final CartData cartData, PaymentRequest paymentRequest) throws Exception; + OrderPaymentResult placeOrderWithPayment(final HttpServletRequest request, final CartData cartData, PaymentRequest paymentRequest) throws Exception; OrderData placeOrderWithAdditionalDetails(PaymentDetailsRequest detailsRequest) throws Exception; } diff --git a/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java b/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java index 1303d6fa..3df1cfe1 100644 --- a/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java +++ b/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java @@ -1,5 +1,6 @@ package com.adyen.commerce.facades.impl; +import com.adyen.commerce.dto.OrderPaymentResult; import com.adyen.commerce.facades.AdyenCheckoutApiFacade; import com.adyen.model.checkout.AfterpayDetails; import com.adyen.model.checkout.ApplePayDetails; @@ -96,7 +97,7 @@ protected static String getBrowserInfoJson(BrowserInfo browserInfo) { @Override - public OrderData placeOrderWithPayment(final HttpServletRequest request, final CartData cartData, PaymentRequest paymentRequest) throws Exception { + public OrderPaymentResult placeOrderWithPayment(final HttpServletRequest request, final CartData cartData, PaymentRequest paymentRequest) throws Exception { RequestInfo requestInfo = new RequestInfo(request); requestInfo.setShopperLocale(getShopperLocale()); @@ -114,7 +115,9 @@ public OrderData placeOrderWithPayment(final HttpServletRequest request, final C } if (PaymentResponse.ResultCodeEnum.AUTHORISED == paymentResponse.getResultCode()) { LOGGER.info("Creating authorized order"); - return createAuthorizedOrder(paymentResponse); + OrderData authorizedOrder = createAuthorizedOrder(paymentResponse); + return new OrderPaymentResult(authorizedOrder, paymentResponse); + } throw new AdyenNonAuthorizedPaymentException(paymentResponse); diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java index 3c47bbd3..5f818831 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java @@ -1,5 +1,6 @@ package com.adyen.v6.facades.impl; +import com.adyen.commerce.dto.OrderPaymentResult; import com.adyen.commerce.facades.AdyenCheckoutApiFacade; import com.adyen.model.checkout.PaymentRequest; import com.adyen.model.checkout.PaymentResponse; @@ -215,14 +216,14 @@ protected OrderData expressPDPCheckoutOCC(PaymentRequest paymentRequest, Address CartData cartData = cartConverter.convert(cart); - OrderData orderData = adyenCheckoutApiFacade.placeOrderWithPayment(request, cartData, paymentRequest); + OrderPaymentResult orderPaymentResult = adyenCheckoutApiFacade.placeOrderWithPayment(request, cartData, paymentRequest); if (sessionCart != null) { cartService.setSessionCart(sessionCart); } - return orderData; + return orderPaymentResult.getOrderData(); } else { throw new InvalidCartException("Checkout attempt on empty cart"); } @@ -293,7 +294,8 @@ protected OrderData expressCartCheckoutOCC(PaymentRequest paymentRequest, Addres if (cartHasEntries(cart)) { CartData cartData = cartConverter.convert(cart); - return adyenCheckoutApiFacade.placeOrderWithPayment(request, cartData, paymentRequest); + OrderPaymentResult orderPaymentResult = adyenCheckoutApiFacade.placeOrderWithPayment(request, cartData, paymentRequest); + return orderPaymentResult.getOrderData(); } else { throw new InvalidCartException("Checkout attempt on empty cart"); } diff --git a/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java b/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java index e7c7c6ee..bcede4ef 100644 --- a/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java +++ b/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java @@ -1,5 +1,6 @@ package com.adyen.commerce.controllerbase; +import com.adyen.commerce.dto.OrderPaymentResult; import com.adyen.commerce.exception.AdyenControllerException; import com.adyen.commerce.facades.AdyenCheckoutApiFacade; import com.adyen.commerce.request.PlaceOrderRequest; @@ -171,13 +172,14 @@ private OCCPlaceOrderResponse handlePayment(HttpServletRequest request, PlaceOrd try { cartData.setAdyenReturnUrl(getPaymentRedirectReturnUrl()); - OrderData orderData = getAdyenCheckoutApiFacade().placeOrderWithPayment(request, cartData, placeOrderRequest.getPaymentRequest()); - + OrderPaymentResult orderPaymentResult = getAdyenCheckoutApiFacade().placeOrderWithPayment(request, cartData, placeOrderRequest.getPaymentRequest()); + OrderData orderData = orderPaymentResult.getOrderData(); String orderCode = getCheckoutCustomerStrategy().isAnonymousCheckout() ? orderData.getGuid() : orderData.getCode(); OCCPlaceOrderResponse placeOrderResponse = new OCCPlaceOrderResponse(); placeOrderResponse.setOrderNumber(orderCode); placeOrderResponse.setOrderData(orderData); + placeOrderResponse.setPaymentsResponse(orderPaymentResult.getPaymentResponse()); return placeOrderResponse; } catch (ApiException e) { diff --git a/adyenwebcommons/src/com/adyen/commerce/response/OCCPlaceOrderResponse.java b/adyenwebcommons/src/com/adyen/commerce/response/OCCPlaceOrderResponse.java index a0c97c12..e44ccf31 100644 --- a/adyenwebcommons/src/com/adyen/commerce/response/OCCPlaceOrderResponse.java +++ b/adyenwebcommons/src/com/adyen/commerce/response/OCCPlaceOrderResponse.java @@ -1,5 +1,6 @@ package com.adyen.commerce.response; +import com.adyen.model.checkout.PaymentResponse; import de.hybris.platform.commercefacades.order.data.OrderData; public class OCCPlaceOrderResponse extends PlaceOrderResponse { From f00240ffc180424ceae3d37b7065e815bbab4dff Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Fri, 3 Jan 2025 13:56:47 +0100 Subject: [PATCH 09/26] AD-390: Removing session from express payments --- .../src/com/adyen/v6/dto/CheckoutConfigDTO.java | 9 --------- .../adyen/v6/dto/CheckoutConfigDTOBuilder.java | 5 ----- .../facades/impl/DefaultAdyenCheckoutFacade.java | 15 --------------- 3 files changed, 29 deletions(-) diff --git a/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTO.java b/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTO.java index a2923d67..acdb3ab3 100644 --- a/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTO.java +++ b/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTO.java @@ -25,7 +25,6 @@ public class CheckoutConfigDTO { private String adyenClientKey; private String adyenPaypalMerchantId; private String deviceFingerPrintUrl; - private CreateCheckoutSessionResponse sessionData; private String selectedPaymentMethod; private boolean showRememberTheseDetails; private String checkoutShopperHost; @@ -135,14 +134,6 @@ public void setDeviceFingerPrintUrl(String deviceFingerPrintUrl) { this.deviceFingerPrintUrl = deviceFingerPrintUrl; } - public CreateCheckoutSessionResponse getSessionData() { - return sessionData; - } - - public void setSessionData(CreateCheckoutSessionResponse sessionData) { - this.sessionData = sessionData; - } - public String getSelectedPaymentMethod() { return selectedPaymentMethod; } diff --git a/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTOBuilder.java b/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTOBuilder.java index 9736bb6d..6ff1ae35 100644 --- a/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTOBuilder.java +++ b/adyenv6core/src/com/adyen/v6/dto/CheckoutConfigDTOBuilder.java @@ -75,11 +75,6 @@ public CheckoutConfigDTOBuilder setDeviceFingerPrintUrl(String deviceFingerPrint return this; } - public CheckoutConfigDTOBuilder setSessionData(CreateCheckoutSessionResponse sessionData) { - checkoutConfigDTO.setSessionData(sessionData); - return this; - } - public CheckoutConfigDTOBuilder setSelectedPaymentMethod(String selectedPaymentMethod) { checkoutConfigDTO.setSelectedPaymentMethod(selectedPaymentMethod); return this; diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index 39e24e63..1c8fba80 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -157,7 +157,6 @@ public class DefaultAdyenCheckoutFacade implements AdyenCheckoutFacade { public static final String DETAILS = "details"; private static final String LOCALE = "locale"; - public static final String SESSION_DATA = "sessionData"; private static final String REGION = "region"; private static final String US_LOCALE = "en_US"; private static final String GB_LOCALE = "en_GB"; @@ -653,7 +652,6 @@ protected OrderData placeAuthorisedOrder(PaymentResponse.ResultCodeEnum resultCo public void initializeCheckoutData(Model model) throws ApiException { CheckoutConfigDTO checkoutConfigDTO = getCheckoutConfig(); - model.addAttribute(SESSION_DATA, checkoutConfigDTO.getSessionData()); // current selected PaymentMethod model.addAttribute(MODEL_SELECTED_PAYMENT_METHOD, checkoutConfigDTO.getSelectedPaymentMethod()); @@ -1038,18 +1036,6 @@ protected Map getApplePayConfigFromPaymentMethods(List(); } - protected CreateCheckoutSessionResponse getAdyenSessionData(Amount amount) throws ApiException { - try { - return getAdyenPaymentService().getPaymentSessionData(amount); - } catch (JsonProcessingException e) { - LOGGER.error("Processing json failed. ", e); - return null; - } catch (IOException e) { - LOGGER.error("Exception during geting Adyen session data. ", e); - return null; - } - } - @Override public void initializeSummaryData(Model model) throws ApiException { final CartData cartData = getCheckoutFacade().getCheckoutCart(); @@ -1133,7 +1119,6 @@ protected void initializeApplePayExpressDataInternal(BigDecimal amountValue, Str model.addAttribute(MODEL_ENVIRONMENT_MODE, getEnvironmentMode()); model.addAttribute(MODEL_CLIENT_KEY, baseStore.getAdyenClientKey()); model.addAttribute(MODEL_MERCHANT_ACCOUNT, adyenMerchantAccountStrategy.getWebMerchantAccount()); - model.addAttribute(SESSION_DATA, getAdyenSessionData(amount)); model.addAttribute(MODEL_AMOUNT, amount); model.addAttribute(MODEL_AMOUNT_DECIMAL, amountValue); model.addAttribute(MODEL_DF_URL, getAdyenPaymentService().getDeviceFingerprintUrl()); From 1846ed61636c92b9cf613aac7f7398bea68580a6 Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Fri, 3 Jan 2025 14:19:58 +0100 Subject: [PATCH 10/26] AD-390: Removing session from express payments --- .../WEB-INF/tags/responsive/expressCheckoutConfig.tag | 4 ---- .../views/responsive/pages/checkout/multi/3ds_payment.jsp | 2 -- .../responsive/pages/checkout/multi/checkoutSummaryPage.jsp | 6 ------ .../pages/checkout/multi/selectPaymentMethodPage.jsp | 6 +----- 4 files changed, 1 insertion(+), 17 deletions(-) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag index 65a67cc1..b77a6085 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag @@ -32,10 +32,6 @@ shopperLocale: '${shopperLocale}', environment: '${environmentMode}', clientKey: '${clientKey}', - session: { - id: '${sessionData.id}', - sessionData: '${sessionData.sessionData}' - }, countryCode: 'US' } diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds_payment.jsp b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds_payment.jsp index 6f59682f..19eff314 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds_payment.jsp +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/3ds_payment.jsp @@ -10,8 +10,6 @@ - - diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/checkoutSummaryPage.jsp b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/checkoutSummaryPage.jsp index 93b7e639..3871474a 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/checkoutSummaryPage.jsp +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/checkoutSummaryPage.jsp @@ -25,12 +25,6 @@ - - - - - - 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 c2d348df..52955aba 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 @@ -31,11 +31,7 @@ const initConfig = { shopperLocale: "${shopperLocale}", environment: "${environmentMode}", - clientKey: "${clientKey}", - session: { - id: "${sessionData.id}", - sessionData: "${sessionData.sessionData}", - } + clientKey: "${clientKey}" }; const paymentMethodConfigs = {}; From 31a2a79a0bc9a9ea888adf51da7376656b8e7c0e Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Fri, 3 Jan 2025 14:29:06 +0100 Subject: [PATCH 11/26] AD-390: Removing session from express payments --- .../responsive/pages/checkout/multi/checkoutSummaryPage.jsp | 1 + 1 file changed, 1 insertion(+) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/checkoutSummaryPage.jsp b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/checkoutSummaryPage.jsp index 3871474a..abdb90b2 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/checkoutSummaryPage.jsp +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/pages/checkout/multi/checkoutSummaryPage.jsp @@ -25,6 +25,7 @@ + From 9ca49fdd2d5da3a5c5e105ab56ada9c48ca7db0d Mon Sep 17 00:00:00 2001 From: PJaneta Date: Fri, 3 Jan 2025 14:44:34 +0100 Subject: [PATCH 12/26] AD-388 Problem with Google Pay express: NullPointerException --- .../impl/DefaultAdyenCheckoutFacade.java | 45 ++++--------------- 1 file changed, 8 insertions(+), 37 deletions(-) diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index e7eb9df6..32fee462 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -22,17 +22,7 @@ import com.adyen.commerce.data.PaymentMethodsCartData; -import com.adyen.model.checkout.Amount; -import com.adyen.model.checkout.CreateCheckoutSessionResponse; -import com.adyen.model.checkout.PaymentCompletionDetails; -import com.adyen.model.checkout.PaymentDetailsRequest; -import com.adyen.model.checkout.PaymentDetailsResponse; -import com.adyen.model.checkout.PaymentMethod; -import com.adyen.model.checkout.PaymentMethodsResponse; -import com.adyen.model.checkout.PaymentRequest; -import com.adyen.model.checkout.PaymentResponse; -import com.adyen.model.checkout.PaymentResponseAction; -import com.adyen.model.checkout.StoredPaymentMethod; +import com.adyen.model.checkout.*; import com.adyen.model.nexo.ErrorConditionType; import com.adyen.model.nexo.ResultType; import com.adyen.model.recurring.Recurring; @@ -111,43 +101,20 @@ import org.springframework.beans.factory.annotation.Required; import org.springframework.transaction.support.TransactionOperations; import org.springframework.ui.Model; +import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.validation.Errors; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.adyen.constants.ApiConstants.ThreeDS2Property.THREEDS2_CHALLENGE_TOKEN; import static com.adyen.constants.ApiConstants.ThreeDS2Property.THREEDS2_FINGERPRINT_TOKEN; -import static com.adyen.v6.constants.Adyenv6coreConstants.ISSUER_PAYMENT_METHODS; -import static com.adyen.v6.constants.Adyenv6coreConstants.OPENINVOICE_METHODS_ALLOW_SOCIAL_SECURITY_NUMBER; -import static com.adyen.v6.constants.Adyenv6coreConstants.OPENINVOICE_METHODS_API; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYBRIGHT; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHODS_ALLOW_SOCIAL_SECURITY_NUMBER; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_AMAZONPAY; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_APPLEPAY; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_BOLETO; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_KLARNA; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_ONLINEBANKING_IN; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_ONLINEBANKING_PL; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_SCHEME; -import static com.adyen.v6.constants.Adyenv6coreConstants.PAYMENT_METHOD_SEPA_DIRECTDEBIT; -import static com.adyen.v6.constants.Adyenv6coreConstants.SHOPPER_LOCALE; +import static com.adyen.v6.constants.Adyenv6coreConstants.*; import static de.hybris.platform.order.impl.DefaultCartService.SESSION_CART_PARAMETER_NAME; /** @@ -715,6 +682,8 @@ public CheckoutConfigDTO getReactCheckoutConfig() throws ApiException { PaymentMethodsResponse response = new PaymentMethodsResponse(); CartModel cartModel = cartService.getSessionCart(); + Assert.notNull(cartModel.getDeliveryAddress(), "Delivery address is required"); + //to remove unwanted payment methods insert them here List excludedPaymentMethods = getExcludedPaymentMethodsFromConfiguration(); LOGGER.info(excludedPaymentMethods.toString()); @@ -848,6 +817,8 @@ public CheckoutConfigDTO getCheckoutConfig() throws ApiException { PaymentMethodsResponse response = new PaymentMethodsResponse(); CartModel cartModel = cartService.getSessionCart(); + Assert.notNull(cartModel.getDeliveryAddress(), "Delivery address is required"); + try { if (showPos()) { connectedTerminalList = adyenCheckoutApiService.getConnectedTerminals().getUniqueTerminalIds(); From aa86d9b8a9adb20b733197abb9353bfe4b1cde03 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Fri, 3 Jan 2025 15:26:31 +0100 Subject: [PATCH 13/26] AD-334 Add Apple Pay Express Button with Frontend Logic and API Calls to CMS Components on PDP and Cart Pages - Spartacus - remove session --- .../com/adyen/v6/dto/ExpressCheckoutConfigDTO.java | 11 ----------- .../adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java | 6 ------ 2 files changed, 17 deletions(-) diff --git a/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTO.java b/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTO.java index e552518f..ddc47548 100644 --- a/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTO.java +++ b/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTO.java @@ -1,7 +1,6 @@ package com.adyen.v6.dto; import com.adyen.model.checkout.Amount; -import com.adyen.model.checkout.CreateCheckoutSessionResponse; import java.math.BigDecimal; @@ -13,8 +12,6 @@ public class ExpressCheckoutConfigDTO { private String environmentMode; private String clientKey; private String merchantAccount; - //TODO: Remove in 13.3 - private CreateCheckoutSessionResponse sessionData; private Amount amount; private BigDecimal amountDecimal; private String dfUrl; @@ -77,14 +74,6 @@ public void setMerchantAccount(String merchantAccount) { this.merchantAccount = merchantAccount; } - public CreateCheckoutSessionResponse getSessionData() { - return sessionData; - } - - public void setSessionData(CreateCheckoutSessionResponse sessionData) { - this.sessionData = sessionData; - } - public Amount getAmount() { return amount; } diff --git a/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java b/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java index 6446a58f..bd526ac2 100644 --- a/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java +++ b/adyenv6core/src/com/adyen/v6/dto/ExpressCheckoutConfigDTOBuilder.java @@ -1,7 +1,6 @@ package com.adyen.v6.dto; import com.adyen.model.checkout.Amount; -import com.adyen.model.checkout.CreateCheckoutSessionResponse; import java.math.BigDecimal; @@ -47,11 +46,6 @@ public ExpressCheckoutConfigDTOBuilder setMerchantAccount(String merchantAccount return this; } - public ExpressCheckoutConfigDTOBuilder setSessionData(CreateCheckoutSessionResponse sessionData) { - expressCheckoutConfigDTO.setSessionData(sessionData); - return this; - } - public ExpressCheckoutConfigDTOBuilder setAmount(Amount amount) { expressCheckoutConfigDTO.setAmount(amount); return this; From fc2cc4d19858fe32b56911f6ba5f780b5dbeb01c Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:48:08 +0100 Subject: [PATCH 14/26] AD-390: Removing session from express payments --- .../common/js/adyen-checkout/src/components/payment/Payment.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx index 3ac47517..eb4e6927 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx @@ -137,6 +137,7 @@ class Payment extends React.Component { hasHolderName: true, holderNameRequired: this.props.adyenConfig.cardHolderNameRequired, enableStoreDetails: this.props.adyenConfig.showRememberTheseDetails, + amount: this.props.adyenConfig.amount, clickToPayConfiguration: { merchantDisplayName: this.props.adyenConfig.merchantDisplayName, shopperEmail: this.props.adyenConfig.shopperEmail, From d899adec6d97ab408a527d086b0079a4061f75e9 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Thu, 9 Jan 2025 11:48:36 +0100 Subject: [PATCH 15/26] AD-332 Add Apple Pay Express Button with Frontend Logic and API Calls to CMS Components on PDP and Cart Pages - add merchantId and merchantName --- .../tags/responsive/expressCheckoutConfig.tag | 2 ++ ...dyenaccexpresscheckoutcartpagecomponent.jsp | 18 ++++++++++-------- .../common/js/adyen_express_checkout.js | 8 +++++++- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag index b77a6085..03005074 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag @@ -22,6 +22,8 @@ label: ['visible-xs', 'hidden-xs'], pageType: '${pageType}', productCode: '${product.code}', + applePayMerchantName: '${applePayMerchantName}', + applePayMerchantId: '${applePayMerchantIdentifier}', googlePayExpressEnabledOnCart: ${expressPaymentConfig.googlePayExpressEnabledOnCart}, applePayExpressEnabledOnCart: ${expressPaymentConfig.applePayExpressEnabledOnCart}, googlePayExpressEnabledOnProduct: ${expressPaymentConfig.googlePayExpressEnabledOnProduct}, diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/cms/adyenaccexpresscheckoutcartpagecomponent.jsp b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/cms/adyenaccexpresscheckoutcartpagecomponent.jsp index 58f65d5e..f8f6fae6 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/cms/adyenaccexpresscheckoutcartpagecomponent.jsp +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/views/responsive/cms/adyenaccexpresscheckoutcartpagecomponent.jsp @@ -4,15 +4,17 @@ -
-
-
-
+ +
+
+
+
+
-
-
-
+
+
+
-
\ No newline at end of file +
\ No newline at end of file diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js index ed044bd7..df94ecc9 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js @@ -45,7 +45,9 @@ var AdyenExpressCheckoutHybris = (function () { const { amount, pageType, - productCode + productCode, + applePayMerchantName, + applePayMerchantId } = params; const applePayNodes = document.getElementsByClassName('adyen-apple-pay-button'); @@ -60,6 +62,10 @@ var AdyenExpressCheckoutHybris = (function () { currency: amount.currency, value: amount.value }, + configuration: { + merchantName: applePayMerchantName, + merchantId: applePayMerchantId, + }, // Button config buttonType: "check-out", buttonColor: "black", From e09f60a9daa0c9ca3fa6239c461a35d40aacb193 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Thu, 9 Jan 2025 15:39:05 +0100 Subject: [PATCH 16/26] AD-391 Payment methods don't update on country change - React --- .../src/components/payment/Payment.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx index eb4e6927..c6998b3e 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx @@ -9,7 +9,7 @@ import {AddressData} from "../../types/addressData"; import {InputCheckbox} from "../controls/InputCheckbox"; import {AddressService} from "../../service/addressService"; import {AdyenConfigService} from "../../service/adyenConfigService"; -import { AdyenCheckout, Dropin,AdyenCheckoutError, ICore } from '@adyen/adyen-web/auto' +import {AdyenCheckout, AdyenCheckoutError, Dropin, ICore} from '@adyen/adyen-web/auto' import '@adyen/adyen-web/styles/adyen.css'; import {AdyenConfigData} from "../../types/adyenConfigData"; import {isEmpty, isNotEmpty} from "../../util/stringUtil"; @@ -22,12 +22,13 @@ import {Navigate} from "react-router-dom"; import {PaymentError} from "./PaymentError"; import {ScrollHere} from "../common/ScrollTo"; import { - CoreConfiguration, + AdditionalDetailsActions, CardConfiguration, - UIElement, + CoreConfiguration, SubmitActions, - AdditionalDetailsActions + UIElement } from "@adyen/adyen-web"; +import {adyenConfigInitialState} from "../../reducers/adyenConfigReducer"; interface State { useDifferentBillingAddress: boolean @@ -61,6 +62,7 @@ interface DispatchProps { setPostCode: (postCode: string) => void setPhoneNumber: (phoneNumber: string) => void setSelectedAddress: (address: AddressModel) => void + removeAdyenConfigFromStore: () => void } type Props = StoreProps & DispatchProps & ComponentProps @@ -100,6 +102,10 @@ class Payment extends React.Component { } } + componentWillUnmount() { + this.props.removeAdyenConfigFromStore(); + } + private async initializeWebComponentsCheckout() { let adyenCheckout = await AdyenCheckout(this.getAdyenCheckoutConfig()); @@ -342,7 +348,8 @@ function mapDispatchToProps(dispatch: StoreDispatch): DispatchProps { type: "billingAddress/setPhoneNumber", payload: phoneNumber }), - setSelectedAddress: (address: AddressModel) => dispatch({type: "billingAddress/setAddress", payload: address}) + setSelectedAddress: (address: AddressModel) => dispatch({type: "billingAddress/setAddress", payload: address}), + removeAdyenConfigFromStore: () => dispatch(({type: "adyenConfig/setAdyenConfig", payload: adyenConfigInitialState})) } } From 4581958e723c43b46d6d3e69766509880fd71c06 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Thu, 9 Jan 2025 15:40:50 +0100 Subject: [PATCH 17/26] AD-321 Implement Configuration for Enabling Express Payments - removed shopper locale due to console log --- .../webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag | 1 - 1 file changed, 1 deletion(-) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag index b77a6085..ff6e75fc 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag @@ -29,7 +29,6 @@ } var checkoutConfig = { - shopperLocale: '${shopperLocale}', environment: '${environmentMode}', clientKey: '${clientKey}', countryCode: 'US' From 5e24e518cc5d8b31f680fdd4b1892cb5ed7ec3f7 Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Fri, 10 Jan 2025 15:44:27 +0100 Subject: [PATCH 18/26] AD-330: Fixes for Klarna and Blik --- .../src/reducers/adyenConfigReducer.ts | 1 - .../src/service/paymentService.ts | 4 +- .../src/types/adyenConfigData.ts | 6 - .../tags/responsive/checkoutOrderSummary.tag | 3 +- .../multi/selectPaymentMethodPage.jsp | 5 +- .../responsive/common/js/adyen.checkout.js | 7 +- .../common/js/adyen_component_factory.js | 114 ++++++++++-------- .../common/js/adyen_form_validator.js | 2 +- adyenv6core/resources/adyenv6core-beans.xml | 1 - .../commerce/dto/OrderPaymentResult.java | 11 ++ .../facades/AdyenCheckoutApiFacade.java | 2 +- .../impl/DefaultAdyenCheckoutApiFacade.java | 4 +- .../v6/service/AdyenCheckoutApiService.java | 3 - .../DefaultAdyenCheckoutApiService.java | 36 ------ .../PlaceOrderControllerBase.java | 7 +- .../commerce/response/PlaceOrderResponse.java | 10 ++ 16 files changed, 98 insertions(+), 118 deletions(-) diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts index 4c910e47..32508332 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/reducers/adyenConfigReducer.ts @@ -9,7 +9,6 @@ export const adyenConfigInitialState : AdyenConfigData = { immediateCapture: false, openInvoiceMethods: [], selectedPaymentMethod: "", - sessionData: undefined, shopperLocale: "", showBoleto: false, showComboCard: false, diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/service/paymentService.ts b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/service/paymentService.ts index ce7f1f42..c3cb6e47 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/service/paymentService.ts +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/service/paymentService.ts @@ -11,6 +11,7 @@ export interface PlaceOrderResponse { executeAction?: boolean, paymentsAction?: PaymentAction, paymentsResponse?: PaymentResponseData, + paymentDetailsResponse?: PaymentResponseData, error?: string, errorFieldCodes?: string[] orderNumber?: string @@ -61,7 +62,8 @@ export class PaymentService { success: true, executeAction: placeOrderData.executeAction, paymentsAction: placeOrderData.paymentsAction, - orderNumber: placeOrderData.orderNumber + orderNumber: placeOrderData.orderNumber, + paymentsResponse: placeOrderData.paymentDetailsResponse } }) .catch((errorResponse: AxiosError): PlaceOrderResponse | void => { diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts index 3b993261..08ca9c7b 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/types/adyenConfigData.ts @@ -11,7 +11,6 @@ export interface AdyenConfigData { adyenClientKey: string; adyenPaypalMerchantId: string; deviceFingerPrintUrl: string; - sessionData: SessionData; selectedPaymentMethod: string; showRememberTheseDetails: boolean; checkoutShopperHost: string; @@ -31,11 +30,6 @@ export interface AdyenConfigData { clickToPayLocale: string, } -interface SessionData { - id: string, - sessionData: string -} - interface StoredPaymentMethodData { brand: string; expiryMonth: string; 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 2d9821b3..7a0e38d9 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/checkoutOrderSummary.tag +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/checkoutOrderSummary.tag @@ -11,7 +11,7 @@ + value="[amazonpay],[applepay],[paypal],[paywithgoogle],[googlepay],[pix],[bcmc_mobile],[upi],[paysafecard],[klarna],[ideal]"/> <%-- Components --%> @@ -29,7 +29,6 @@
- <%-- Render QR code --%> 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 52955aba..89c20053 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 @@ -31,7 +31,8 @@ const initConfig = { shopperLocale: "${shopperLocale}", environment: "${environmentMode}", - clientKey: "${clientKey}" + clientKey: "${clientKey}", + countryCode: "${countryCode}" }; const paymentMethodConfigs = {}; @@ -53,7 +54,7 @@ - paymentMethodConfigs['createIdeal'] = ${issuerLists['ideal']}; + paymentMethodConfigs['createIdeal'] = ${issuerLists['ideal']}; diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen.checkout.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen.checkout.js index 64bb6ae0..86c02ce1 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen.checkout.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen.checkout.js @@ -59,11 +59,6 @@ class AdyenCheckoutHelper { }, onError: (error, component) => { console.error(error.name, error.message, error.stack, component); - }, - paymentMethodsConfiguration:{ - card: { - enableStoreDetails: paymentMethodConfigs.enableStoreDetails, - }, } }; this.checkout = await AdyenWeb.AdyenCheckout(configuration); @@ -227,7 +222,7 @@ class AdyenCheckoutHelper { }); } - makePayment(data, component, handleResult, label) { + makePayment(data, component, handleResult) { $.ajax({ url: ACC.config.encodedContextPath + '/adyen/component/payment', type: "POST", diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_component_factory.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_component_factory.js index 3882490b..4e1cf2f4 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_component_factory.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_component_factory.js @@ -6,10 +6,10 @@ class PaymentComponentFactory { } - paymentConfiguration(label) { + paymentConfiguration(label) { return { showPayButton: false, - onChange: (state, component) =>{ + onChange: (state, component) => { if (!state.isValid) { this.helper.enablePlaceOrder(label); } @@ -19,9 +19,9 @@ class PaymentComponentFactory { this.helper.enablePlaceOrder(label); return; } - this.helper.makePayment(state.data, component, this.helper.handleResult, label); + this.helper.makePayment(state.data, component, this.helper.handleResult); }, - onAdditionalDetails: (state, component) => { + onAdditionalDetails: (state, component) => { this.helper.submitDetails(state.data, this.helper.handleResult); }, onError: (error, component) => { @@ -49,9 +49,9 @@ class PaymentComponentFactory { } createCard(params) { - const {allowedCards, showRememberDetails, cardHolderNameRequired,merchantDisplayName,shopperEmail} = params; + const {allowedCards, showRememberDetails, cardHolderNameRequired, merchantDisplayName, shopperEmail} = params; - const copyCardBrand= (event) => { + const copyCardBrand = (event) => { this.helper.selectedCardBrand = event.brand; } @@ -60,13 +60,13 @@ class PaymentComponentFactory { type: 'card', hasHolderName: true, holderNameRequired: cardHolderNameRequired, - storePaymentMethod: showRememberDetails ? 'askForConsent': 'disabled', + storePaymentMethod: showRememberDetails ? 'askForConsent' : 'disabled', enableStoreDetails: showRememberDetails, brands: allowedCards, onBrand: copyCardBrand, clickToPayConfiguration: { merchantDisplayName: merchantDisplayName, - shopperEmail: shopperEmail + shopperEmail: shopperEmail } }).mount("#card-div"); @@ -98,7 +98,7 @@ class PaymentComponentFactory { sepaIbanNumberField.value = sepaIbanNumber; } - this.helper.sepaDirectDebit = new AdyenWeb.Sepa(this.checkout, { + this.helper.sepaDirectDebit = new AdyenWeb.SepaDirectDebit(this.checkout, { showPayButton: false, onChange: handleOnChange }).mount('#adyen_hpp_sepadirectdebit_container') @@ -130,10 +130,9 @@ class PaymentComponentFactory { type: "POST", data: JSON.stringify({ resultCode: result.resultCode, - sessionData: result.sessionData }), contentType: "application/json; charset=utf-8", - success: (data) => { + success: (data) => { try { window.location.href = ACC.config.encodedContextPath + "/" + data.replace("redirect:/", ""); } catch (e) { @@ -181,7 +180,7 @@ class PaymentComponentFactory { blockPayPalPayLaterButton: true, onInit: (data, actions) => { actions.enable(); - $(document).on('change', '.adyen-terms-conditions-check', (event) => { + $(document).on('change', '.adyen-terms-conditions-check', (event) => { const checked = (event.target.checked) $('.adyen-terms-conditions-check').prop('checked', checked) if (checked) { @@ -192,27 +191,27 @@ class PaymentComponentFactory { this.helper.showCheckTermsAndConditionsError(); }); }, - onClick: ()=> { + onClick: () => { // Show a validation error if the checkbox is not checked this.helper.showCheckTermsAndConditionsError(); }, - onChange: (state, component)=> { + onChange: (state, component) => { if (!state.isValid) { this.helper.enablePlaceOrder(label); } }, - onSubmit: (state, component)=> { + onSubmit: (state, component) => { if (!state.isValid) { this.helper.enablePlaceOrder(label); return false; } - this.helper.makePayment(state.data, component, this.helper.handleResult, label); + this.helper.makePayment(state.data, component, this.helper.handleResult); }, - onCancel: (data, component) => { + onCancel: (data, component) => { // Sets your prefered status of the component when a PayPal payment is cancelled. this.helper.handleResult({resultCode: ErrorMessages.PaymentCancelled}, true); }, - onError: (error, component) =>{ + onError: (error, component) => { // Sets your prefered status of the component when an error occurs. if (error.name === 'CANCEL') { this.helper.handleResult({resultCode: ErrorMessages.PaymentCancelled}, true); @@ -220,7 +219,7 @@ class PaymentComponentFactory { this.helper.handleResult({resultCode: ErrorMessages.PaymentError}, true); } }, - onAdditionalDetails: (state, component) => { + onAdditionalDetails: (state, component) => { this.helper.submitDetails(state.data, this.helper.handleResult); } }).mount('#adyen-component-button-container-' + label); @@ -265,19 +264,19 @@ class PaymentComponentFactory { // Button config buttonType: "plain", buttonColor: "black", - onChange: (state, component) => { + onChange: (state, component) => { if (!state.isValid) { this.helper.enablePlaceOrder(label); } }, - onSubmit: (state, component) => { + onSubmit: (state, component) => { if (!state.isValid) { this.helper.enablePlaceOrder(label); return false; } - this.helper.makePayment(state.data, component, this.helper.handleResult, label); + this.helper.makePayment(state.data, component, this.helper.handleResult); }, - onClick: (resolve, reject) => { + onClick: (resolve, reject) => { if (this.helper.isTermsAccepted(label)) { resolve(); } else { @@ -288,10 +287,10 @@ class PaymentComponentFactory { }).mount('adyen-component-button-container-' + label); adyenComponent.isAvailable() - .then( () => { + .then(() => { adyenComponent.mount(applePayNode); }) - .catch( (e) => { + .catch((e) => { // Apple Pay is not available console.log('Something went wrong trying to mount the Apple Pay component: ' + e); this.helper.handleResult({resultCode: ErrorMessages.PaymentNotAvailable}, true); @@ -301,7 +300,7 @@ class PaymentComponentFactory { createGooglePay(params) { const {amount, merchantAccount, label} = params; const googlePayNode = document.getElementById('adyen-component-button-container-' + label); - const adyenComponent = new AdyenWeb.GooglePay (this.checkout, { + const adyenComponent = new AdyenWeb.GooglePay(this.checkout, { environment: this.checkout.options.environment, amount: { currency: amount.currency, @@ -317,13 +316,13 @@ class PaymentComponentFactory { this.helper.hideSpinner(); } }, - onSubmit: (state, component) => { + onSubmit: (state, component) => { if (!state.isValid) { this.helper.hideSpinner(); return false; } this.helper.showSpinner(); - this.helper.makePayment(state.data, component, this.helper.handleResult, label); + this.helper.makePayment(state.data, component, this.helper.handleResult); }, onClick: (resolve, reject) => { if (this.helper.isTermsAccepted(label)) { @@ -336,13 +335,13 @@ class PaymentComponentFactory { }); adyenComponent.isAvailable() - .then( () => { + .then(() => { adyenComponent.mount(googlePayNode); }) - .catch( (e) => { + .catch((e) => { // Google Pay is not available console.log('Something went wrong trying to mount the Google Pay component: ' + e); - this.helper.handleResult({resultCode: ErrorMessages.PaymentNotAvailable }, true); + this.helper.handleResult({resultCode: ErrorMessages.PaymentNotAvailable}, true); }); } @@ -385,7 +384,7 @@ class PaymentComponentFactory { } }; const amazonPayNode = document.getElementById('adyen-component-button-container-' + label); - const adyenComponent = new AdyenWeb.AmazonPay(this.checkout,componentConfiguration); + const adyenComponent = new AdyenWeb.AmazonPay(this.checkout, componentConfiguration); try { adyenComponent.mount(amazonPayNode); } catch (e) { @@ -406,9 +405,10 @@ class PaymentComponentFactory { this.helper.configureButton(adyenComponent, false, label); } - createGiftCard (params) { + createGiftCard(params) { const {label} = params; - const adyenComponent = new AdyenWeb.Giftcard(this.checkout, this.paymentConfiguration(label)).mount('#adyen-component-container-' + label);; + const adyenComponent = new AdyenWeb.Giftcard(this.checkout, this.paymentConfiguration(label)).mount('#adyen-component-container-' + label); + ; this.helper.configureButton(adyenComponent, false, label); } @@ -432,7 +432,7 @@ class PaymentComponentFactory { createPix(params) { const {label, issuers} = params; - $("#generateqr-" + label).click( () => { + $("#generateqr-" + label).click(() => { this.helper.showSpinner(); if (!this.helper.isTermsAccepted(label)) { this.helper.handleResult({resultCode: ErrorMessages.TermsNotAccepted}, true) @@ -443,7 +443,7 @@ class PaymentComponentFactory { handleAction: (action) => { this.helper.checkout.createFromAction(action, { //TODO FXIME: check if this is correct issuers: issuers, - onAdditionalDetails: (state) => { + onAdditionalDetails: (state) => { this.helper.hideSpinner(); this.helper.submitDetails(state.data, this.helper.handleResult); } @@ -451,7 +451,7 @@ class PaymentComponentFactory { this.helper.hideSpinner(); } }; - this.helper.makePayment({type: "pix"}, actionHandler, this.helper.handleResult, label); + this.helper.makePayment({type: "pix"}, actionHandler, this.helper.handleResult); } }); } @@ -471,7 +471,7 @@ class PaymentComponentFactory { createBcmcMobile(params) { const {label} = params; - $("#generateqr-" + label).click( () => { + $("#generateqr-" + label).click(() => { this.helper.showSpinner(); if (!this.helper.isTermsAccepted(label)) { this.helper.handleResult({resultCode: ErrorMessages.TermsNotAccepted}, true) @@ -479,9 +479,9 @@ class PaymentComponentFactory { $("#generateqr-" + label).hide(); $(".checkbox").hide(); var actionHandler = { - handleAction: (action) => { + handleAction: (action) => { this.helper.checkout.createFromAction(action, { //TODO FXIME: check if this is correct - onAdditionalDetails: (state) => { + onAdditionalDetails: (state) => { this.helper.hideSpinner(); this.helper.submitDetails(state.data, this.helper.handleResult); } @@ -489,7 +489,7 @@ class PaymentComponentFactory { this.helper.hideSpinner(); } }; - this.helper.makePayment({type: "bcmc_mobile"}, actionHandler, this.helper.handleResult, label); + this.helper.makePayment({type: "bcmc_mobile"}, actionHandler, this.helper.handleResult); } }); } @@ -497,8 +497,8 @@ class PaymentComponentFactory { createBizum(params) { const {label} = params; - $(document).ready( () => { - $("#placeOrder-" + label).click( () => { + $(document).ready(() => { + $("#placeOrder-" + label).click(() => { $(this).prop('disabled', true); this.helper.showSpinner(); @@ -567,27 +567,35 @@ class PaymentComponentFactory { // Redirect payment methods createIdeal(idealDetails) { - new Redirect(this.checkout, - { - details: idealDetails, - type: 'ideal', - showPayButton: false, - onChange: this.handleOnChange - }) + new AdyenWeb.Redirect(checkout, { type: 'ideal' }) .mount("#adyen_hpp_ideal_container"); } createRedirectPaymentMethod(paymentMethod) { - new Redirect(this.checkout, {type: paymentMethod.paymentType, onChange: this.handleOnChange}).mount('#adyen-component-button-container-' + paymentMethod.label); + new AdyenWeb.Redirect(this.checkout, { + type: paymentMethod.paymentType, + onChange: this.handleOnChange, + onSubmit: (state, component) => { + if (!state.isValid) { + this.helper.enablePlaceOrder(label); + return; + } + this.helper.makePayment(state.data, component, this.helper.handleResult); + } + }).mount('#adyen-component-button-container-' + paymentMethod.label); } initiateWalletIN() { - new Redirect(this.checkout, {type: 'wallet_IN', onChange: this.handleOnChange + new AdyenWeb.Redirect(this.checkout, { + type: 'wallet_IN', onChange: this.handleOnChange }).mount('#adyen_hpp_wallet_IN_container'); } initiatePaytm() { - const paytm = new AdyenWeb.Redirect(this.checkout, {type: 'paytm', onChange: this.handleOnChange}).mount('#adyen_hpp_paytm_container'); + const paytm = new AdyenWeb.Redirect(this.checkout, { + type: 'paytm', + onChange: this.handleOnChange + }).mount('#adyen_hpp_paytm_container'); } // Helper methods diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_form_validator.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_form_validator.js index f9c6ec13..368b3753 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_form_validator.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_form_validator.js @@ -45,7 +45,7 @@ class AdyenFormValidator { } $('input[name="txvariant"]').remove(); - if (['eps', 'ideal', 'onlinebanking_IN', 'onlineBanking_PL'].indexOf(paymentMethod) >= 0) { + if (['eps','onlinebanking_IN', 'onlineBanking_PL'].indexOf(paymentMethod) >= 0) { var issuerIdField = document.getElementById('issuerId'); if (issuerIdField.value === "") { window.alert("Please select an issuer"); diff --git a/adyenv6core/resources/adyenv6core-beans.xml b/adyenv6core/resources/adyenv6core-beans.xml index 0d4f0119..dbb75de7 100644 --- a/adyenv6core/resources/adyenv6core-beans.xml +++ b/adyenv6core/resources/adyenv6core-beans.xml @@ -94,7 +94,6 @@ - diff --git a/adyenv6core/src/com/adyen/commerce/dto/OrderPaymentResult.java b/adyenv6core/src/com/adyen/commerce/dto/OrderPaymentResult.java index 81f5a2f6..d88ada1f 100644 --- a/adyenv6core/src/com/adyen/commerce/dto/OrderPaymentResult.java +++ b/adyenv6core/src/com/adyen/commerce/dto/OrderPaymentResult.java @@ -1,17 +1,24 @@ package com.adyen.commerce.dto; +import com.adyen.model.checkout.PaymentDetailsResponse; import com.adyen.model.checkout.PaymentResponse; import de.hybris.platform.commercefacades.order.data.OrderData; public class OrderPaymentResult { private OrderData orderData; private PaymentResponse paymentResponse; + private PaymentDetailsResponse paymentDetailsResponse; public OrderPaymentResult(OrderData orderData, PaymentResponse paymentResponse) { this.orderData = orderData; this.paymentResponse = paymentResponse; } + public OrderPaymentResult(OrderData orderData, PaymentDetailsResponse paymentDetailsResponse) { + this.orderData = orderData; + this.paymentDetailsResponse = paymentDetailsResponse; + } + public OrderData getOrderData() { return orderData; } @@ -19,4 +26,8 @@ public OrderData getOrderData() { public PaymentResponse getPaymentResponse() { return paymentResponse; } + + public PaymentDetailsResponse getPaymentDetailsResponse() { + return paymentDetailsResponse; + } } diff --git a/adyenv6core/src/com/adyen/commerce/facades/AdyenCheckoutApiFacade.java b/adyenv6core/src/com/adyen/commerce/facades/AdyenCheckoutApiFacade.java index 01839eac..e6114ce7 100644 --- a/adyenv6core/src/com/adyen/commerce/facades/AdyenCheckoutApiFacade.java +++ b/adyenv6core/src/com/adyen/commerce/facades/AdyenCheckoutApiFacade.java @@ -16,5 +16,5 @@ public interface AdyenCheckoutApiFacade extends AdyenCheckoutFacade { OrderPaymentResult placeOrderWithPayment(final HttpServletRequest request, final CartData cartData, PaymentRequest paymentRequest) throws Exception; - OrderData placeOrderWithAdditionalDetails(PaymentDetailsRequest detailsRequest) throws Exception; + OrderPaymentResult placeOrderWithAdditionalDetails(PaymentDetailsRequest detailsRequest) throws Exception; } diff --git a/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java b/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java index 3df1cfe1..76b8c79a 100644 --- a/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java +++ b/adyenv6core/src/com/adyen/commerce/facades/impl/DefaultAdyenCheckoutApiFacade.java @@ -124,7 +124,7 @@ public OrderPaymentResult placeOrderWithPayment(final HttpServletRequest request } @Override - public OrderData placeOrderWithAdditionalDetails(PaymentDetailsRequest detailsRequest) throws Exception { + public OrderPaymentResult placeOrderWithAdditionalDetails(PaymentDetailsRequest detailsRequest) throws Exception { PaymentDetailsResponse paymentsDetailsResponse = this.componentDetails(detailsRequest); @@ -142,7 +142,7 @@ public OrderData placeOrderWithAdditionalDetails(PaymentDetailsRequest detailsRe LOGGER.info("Creating authorized order"); String orderCode = paymentsDetailsResponse.getMerchantReference(); OrderModel orderModel = retrievePendingOrder(orderCode); - return getOrderConverter().convert(orderModel); + return new OrderPaymentResult(getOrderConverter().convert(orderModel), paymentsDetailsResponse); } throw new AdyenNonAuthorizedPaymentException(paymentsDetailsResponse); diff --git a/adyenv6core/src/com/adyen/v6/service/AdyenCheckoutApiService.java b/adyenv6core/src/com/adyen/v6/service/AdyenCheckoutApiService.java index 4a3a8275..4d1c57a1 100644 --- a/adyenv6core/src/com/adyen/v6/service/AdyenCheckoutApiService.java +++ b/adyenv6core/src/com/adyen/v6/service/AdyenCheckoutApiService.java @@ -104,7 +104,4 @@ public interface AdyenCheckoutApiService { */ TerminalAPIResponse sendSyncPosStatusRequest(CartData cartData, String serviceId) throws Exception; - CreateCheckoutSessionResponse getPaymentSessionData(final CartData cartData, final boolean storePaymentMethod) throws IOException, ApiException; - - CreateCheckoutSessionResponse getPaymentSessionData(final Amount amount) throws IOException, ApiException; } diff --git a/adyenv6core/src/com/adyen/v6/service/DefaultAdyenCheckoutApiService.java b/adyenv6core/src/com/adyen/v6/service/DefaultAdyenCheckoutApiService.java index c02cc3a1..10acdd51 100644 --- a/adyenv6core/src/com/adyen/v6/service/DefaultAdyenCheckoutApiService.java +++ b/adyenv6core/src/com/adyen/v6/service/DefaultAdyenCheckoutApiService.java @@ -277,42 +277,6 @@ public PaymentDetailsResponse getPaymentDetailsFromPayload(PaymentDetailsRequest return paymentsResponse; } - @Override - public CreateCheckoutSessionResponse getPaymentSessionData(final CartData cartData, final boolean storePaymentMethod) throws IOException, ApiException { - final PaymentsApi checkout = new PaymentsApi(client); - final PriceData totalPriceWithTax = cartData.getTotalPriceWithTax(); - - final CreateCheckoutSessionRequest createCheckoutSessionRequest = new CreateCheckoutSessionRequest(); - createCheckoutSessionRequest.amount(AmountUtil.createAmount(totalPriceWithTax.getValue(), totalPriceWithTax.getCurrencyIso())); - createCheckoutSessionRequest.merchantAccount(merchantAccount); - if (cartData.getDeliveryAddress() != null) { - createCheckoutSessionRequest.countryCode(cartData.getDeliveryAddress().getCountry().getIsocode()); - } - createCheckoutSessionRequest.returnUrl(Optional.ofNullable(cartData.getAdyenReturnUrl()).orElse("returnUrl")); - createCheckoutSessionRequest.reference(cartData.getCode()); - createCheckoutSessionRequest.setStorePaymentMethod(storePaymentMethod); - createCheckoutSessionRequest.setStorePaymentMethodMode(ASKFORCONSENT); - createCheckoutSessionRequest.enableOneClick(true); - createCheckoutSessionRequest.shopperEmail(cartData.getUser().getUid()); - createCheckoutSessionRequest.recurringProcessingModel(CreateCheckoutSessionRequest.RecurringProcessingModelEnum.CARDONFILE); - createCheckoutSessionRequest.shopperReference(cartData.getUser().getUid()); - - return checkout.sessions(createCheckoutSessionRequest); - } - - @Override - public CreateCheckoutSessionResponse getPaymentSessionData(final Amount amount) throws IOException, ApiException { - final PaymentsApi checkout = new PaymentsApi(client); - - final CreateCheckoutSessionRequest createCheckoutSessionRequest = new CreateCheckoutSessionRequest(); - createCheckoutSessionRequest.amount(amount); - createCheckoutSessionRequest.merchantAccount(merchantAccount); - createCheckoutSessionRequest.returnUrl("returnUrl"); //dummy url because it's required by api - createCheckoutSessionRequest.reference("reference"); //dummy reference because it's required by api - - return checkout.sessions(createCheckoutSessionRequest); - } - @Override public String getDeviceFingerprintUrl() { DateFormat df = new SimpleDateFormat("yyyyMMdd"); diff --git a/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java b/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java index bcede4ef..b6275eac 100644 --- a/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java +++ b/adyenwebcommons/src/com/adyen/commerce/controllerbase/PlaceOrderControllerBase.java @@ -76,13 +76,14 @@ public PlaceOrderResponse handleAdditionalDetails(final PaymentDetailsRequest pa public OCCPlaceOrderResponse handleAdditionalDetailsOCC(final PaymentDetailsRequest paymentDetailsRequest) { try { - OrderData orderData = getAdyenCheckoutApiFacade().placeOrderWithAdditionalDetails(paymentDetailsRequest); + OrderPaymentResult orderPaymentResult = getAdyenCheckoutApiFacade().placeOrderWithAdditionalDetails(paymentDetailsRequest); - String orderCode = getCheckoutCustomerStrategy().isAnonymousCheckout() ? orderData.getGuid() : orderData.getCode(); + String orderCode = getCheckoutCustomerStrategy().isAnonymousCheckout() ? orderPaymentResult.getOrderData().getGuid() : orderPaymentResult.getOrderData().getCode(); OCCPlaceOrderResponse placeOrderResponse = new OCCPlaceOrderResponse(); placeOrderResponse.setOrderNumber(orderCode); - placeOrderResponse.setOrderData(orderData); + placeOrderResponse.setOrderData(orderPaymentResult.getOrderData()); + placeOrderResponse.setPaymentDetailsResponse(orderPaymentResult.getPaymentDetailsResponse()); return placeOrderResponse; } catch (Exception e) { LOGGER.error("Exception", e); diff --git a/adyenwebcommons/src/com/adyen/commerce/response/PlaceOrderResponse.java b/adyenwebcommons/src/com/adyen/commerce/response/PlaceOrderResponse.java index c1cc0cc3..54531837 100644 --- a/adyenwebcommons/src/com/adyen/commerce/response/PlaceOrderResponse.java +++ b/adyenwebcommons/src/com/adyen/commerce/response/PlaceOrderResponse.java @@ -1,5 +1,6 @@ package com.adyen.commerce.response; +import com.adyen.model.checkout.PaymentDetailsResponse; import com.adyen.model.checkout.PaymentResponse; import com.adyen.model.checkout.PaymentResponseAction; @@ -9,6 +10,7 @@ public class PlaceOrderResponse { private boolean executeAction; private PaymentResponseAction paymentsAction; private PaymentResponse paymentsResponse; + private PaymentDetailsResponse paymentDetailsResponse; public String getOrderNumber() { return orderNumber; @@ -49,4 +51,12 @@ public PaymentResponse getPaymentsResponse() { public void setPaymentsResponse(PaymentResponse paymentsResponse) { this.paymentsResponse = paymentsResponse; } + + public PaymentDetailsResponse getPaymentDetailsResponse() { + return paymentDetailsResponse; + } + + public void setPaymentDetailsResponse(PaymentDetailsResponse paymentDetailsResponse) { + this.paymentDetailsResponse = paymentDetailsResponse; + } } From 18a29777dffda767cffea99bc15d33fa0a6ad5cf Mon Sep 17 00:00:00 2001 From: PJaneta Date: Mon, 13 Jan 2025 11:51:39 +0100 Subject: [PATCH 19/26] AD-334 Add Apple Pay Express Button with Frontend Logic and API Calls to CMS Components on PDP and Cart Pages - Spartacus - dfurl fix --- .../com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index d8badcba..51382beb 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -53,7 +53,6 @@ import com.adyen.v6.strategy.AdyenMerchantAccountStrategy; import com.adyen.v6.util.AmountUtil; import com.adyen.v6.util.TerminalAPIUtil; -import com.fasterxml.jackson.core.JsonProcessingException; import com.google.gson.Gson; import de.hybris.platform.commercefacades.i18n.I18NFacade; import de.hybris.platform.commercefacades.order.CheckoutFacade; @@ -1138,7 +1137,7 @@ protected void populateExpressCheckoutConfigModel(final Model model, final Expre model.addAttribute(MODEL_MERCHANT_ACCOUNT,expressCheckoutConfigDTO.getMerchantAccount()); model.addAttribute(MODEL_AMOUNT, expressCheckoutConfigDTO.getAmount()); model.addAttribute(MODEL_AMOUNT_DECIMAL, expressCheckoutConfigDTO.getAmountDecimal()); - model.addAttribute(MODEL_DF_URL, expressCheckoutConfigDTO.getExpressPaymentConfig()); + model.addAttribute(MODEL_DF_URL, expressCheckoutConfigDTO.getDfUrl()); model.addAttribute(MODEL_CHECKOUT_SHOPPER_HOST, expressCheckoutConfigDTO.getCheckoutShopperHost()); } From d8313a2a346d7d53234a5ed586c55b68a4a6c0e8 Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Mon, 13 Jan 2025 13:08:52 +0100 Subject: [PATCH 20/26] AD-390: Add amount to payment configuration in Payment component --- .../common/js/adyen-checkout/src/components/payment/Payment.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx index c6998b3e..e68ebddc 100644 --- a/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx +++ b/adyencheckoutaddonspa/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen-checkout/src/components/payment/Payment.tsx @@ -122,6 +122,7 @@ class Payment extends React.Component { environment: this.castToEnvironment(this.props.adyenConfig.environmentMode), clientKey: this.props.adyenConfig.adyenClientKey, countryCode: this.props.adyenConfig.countryCode, + amount: this.props.adyenConfig.amount, analytics: { enabled: false }, @@ -143,7 +144,6 @@ class Payment extends React.Component { hasHolderName: true, holderNameRequired: this.props.adyenConfig.cardHolderNameRequired, enableStoreDetails: this.props.adyenConfig.showRememberTheseDetails, - amount: this.props.adyenConfig.amount, clickToPayConfiguration: { merchantDisplayName: this.props.adyenConfig.merchantDisplayName, shopperEmail: this.props.adyenConfig.shopperEmail, From 8a11e2a6e63de55754e367bf693ab82b65f872a8 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Tue, 14 Jan 2025 13:30:46 +0100 Subject: [PATCH 21/26] AD-394 Doubled shipment price on the express checkout on the cart --- .../controllers/PaymentMethodsController.java | 7 +++++- ...artExpressCheckoutComponentController.java | 5 ---- .../adyen/v6/facades/AdyenCheckoutFacade.java | 4 ++-- .../facades/AdyenExpressCheckoutFacade.java | 3 --- .../impl/DefaultAdyenCheckoutFacade.java | 16 +++++++++++-- .../DefaultAdyenExpressCheckoutFacade.java | 13 ---------- ...DefaultAdyenExpressCheckoutFacadeTest.java | 24 ------------------- 7 files changed, 22 insertions(+), 50 deletions(-) diff --git a/adyenocc/src/com/adyen/commerce/controllers/PaymentMethodsController.java b/adyenocc/src/com/adyen/commerce/controllers/PaymentMethodsController.java index fb3eff4f..0106e246 100644 --- a/adyenocc/src/com/adyen/commerce/controllers/PaymentMethodsController.java +++ b/adyenocc/src/com/adyen/commerce/controllers/PaymentMethodsController.java @@ -6,10 +6,12 @@ import com.adyen.commerce.constants.AdyenoccConstants; import com.adyen.service.exception.ApiException; import com.adyen.v6.facades.AdyenCheckoutFacade; +import com.adyen.v6.facades.AdyenExpressCheckoutFacade; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import de.hybris.platform.commerceservices.request.mapping.annotation.ApiVersion; +import de.hybris.platform.order.exceptions.CalculationException; import de.hybris.platform.webservicescommons.swagger.ApiBaseSiteIdAndUserIdParam; import de.hybris.platform.webservicescommons.swagger.ApiBaseSiteIdUserIdAndCartIdParam; import io.swagger.v3.oas.annotations.Operation; @@ -36,6 +38,9 @@ public class PaymentMethodsController @Autowired private AdyenCheckoutFacade adyenCheckoutFacade; + @Autowired + private AdyenExpressCheckoutFacade adyenExpressCheckoutFacade; + @Secured({ "ROLE_CUSTOMERGROUP", "ROLE_TRUSTED_CLIENT", "ROLE_CUSTOMERMANAGERGROUP" }) @GetMapping(value = AdyenoccConstants.ADYEN_USER_CART_PREFIX + "/checkout-configuration") @Operation(operationId = "getCheckoutConfiguration", summary = "Get checkout configuration", description = @@ -61,7 +66,7 @@ public ResponseEntity getExpressPDPCheckoutConfiguration(@PathVariable S @Operation(operationId = "getExpressCartCheckoutConfiguration", summary = "Get express cart page checkout configuration", description = "Returns configuration for express payments on cart") @ApiBaseSiteIdUserIdAndCartIdParam - public ResponseEntity getExpressCartCheckoutConfiguration() throws ApiException, JsonProcessingException { + public ResponseEntity getExpressCartCheckoutConfiguration() throws ApiException, JsonProcessingException, CalculationException { String response = objectMapper.writeValueAsString(adyenCheckoutFacade.initializeExpressCheckoutCartPageDataOCC()); return ResponseEntity.ok().body(response); } diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java index 4e184096..5c31c7ef 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java @@ -2,7 +2,6 @@ import com.adyen.service.exception.ApiException; import com.adyen.v6.facades.AdyenCheckoutFacade; -import com.adyen.v6.facades.AdyenExpressCheckoutFacade; import com.adyen.v6.model.contents.components.AdyenAccExpressCheckoutCartPageComponentModel; import de.hybris.platform.addonsupport.controllers.cms.AbstractCMSAddOnComponentController; import de.hybris.platform.order.exceptions.CalculationException; @@ -20,13 +19,9 @@ public class AdyenAccCartExpressCheckoutComponentController extends AbstractCMSA @Autowired private AdyenCheckoutFacade adyenCheckoutFacade; - @Autowired - private AdyenExpressCheckoutFacade adyenExpressCheckoutFacade; - @Override protected void fillModel(final HttpServletRequest request, final Model model, final AdyenAccExpressCheckoutCartPageComponentModel component) { try { - adyenExpressCheckoutFacade.removeDeliveryModeFromSessionCart(); adyenCheckoutFacade.initializeExpressCheckoutCartPageData(model); } catch (ApiException | CalculationException e) { throw new RuntimeException(e); diff --git a/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java index e5a7c389..a8cade57 100644 --- a/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java @@ -142,11 +142,11 @@ public interface AdyenCheckoutFacade { void initializeSummaryData(Model model) throws ApiException; - void initializeExpressCheckoutCartPageData(Model model) throws ApiException; + void initializeExpressCheckoutCartPageData(Model model) throws ApiException, CalculationException; void initializeExpressCheckoutPDPData(Model model, String productCode) throws ApiException; - ExpressCheckoutConfigDTO initializeExpressCheckoutCartPageDataOCC() throws ApiException; + ExpressCheckoutConfigDTO initializeExpressCheckoutCartPageDataOCC() throws ApiException, CalculationException; ExpressCheckoutConfigDTO initializeExpressCheckoutPDPDataOCC(String productCode) throws ApiException; diff --git a/adyenv6core/src/com/adyen/v6/facades/AdyenExpressCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/AdyenExpressCheckoutFacade.java index 2cbd6a3d..8f5975d4 100644 --- a/adyenv6core/src/com/adyen/v6/facades/AdyenExpressCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/AdyenExpressCheckoutFacade.java @@ -5,7 +5,6 @@ import de.hybris.platform.commercefacades.order.data.OrderData; import de.hybris.platform.commercefacades.user.data.AddressData; import de.hybris.platform.deliveryzone.model.ZoneDeliveryModeValueModel; -import de.hybris.platform.order.exceptions.CalculationException; import javax.servlet.http.HttpServletRequest; import java.util.Optional; @@ -26,6 +25,4 @@ OrderData expressCheckoutCartOCC(PaymentRequest paymentRequest, String paymentMe Optional getExpressDeliveryModePrice(); - void removeDeliveryModeFromSessionCart() throws CalculationException; - } diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index 51382beb..c15773dd 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -1040,7 +1040,7 @@ public void initializeSummaryData(Model model) throws ApiException { model.addAttribute(LOCALE, gson.toJson(setLocale(cartData.getAdyenAmazonPayConfiguration(), shopperLocale))); } - public void initializeExpressCheckoutCartPageData(Model model) throws ApiException { + public void initializeExpressCheckoutCartPageData(Model model) throws ApiException, CalculationException { ExpressCheckoutConfigDTO expressCheckoutConfigDTO = initializeExpressCheckoutCartPageDataOCC(); populateExpressCheckoutConfigModel(model, expressCheckoutConfigDTO); } @@ -1050,7 +1050,9 @@ public void initializeExpressCheckoutPDPData(Model model, String productCode) th populateExpressCheckoutConfigModel(model, expressCheckoutConfigDTO); } - public ExpressCheckoutConfigDTO initializeExpressCheckoutCartPageDataOCC() throws ApiException { + public ExpressCheckoutConfigDTO initializeExpressCheckoutCartPageDataOCC() throws ApiException, CalculationException { + removeDeliveryModeFromSessionCart(); + final CartData cartData = getCheckoutFacade().getCheckoutCart(); if (cartData != null && cartData.getTotalPriceWithTax() != null && cartData.getTotalPriceWithTax().getCurrencyIso() != null) { final String currencyIso = cartData.getTotalPriceWithTax().getCurrencyIso(); @@ -1141,6 +1143,16 @@ protected void populateExpressCheckoutConfigModel(final Model model, final Expre model.addAttribute(MODEL_CHECKOUT_SHOPPER_HOST, expressCheckoutConfigDTO.getCheckoutShopperHost()); } + protected void removeDeliveryModeFromSessionCart() throws CalculationException { + if (cartService.hasSessionCart()) { + CartModel sessionCart = cartService.getSessionCart(); + sessionCart.setDeliveryMode(null); + modelService.save(sessionCart); + + calculationService.recalculate(sessionCart); + } + } + protected BigDecimal getExpressDeliveryModeValue(final String currencyIso) { Optional expressDeliveryModePrice = adyenExpressCheckoutFacade.getExpressDeliveryModePrice(); diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java index 5f818831..c9c05fdd 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java @@ -30,7 +30,6 @@ import de.hybris.platform.order.CartService; import de.hybris.platform.order.DeliveryModeService; import de.hybris.platform.order.InvalidCartException; -import de.hybris.platform.order.exceptions.CalculationException; import de.hybris.platform.product.ProductService; import de.hybris.platform.servicelayer.dto.converter.Converter; import de.hybris.platform.servicelayer.i18n.CommonI18NService; @@ -301,18 +300,6 @@ protected OrderData expressCartCheckoutOCC(PaymentRequest paymentRequest, Addres } } - public void removeDeliveryModeFromSessionCart() throws CalculationException { - if (cartService.hasSessionCart()) { - CartModel sessionCart = cartService.getSessionCart(); - sessionCart.setDeliveryMode(null); - modelService.save(sessionCart); - - CommerceCartParameter commerceCartParameter = new CommerceCartParameter(); - commerceCartParameter.setCart(sessionCart); - commerceCartService.recalculateCart(commerceCartParameter); - } - } - protected void prepareCart(CartModel cart, DeliveryModeModel deliveryMode, AddressModel addressModel, PaymentInfoModel paymentInfo) { cart.setDeliveryMode(deliveryMode); cart.setDeliveryAddress(addressModel); diff --git a/adyenv6core/testsrc/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacadeTest.java b/adyenv6core/testsrc/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacadeTest.java index e5c51315..8a613948 100644 --- a/adyenv6core/testsrc/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacadeTest.java +++ b/adyenv6core/testsrc/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacadeTest.java @@ -30,7 +30,6 @@ import de.hybris.platform.order.CartFactory; import de.hybris.platform.order.CartService; import de.hybris.platform.order.DeliveryModeService; -import de.hybris.platform.order.exceptions.CalculationException; import de.hybris.platform.product.ProductService; import de.hybris.platform.servicelayer.dto.converter.Converter; import de.hybris.platform.servicelayer.i18n.CommonI18NService; @@ -339,29 +338,6 @@ public void expressCheckoutCartOCCNullPaymentMethod() throws Exception { defaultAdyenExpressCheckoutFacade.expressCheckoutCartOCC(paymentRequest, paymentMethod, addressData, request); } - @Test - public void removeDeliveryModeFromSessionCart() throws CalculationException { - //given - CartModel cartModel = new CartModel(); - DeliveryModeModel deliveryModeModel = new DeliveryModeModel(); - cartModel.setDeliveryMode(deliveryModeModel); - - when(cartService.getSessionCart()).thenReturn(cartModel); - when(cartService.hasSessionCart()).thenReturn(true); - - ArgumentCaptor cartCaptor = ArgumentCaptor.forClass(CartModel.class); - - //when - defaultAdyenExpressCheckoutFacade.removeDeliveryModeFromSessionCart(); - - //then - verify(modelService).save(cartCaptor.capture()); - CartModel capturedCart = cartCaptor.getValue(); - assertNull(capturedCart.getDeliveryMode()); - - verify(commerceCartService).recalculateCart((CommerceCartParameter) any()); - } - @Test public void prepareCart() { //given From e073ff9698f1d36f715d598d8314fc89cc1a0692 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Wed, 15 Jan 2025 12:42:59 +0100 Subject: [PATCH 22/26] AD-395 Intermittent Google Pay Error Message Followed by Successful Order Placement --- .../webroot/_ui/responsive/common/js/adyen_express_checkout.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js index df94ecc9..d187e2c2 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js @@ -198,6 +198,9 @@ var AdyenExpressCheckoutHybris = (function () { // Step 7: Configure the callback to get the shopper's information. + onSubmit: (state, element, actions) => { + actions.resolve(); + }, onAuthorized: (paymentData, actions) => { this.makePayment(this.prepareDataGoogle(paymentData), this.getGoogleUrl(), actions.resolve, actions.reject) }, From de592de851d60b10cd205b8b0eeb92ac1d3020c3 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Thu, 16 Jan 2025 10:10:22 +0100 Subject: [PATCH 23/26] AD-395 Intermittent Google Pay Error Message Followed by Successful Order Placement --- .../_ui/responsive/common/js/adyen_express_checkout.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js index d187e2c2..b0910cbe 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js @@ -230,7 +230,9 @@ var AdyenExpressCheckoutHybris = (function () { success: function (response) { try { if (response.resultCode && (response.resultCode === 'Authorised' || response.resultCode === 'RedirectShopper')) { - resolve(); + resolve({ + resultCode: response.resultCode + }); AdyenExpressCheckoutHybris.handleResult(response, false); } else { reject(); From 67d0210fa4ab6fbd35d94661730226421af17365 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Thu, 16 Jan 2025 12:20:04 +0100 Subject: [PATCH 24/26] AD-395 Intermittent Google Pay Error Message Followed by Successful Order Placement --- .../_ui/responsive/common/js/adyen_express_checkout.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js index b0910cbe..de8c6a1f 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js @@ -115,6 +115,8 @@ var AdyenExpressCheckoutHybris = (function () { const googlePayNodes = document.getElementsByClassName('adyen-google-pay-button'); + let paymentData; + const googlePayConfig = { // Step 2: Set the callback intents. @@ -199,11 +201,12 @@ var AdyenExpressCheckoutHybris = (function () { // Step 7: Configure the callback to get the shopper's information. onSubmit: (state, element, actions) => { - actions.resolve(); - }, - onAuthorized: (paymentData, actions) => { this.makePayment(this.prepareDataGoogle(paymentData), this.getGoogleUrl(), actions.resolve, actions.reject) }, + onAuthorized: (data, actions) => { + paymentData = data; + actions.resolve(); + }, onError: function (error) { console.log(error) } From b5470a2b2488f6f3640fe6c54ddc1d21c7719558 Mon Sep 17 00:00:00 2001 From: PJaneta Date: Fri, 17 Jan 2025 15:24:03 +0100 Subject: [PATCH 25/26] AD-334 Add Apple Pay Express Button with Frontend Logic and API Calls to CMS Components on PDP and Cart Pages - Spartacus - wrong price calculation fix --- adyenv6core/resources/adyenv6core-spring.xml | 1 + .../v6/facades/impl/DefaultAdyenCheckoutFacade.java | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/adyenv6core/resources/adyenv6core-spring.xml b/adyenv6core/resources/adyenv6core-spring.xml index f1e603c1..d4e3d152 100644 --- a/adyenv6core/resources/adyenv6core-spring.xml +++ b/adyenv6core/resources/adyenv6core-spring.xml @@ -237,6 +237,7 @@ + diff --git a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java index c15773dd..aecbf0ff 100644 --- a/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java +++ b/adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java @@ -66,6 +66,8 @@ import de.hybris.platform.commercefacades.user.data.AddressData; import de.hybris.platform.commercefacades.user.data.CountryData; import de.hybris.platform.commercefacades.user.data.RegionData; +import de.hybris.platform.commerceservices.order.CommerceCartService; +import de.hybris.platform.commerceservices.service.data.CommerceCartParameter; import de.hybris.platform.commerceservices.strategies.CheckoutCustomerStrategy; import de.hybris.platform.commercewebservicescommons.dto.order.PaymentDetailsWsDTO; import de.hybris.platform.converters.Populator; @@ -165,6 +167,7 @@ public class DefaultAdyenCheckoutFacade implements AdyenCheckoutFacade { private AdyenMerchantAccountStrategy adyenMerchantAccountStrategy; private AdyenOrderFacade adyenOrderFacade; private ProductFacade productFacade; + private CommerceCartService commerceCartService; public static final Logger LOGGER = Logger.getLogger(DefaultAdyenCheckoutFacade.class); @@ -1149,7 +1152,9 @@ protected void removeDeliveryModeFromSessionCart() throws CalculationException { sessionCart.setDeliveryMode(null); modelService.save(sessionCart); - calculationService.recalculate(sessionCart); + CommerceCartParameter commerceCartParameter = new CommerceCartParameter(); + commerceCartParameter.setCart(sessionCart); + commerceCartService.recalculateCart(commerceCartParameter); } } @@ -1975,4 +1980,8 @@ public void setAdyenOrderFacade(AdyenOrderFacade adyenOrderFacade) { public void setProductFacade(ProductFacade productFacade) { this.productFacade = productFacade; } + + public void setCommerceCartService(CommerceCartService commerceCartService) { + this.commerceCartService = commerceCartService; + } } From 538829256131468bac413564f04ba7b9834c26f2 Mon Sep 17 00:00:00 2001 From: kpieloch <113994423+kpieloch@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:03:10 +0100 Subject: [PATCH 26/26] AD-390: Refactor stored card initialization. Update the list of components with pay button support to include Trustly, Swish, and Twint. --- .../WEB-INF/tags/responsive/checkoutOrderSummary.tag | 2 +- .../responsive/common/js/adyen_component_factory.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) 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 7a0e38d9..c95b47f3 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/checkoutOrderSummary.tag +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/checkoutOrderSummary.tag @@ -11,7 +11,7 @@ + value="[amazonpay],[applepay],[paypal],[paywithgoogle],[googlepay],[pix],[bcmc_mobile],[upi],[paysafecard],[klarna],[ideal],[trustly],[swish],[twint]"/> <%-- Components --%> diff --git a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_component_factory.js b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_component_factory.js index 4e1cf2f4..a3fb7e64 100644 --- a/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_component_factory.js +++ b/adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_component_factory.js @@ -76,10 +76,7 @@ class PaymentComponentFactory { if (storedCardList && storedCardList.length) { for (const storedCard of storedCardList) { const oneClickCardNode = document.getElementById("one-click-card_" + storedCard.storedPaymentMethodId); - const oneClickCard = new AdyenWeb.Card(this.checkout, { - showPayButton: false, - storedPaymentMethods: storedCard, - }).mount(oneClickCardNode); + const oneClickCard = new AdyenWeb.Card(this.checkout, {...storedCard, showPayButton: false}).mount(oneClickCardNode); this.helper.oneClickCards[storedCard.storedPaymentMethodId] = oneClickCard; } } @@ -581,7 +578,10 @@ class PaymentComponentFactory { return; } this.helper.makePayment(state.data, component, this.helper.handleResult); - } + }, + onAdditionalDetails: (state, component) => { + this.helper.submitDetails(state.data, this.helper.handleResult); + }, }).mount('#adyen-component-button-container-' + paymentMethod.label); }