Skip to content

Commit

Permalink
Merge branch 'develop' into feature/AD-337
Browse files Browse the repository at this point in the history
# Conflicts:
#	adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccCartExpressCheckoutComponentController.java
#	adyenv6b2ccheckoutaddon/acceleratoraddon/web/src/com/adyen/v6/controllers/cms/AdyenAccProductExpressCheckoutComponentController.java
#	adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/WEB-INF/tags/responsive/expressCheckoutConfig.tag
#	adyenv6b2ccheckoutaddon/acceleratoraddon/web/webroot/_ui/responsive/common/js/adyen_express_checkout.js
#	adyenv6core/src/com/adyen/v6/facades/AdyenCheckoutFacade.java
#	adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenCheckoutFacade.java
#	adyenv6core/src/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacade.java
#	adyenv6core/testsrc/com/adyen/v6/facades/impl/DefaultAdyenExpressCheckoutFacadeTest.java
  • Loading branch information
pjaneta committed Jan 28, 2025
2 parents 3e87bda + 30224ce commit 447c176
Show file tree
Hide file tree
Showing 44 changed files with 597 additions and 457 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -21,7 +21,14 @@ 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 {
AdditionalDetailsActions,
CardConfiguration,
CoreConfiguration,
SubmitActions,
UIElement
} from "@adyen/adyen-web";
import {adyenConfigInitialState} from "../../reducers/adyenConfigReducer";

interface State {
useDifferentBillingAddress: boolean
Expand Down Expand Up @@ -55,6 +62,7 @@ interface DispatchProps {
setPostCode: (postCode: string) => void
setPhoneNumber: (phoneNumber: string) => void
setSelectedAddress: (address: AddressModel) => void
removeAdyenConfigFromStore: () => void
}

type Props = StoreProps & DispatchProps & ComponentProps
Expand Down Expand Up @@ -94,6 +102,10 @@ class Payment extends React.Component<Props, State> {
}
}

componentWillUnmount() {
this.props.removeAdyenConfigFromStore();
}

private async initializeWebComponentsCheckout() {
let adyenCheckout = await AdyenCheckout(this.getAdyenCheckoutConfig());

Expand All @@ -110,10 +122,7 @@ class Payment extends React.Component<Props, State> {
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
},
amount: this.props.adyenConfig.amount,
analytics: {
enabled: false
},
Expand All @@ -124,8 +133,8 @@ class Payment extends React.Component<Props, State> {
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)
}
}

Expand All @@ -137,7 +146,8 @@ class Payment extends React.Component<Props, State> {
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,
}
}
}
Expand Down Expand Up @@ -175,22 +185,22 @@ class Payment extends React.Component<Props, State> {
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<void | PlaceOrderResponse>) {
private async handleResponse(response: Promise<void | PlaceOrderResponse>, actions: SubmitActions) {
this.setState({errorFieldCodes: []})

let responseData = await response;
Expand All @@ -199,6 +209,9 @@ class Payment extends React.Component<Props, State> {
if (responseData.executeAction) {
this.dropIn.handleAction(responseData.paymentsAction)
} else {
actions.resolve({
resultCode: responseData.paymentsResponse.resultCode
});
this.setState({orderNumber: responseData.orderNumber})
this.setState({redirectToNextStep: true})
}
Expand All @@ -210,12 +223,12 @@ class Payment extends React.Component<Props, State> {
}
}

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() {
Expand Down Expand Up @@ -335,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}))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ export const adyenConfigInitialState : AdyenConfigData = {
immediateCapture: false,
openInvoiceMethods: [],
selectedPaymentMethod: "",
sessionData: undefined,
shopperLocale: "",
showBoleto: false,
showComboCard: false,
Expand All @@ -29,6 +28,7 @@ export const adyenConfigInitialState : AdyenConfigData = {
storedPaymentMethodList: [],
merchantDisplayName: "",
shopperEmail: "",
clickToPayLocale: "",
}

export function adyenConfigReducer(adyenConfig: AdyenConfigData, action: RootAction): AdyenConfigData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@ 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";

export interface PlaceOrderResponse {
success: boolean,
executeAction?: boolean,
paymentsAction?: PaymentAction,
paymentsResponse?: PaymentResponseData,
paymentDetailsResponse?: PaymentResponseData,
error?: string,
errorFieldCodes?: string[]
orderNumber?: string
Expand All @@ -30,7 +32,8 @@ export class PaymentService {
success: true,
executeAction: placeOrderData.executeAction,
paymentsAction: placeOrderData.paymentsAction,
orderNumber: placeOrderData.orderNumber
orderNumber: placeOrderData.orderNumber,
paymentsResponse: placeOrderData.paymentsResponse
}
})
.catch((errorResponse: AxiosError<ErrorResponse>): PlaceOrderResponse | void => {
Expand Down Expand Up @@ -59,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<ErrorResponse>): PlaceOrderResponse | void => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ export interface AdyenConfigData {
adyenClientKey: string;
adyenPaypalMerchantId: string;
deviceFingerPrintUrl: string;
sessionData: SessionData;
selectedPaymentMethod: string;
showRememberTheseDetails: boolean;
checkoutShopperHost: string;
Expand All @@ -28,11 +27,7 @@ export interface AdyenConfigData {
sepaDirectDebit: boolean;
merchantDisplayName: string,
shopperEmail: string,
}

interface SessionData {
id: string,
sessionData: string
clickToPayLocale: string,
}

interface StoredPaymentMethodData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,25 @@

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.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;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.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
Expand All @@ -37,13 +38,36 @@ public class PaymentMethodsController
@Autowired
private AdyenCheckoutFacade adyenCheckoutFacade;

@Autowired
private AdyenExpressCheckoutFacade adyenExpressCheckoutFacade;

@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
public ResponseEntity<String> getCheckoutConfiguration() throws ApiException, JsonProcessingException {
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<String> 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<String> getExpressCartCheckoutConfiguration() throws ApiException, JsonProcessingException, CalculationException {
String response = objectMapper.writeValueAsString(adyenCheckoutFacade.initializeExpressCheckoutCartPageDataOCC());
return ResponseEntity.ok().body(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,14 +19,10 @@ 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.initializeExpressCartPageData(model);
adyenCheckoutFacade.initializeExpressCheckoutCartPageData(model);
} catch (ApiException | CalculationException e) {
throw new RuntimeException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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.initializeExpressPDPData(model, productData);
adyenCheckoutFacade.initializeExpressCheckoutPDPData(model, requestContextData.getProduct().getCode());
} catch (ApiException e) {
throw new RuntimeException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<spring:url value="/checkout/multi/termsAndConditions" var="getTermsAndConditionsUrl"/>

<c:set var="componentsWithPayButton"
value="[amazonpay],[applepay],[paypal],[paywithgoogle],[googlepay],[pix],[bcmc_mobile],[upi],[paysafecard]"/>
value="[amazonpay],[applepay],[paypal],[paywithgoogle],[googlepay],[pix],[bcmc_mobile],[upi],[paysafecard],[klarna],[ideal],[trustly],[swish],[twint]"/>
<c:set var="componentPaymentMethod" value="[${selectedPaymentMethod}]" />

<%-- Components --%>
Expand All @@ -29,7 +29,6 @@
</div>
</c:if>
</div>

<c:choose>
<c:when test="${componentPaymentMethod eq '[pix]' || componentPaymentMethod eq '[bcmc_mobile]'}">
<%-- Render QR code --%>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,21 @@
label: ['visible-xs', 'hidden-xs'],
pageType: '${pageType}',
productCode: '${product.code}',
applePayMerchantName: '${applePayMerchantName}',
applePayMerchantId: '${applePayMerchantIdentifier}',
payPalIntent: '${paypalIntent}',
payPalExpressEnabledOnProduct: ${expressPaymentConfig.paypalExpressEnabledOnProduct},
payPalExpressEnabledOnCart: ${expressPaymentConfig.paypalExpressEnabledOnCart},
googlePayExpressEnabledOnCart: ${expressPaymentConfig.googlePayExpressEnabledOnCart},
applePayExpressEnabledOnCart: ${expressPaymentConfig.applePayExpressEnabledOnCart},
googlePayExpressEnabledOnProduct: ${expressPaymentConfig.googlePayExpressEnabledOnProduct},
applePayExpressEnabledOnProduct: ${expressPaymentConfig.applePayExpressEnabledOnProduct},
}
var checkoutConfig = {
shopperLocale: '${shopperLocale}',
environment: '${environmentMode}',
clientKey: '${clientKey}',
countryCode: 'US',
googlePayExpressEnabledOnCart: ${expressPaymentConfig.googlePayExpressEnabledOnCart},
applePayExpressEnabledOnCart: ${expressPaymentConfig.applePayExpressEnabledOnCart},
googlePayExpressEnabledOnProduct: ${expressPaymentConfig.googlePayExpressEnabledOnProduct},
applePayExpressEnabledOnProduct: ${expressPaymentConfig.applePayExpressEnabledOnProduct},
countryCode: 'US'
}
window.onload = function() {
Expand Down
Loading

0 comments on commit 447c176

Please sign in to comment.