From 3a2cfd0ef4e89d6635e2ad1f4dc629b47704cf34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Klatt?= Date: Wed, 2 Oct 2024 16:46:42 +0200 Subject: [PATCH] ACP-3507 the APIs to enable projects embed payment elements to headless frontends (#11043) ACP-3507 Investigate how the APIs to Enable Projects embed Payment Elements to Yves or in Headless Scenario should be built --- composer.json | 1 + phpstan.neon | 2 +- resources/api/asyncapi/payment.yml | 23 + src/Spryker/Client/Payment/PaymentClient.php | 35 +- .../Client/Payment/PaymentClientInterface.php | 45 +- .../Client/Payment/Zed/PaymentStub.php | 37 +- .../Payment/Zed/PaymentStubInterface.php | 23 +- .../Payment/Transfer/payment.transfer.xml | 52 +- .../Authorizer/ForeignPaymentAuthorizer.php | 348 ----------- .../ForeignPaymentAuthorizerInterface.php | 25 - .../Business/Exception/PaymentException.php | 14 + .../Exception/PaymentMethodException.php | 12 + .../PaymentMethodMessageConsumeException.php | 12 + .../Exception/PreOrderPaymentException.php | 12 + .../ForeignPayment/ForeignPayment.php | 567 ++++++++++++++++++ .../ForeignPaymentInterface.php | 53 ++ .../Mapper/PaymentMethodEventMapper.php | 20 + .../PaymentMethodEventMapperInterface.php | 12 + .../Business/Mapper/QuoteDataMapper.php | 4 + .../PaymentMessageConsumer.php | 81 +++ .../PaymentMessageConsumerInterface.php | 20 + .../Business/Method/PaymentMethodReader.php | 4 +- .../Business/Method/PaymentMethodUpdater.php | 63 +- .../Method/PaymentMethodUpdaterInterface.php | 9 +- .../Business/PaymentBusinessFactory.php | 100 +-- .../Zed/Payment/Business/PaymentFacade.php | 72 ++- .../Business/PaymentFacadeInterface.php | 79 ++- .../Controller/GatewayController.php | 27 +- ...mPreOrderPaymentCheckoutPostSavePlugin.php | 41 ++ .../PaymentMethodMessageHandlerPlugin.php | 36 +- .../Facade/PaymentToKernelAppFacadeBridge.php | 37 ++ .../PaymentToKernelAppFacadeInterface.php | 21 + .../PaymentToUtilEncodingServiceBridge.php | 49 ++ .../PaymentToUtilEncodingServiceInterface.php | 30 + src/Spryker/Zed/Payment/PaymentConfig.php | 20 + .../Zed/Payment/PaymentDependencyProvider.php | 49 ++ .../Payment/Persistence/PaymentRepository.php | 6 + .../_support/Helper/PaymentDataHelper.php | 52 +- .../PaymentFacadeForeignPaymentTest.php | 73 +++ .../Business/Facade/PaymentFacadeTest.php | 94 +-- .../_support/PaymentBusinessTester.php | 2 - 41 files changed, 1717 insertions(+), 545 deletions(-) delete mode 100644 src/Spryker/Zed/Payment/Business/Authorizer/ForeignPaymentAuthorizer.php delete mode 100644 src/Spryker/Zed/Payment/Business/Authorizer/ForeignPaymentAuthorizerInterface.php create mode 100644 src/Spryker/Zed/Payment/Business/Exception/PaymentException.php create mode 100644 src/Spryker/Zed/Payment/Business/Exception/PaymentMethodException.php create mode 100644 src/Spryker/Zed/Payment/Business/Exception/PaymentMethodMessageConsumeException.php create mode 100644 src/Spryker/Zed/Payment/Business/Exception/PreOrderPaymentException.php create mode 100644 src/Spryker/Zed/Payment/Business/ForeignPayment/ForeignPayment.php create mode 100644 src/Spryker/Zed/Payment/Business/ForeignPayment/ForeignPaymentInterface.php create mode 100644 src/Spryker/Zed/Payment/Business/MessageConsumer/PaymentMessageConsumer.php create mode 100644 src/Spryker/Zed/Payment/Business/MessageConsumer/PaymentMessageConsumerInterface.php create mode 100644 src/Spryker/Zed/Payment/Communication/Plugin/Checkout/PaymentConfirmPreOrderPaymentCheckoutPostSavePlugin.php create mode 100644 src/Spryker/Zed/Payment/Dependency/Facade/PaymentToKernelAppFacadeBridge.php create mode 100644 src/Spryker/Zed/Payment/Dependency/Facade/PaymentToKernelAppFacadeInterface.php create mode 100644 src/Spryker/Zed/Payment/Dependency/Service/PaymentToUtilEncodingServiceBridge.php create mode 100644 src/Spryker/Zed/Payment/Dependency/Service/PaymentToUtilEncodingServiceInterface.php create mode 100644 tests/SprykerTest/Zed/Payment/Business/Facade/PaymentFacadeForeignPaymentTest.php diff --git a/composer.json b/composer.json index ff867c2..8684280 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "spryker/checkout-extension": "^1.2.0", "spryker/guzzle": "^2.2.0", "spryker/kernel": "^3.30.0", + "spryker/kernel-app": "^1.0.0", "spryker/locale": "^3.0.0 || ^4.0.0", "spryker/log": "^3.0.0", "spryker/message-broker": "^1.0.0", diff --git a/phpstan.neon b/phpstan.neon index 00b6b7b..5db784f 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -2,7 +2,7 @@ parameters: level: 7 checkMissingIterableValueType: false ignoreErrors: - - '#Call to an undefined method Orm\\.+\\SpyWishlistQuery::groupByIdPaymentProvider\(\)#' + - '#Call to an undefined method .+Query::groupByIdPaymentProvider\(\)#' - '#Call to an undefined method Spryker\\Shared\\Kernel\\Transfer\\AbstractTransfer::toArrayNotRecursiveCamelCased\(\)\.#' - '#Method .+PaymentToUtilEncodingServiceBridge::decodeJson\(\) should return array\|null but returns array\|object\|null\.#' - '#Call to an undefined method Spryker\\Shared\\Kernel\\Transfer\\TransferInterface::*.#' diff --git a/resources/api/asyncapi/payment.yml b/resources/api/asyncapi/payment.yml index 2c868b5..e1d784e 100644 --- a/resources/api/asyncapi/payment.yml +++ b/resources/api/asyncapi/payment.yml @@ -29,6 +29,7 @@ channels: message: oneOf: - $ref: '#/components/messages/AddPaymentMethod' + - $ref: '#/components/messages/UpdatePaymentMethod' - $ref: '#/components/messages/DeletePaymentMethod' # Deprecated messages @@ -46,6 +47,15 @@ components: $ref: '#/components/schemas/PaymentMethodPayload' headers: $ref: '#/components/schemas/message-broker/components/schemas/headers' + UpdatePaymentMethod: + name: UpdatePaymentMethod + x-spryker: + module: Payment + summary: 'Handle an updated Payment method.' + payload: + $ref: '#/components/schemas/PaymentMethodPayload' + headers: + $ref: '#/components/schemas/message-broker/components/schemas/headers' DeletePaymentMethod: name: DeletePaymentMethod x-spryker: @@ -237,6 +247,19 @@ components: example: - /authorization - /transfer + checkoutConfiguration: + type: object + description: 'Optional configuration for sophisticated payment methods that support e.g. CheckoutSession or Embedded payment forms.' + properties: + strategy: + type: string + examples: + - embedded + - checkout-session + scripts: + type: array + description: 'List of scripts that should be included in the checkout page.' + PaymentPayload: type: object properties: diff --git a/src/Spryker/Client/Payment/PaymentClient.php b/src/Spryker/Client/Payment/PaymentClient.php index 1be3bcb..e2cdefe 100644 --- a/src/Spryker/Client/Payment/PaymentClient.php +++ b/src/Spryker/Client/Payment/PaymentClient.php @@ -9,6 +9,9 @@ use Generated\Shared\Transfer\PaymentAuthorizeRequestTransfer; use Generated\Shared\Transfer\PaymentAuthorizeResponseTransfer; +use Generated\Shared\Transfer\PaymentMethodsTransfer; +use Generated\Shared\Transfer\PreOrderPaymentRequestTransfer; +use Generated\Shared\Transfer\PreOrderPaymentResponseTransfer; use Generated\Shared\Transfer\QuoteTransfer; use Spryker\Client\Kernel\AbstractClient; @@ -34,6 +37,36 @@ public function authorizeForeignPayment( ->authorizeForeignPayment($paymentAuthorizeRequestTransfer); } + /** + * {@inheritDoc} + * + * @api + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function initializePreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + return $this->getFactory()->createZedStub()->initializePreOrderPayment($preOrderPaymentRequestTransfer); + } + + /** + * {@inheritDoc} + * + * @api + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function cancelPreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + return $this->getFactory()->createZedStub()->cancelPreOrderPayment($preOrderPaymentRequestTransfer); + } + /** * {@inheritDoc} * @@ -43,7 +76,7 @@ public function authorizeForeignPayment( * * @return \Generated\Shared\Transfer\PaymentMethodsTransfer */ - public function getAvailableMethods(QuoteTransfer $quoteTransfer) + public function getAvailableMethods(QuoteTransfer $quoteTransfer): PaymentMethodsTransfer { return $this->getFactory()->createZedStub()->getAvailableMethods($quoteTransfer); } diff --git a/src/Spryker/Client/Payment/PaymentClientInterface.php b/src/Spryker/Client/Payment/PaymentClientInterface.php index dc2f408..686fecc 100644 --- a/src/Spryker/Client/Payment/PaymentClientInterface.php +++ b/src/Spryker/Client/Payment/PaymentClientInterface.php @@ -9,6 +9,9 @@ use Generated\Shared\Transfer\PaymentAuthorizeRequestTransfer; use Generated\Shared\Transfer\PaymentAuthorizeResponseTransfer; +use Generated\Shared\Transfer\PaymentMethodsTransfer; +use Generated\Shared\Transfer\PreOrderPaymentRequestTransfer; +use Generated\Shared\Transfer\PreOrderPaymentResponseTransfer; use Generated\Shared\Transfer\QuoteTransfer; interface PaymentClientInterface @@ -16,7 +19,7 @@ interface PaymentClientInterface /** * Specification: * - Makes a request from given PaymentAuthorizeRequestTransfer. - * - Adds `Authorization` header to request using `PaymentAuthorizeRequest.authorizaton` if exists. + * - Adds `Authorization` header to request using `PaymentAuthorizeRequest.authorization` if exists. * - Adds `X-Store-Reference` header to request using `PaymentAuthorizeRequest.storeReference` if exists. * - Adds `X-Tenant-Identifier` header to request using `PaymentAuthorizeRequest.tenantIdentifier` if exists. * - Sends a request to a foreign payment service. @@ -24,6 +27,8 @@ interface PaymentClientInterface * * @api * + * @deprecated The \Spryker\Zed\Payment\Business\ForeignPayment\ForeignPaymentInterface::initializePayment makes direct use of the KernelApp::makeRequest() method. + * * @param \Generated\Shared\Transfer\PaymentAuthorizeRequestTransfer $paymentAuthorizeRequestTransfer * * @return \Generated\Shared\Transfer\PaymentAuthorizeResponseTransfer @@ -32,6 +37,42 @@ public function authorizeForeignPayment( PaymentAuthorizeRequestTransfer $paymentAuthorizeRequestTransfer ): PaymentAuthorizeResponseTransfer; + /** + * Specification: + * - Makes a request through the KernelApp to a PSP App to initialize a pre-order payment. + * - Requires `PreOrderPaymentRequestTransfer::QUOTE` to be set. + * - Requires `PreOrderPaymentRequestTransfer::PAYMENT_METHOD` to be set. + * - Returns a `PreOrderPaymentResponseTransfer::IS_SUCCESS` with `true` if the request was successful. + * - Returns a `PreOrderPaymentResponseTransfer::PRE_ORDER_PAYMENT_DATA` with specific to the PSP related data (e.g. to initialize a PSP SDK). + * + * @api + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function initializePreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer; + + /** + * Specification: + * - Makes a request through the KernelApp to a PSP App to cancel a pre-order payment. + * - Requires `PreOrderPaymentRequestTransfer::PAYMENT_METHOD` to be set. + * - Requires `PreOrderPaymentRequestTransfer::PRE_ORDER_PAYMENT_DATA` to be set. + * - Returns a `PreOrderPaymentResponseTransfer::IS_SUCCESS` with `true` if the request was successful. + * - Returns a `PreOrderPaymentResponseTransfer::ERROR` in case of an error. + * + * @api + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function cancelPreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer; + /** * Specification: * - Requests available payment methods from Zed @@ -42,5 +83,5 @@ public function authorizeForeignPayment( * * @return \Generated\Shared\Transfer\PaymentMethodsTransfer */ - public function getAvailableMethods(QuoteTransfer $quoteTransfer); + public function getAvailableMethods(QuoteTransfer $quoteTransfer): PaymentMethodsTransfer; } diff --git a/src/Spryker/Client/Payment/Zed/PaymentStub.php b/src/Spryker/Client/Payment/Zed/PaymentStub.php index 464402d..7f89f24 100644 --- a/src/Spryker/Client/Payment/Zed/PaymentStub.php +++ b/src/Spryker/Client/Payment/Zed/PaymentStub.php @@ -7,6 +7,9 @@ namespace Spryker\Client\Payment\Zed; +use Generated\Shared\Transfer\PaymentMethodsTransfer; +use Generated\Shared\Transfer\PreOrderPaymentRequestTransfer; +use Generated\Shared\Transfer\PreOrderPaymentResponseTransfer; use Generated\Shared\Transfer\QuoteTransfer; use Spryker\Client\Payment\Dependency\Client\PaymentToZedRequestClientInterface; @@ -25,12 +28,44 @@ public function __construct(PaymentToZedRequestClientInterface $zedRequestClient $this->zedRequestClient = $zedRequestClient; } + /** + * @uses \Spryker\Zed\Payment\Communication\Controller\GatewayController::initializePreOrderPaymentAction() + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function initializePreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + /** @var \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer $preOrderPaymentResponseTransfer */ + $preOrderPaymentResponseTransfer = $this->zedRequestClient->call('/payment/gateway/initialize-pre-order-payment', $preOrderPaymentRequestTransfer); + + return $preOrderPaymentResponseTransfer; + } + + /** + * @uses \Spryker\Zed\Payment\Communication\Controller\GatewayController::cancelPreOrderPaymentAction() + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function cancelPreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + /** @var \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer $preOrderPaymentResponseTransfer */ + $preOrderPaymentResponseTransfer = $this->zedRequestClient->call('/payment/gateway/cancel-pre-order-payment', $preOrderPaymentRequestTransfer); + + return $preOrderPaymentResponseTransfer; + } + /** * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer * * @return \Generated\Shared\Transfer\PaymentMethodsTransfer */ - public function getAvailableMethods(QuoteTransfer $quoteTransfer) + public function getAvailableMethods(QuoteTransfer $quoteTransfer): PaymentMethodsTransfer { /** @var \Generated\Shared\Transfer\PaymentMethodsTransfer $paymentMethodsTransfer */ $paymentMethodsTransfer = $this->zedRequestClient->call('/payment/gateway/get-available-methods', $quoteTransfer, null); diff --git a/src/Spryker/Client/Payment/Zed/PaymentStubInterface.php b/src/Spryker/Client/Payment/Zed/PaymentStubInterface.php index 891abc9..70fe408 100644 --- a/src/Spryker/Client/Payment/Zed/PaymentStubInterface.php +++ b/src/Spryker/Client/Payment/Zed/PaymentStubInterface.php @@ -7,14 +7,35 @@ namespace Spryker\Client\Payment\Zed; +use Generated\Shared\Transfer\PaymentMethodsTransfer; +use Generated\Shared\Transfer\PreOrderPaymentRequestTransfer; +use Generated\Shared\Transfer\PreOrderPaymentResponseTransfer; use Generated\Shared\Transfer\QuoteTransfer; interface PaymentStubInterface { + /** + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function initializePreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer; + + /** + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function cancelPreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer; + /** * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer * * @return \Generated\Shared\Transfer\PaymentMethodsTransfer */ - public function getAvailableMethods(QuoteTransfer $quoteTransfer); + public function getAvailableMethods(QuoteTransfer $quoteTransfer): PaymentMethodsTransfer; } diff --git a/src/Spryker/Shared/Payment/Transfer/payment.transfer.xml b/src/Spryker/Shared/Payment/Transfer/payment.transfer.xml index d90289a..a6583df 100644 --- a/src/Spryker/Shared/Payment/Transfer/payment.transfer.xml +++ b/src/Spryker/Shared/Payment/Transfer/payment.transfer.xml @@ -25,6 +25,7 @@ + @@ -51,12 +52,6 @@ - - - - - - @@ -65,6 +60,13 @@ + + + + + + + @@ -101,6 +103,7 @@ + @@ -108,6 +111,10 @@ + + + + @@ -278,6 +285,18 @@ + + + + + + + + + + + + @@ -287,10 +306,17 @@ - + + + + + + + + @@ -490,5 +516,17 @@ + + + + + + + + + + + + diff --git a/src/Spryker/Zed/Payment/Business/Authorizer/ForeignPaymentAuthorizer.php b/src/Spryker/Zed/Payment/Business/Authorizer/ForeignPaymentAuthorizer.php deleted file mode 100644 index 13f3a0f..0000000 --- a/src/Spryker/Zed/Payment/Business/Authorizer/ForeignPaymentAuthorizer.php +++ /dev/null @@ -1,348 +0,0 @@ - - */ - protected $paymentAuthorizeRequestExpanderPlugins; - - /** - * @param \Spryker\Zed\Payment\Business\Mapper\QuoteDataMapperInterface $quoteDataMapper - * @param \Spryker\Zed\Payment\Dependency\Facade\PaymentToLocaleFacadeInterface $localeFacade - * @param \Spryker\Zed\Payment\Persistence\PaymentRepositoryInterface $paymentRepository - * @param \Spryker\Client\Payment\PaymentClientInterface $paymentClient - * @param \Spryker\Zed\Payment\PaymentConfig $paymentConfig - * @param \Spryker\Zed\Payment\Dependency\Facade\PaymentToStoreFacadeInterface $storeFacade - * @param \Spryker\Service\Payment\PaymentServiceInterface $paymentService - * @param array $paymentAuthorizeRequestExpanderPlugins - */ - public function __construct( - QuoteDataMapperInterface $quoteDataMapper, - PaymentToLocaleFacadeInterface $localeFacade, - PaymentRepositoryInterface $paymentRepository, - PaymentClientInterface $paymentClient, - PaymentConfig $paymentConfig, - PaymentToStoreFacadeInterface $storeFacade, - PaymentServiceInterface $paymentService, - array $paymentAuthorizeRequestExpanderPlugins - ) { - $this->quoteDataMapper = $quoteDataMapper; - $this->localeFacade = $localeFacade; - $this->paymentRepository = $paymentRepository; - $this->paymentClient = $paymentClient; - $this->paymentConfig = $paymentConfig; - $this->storeFacade = $storeFacade; - $this->paymentService = $paymentService; - $this->paymentAuthorizeRequestExpanderPlugins = $paymentAuthorizeRequestExpanderPlugins; - } - - /** - * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer - * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer - * - * @return void - */ - public function initForeignPaymentForCheckoutProcess( - QuoteTransfer $quoteTransfer, - CheckoutResponseTransfer $checkoutResponseTransfer - ): void { - $paymentSelectionKey = $this->paymentService->getPaymentSelectionKey($quoteTransfer->getPaymentOrFail()); - - if ($paymentSelectionKey !== PaymentTransfer::FOREIGN_PAYMENTS) { - return; - } - - $paymentMethodKey = $this->paymentService->getPaymentMethodKey($quoteTransfer->getPaymentOrFail()); - $paymentMethodTransfer = $this->paymentRepository->findPaymentMethod( - (new PaymentMethodTransfer())->setPaymentMethodKey($paymentMethodKey), - ); - - if (!$paymentMethodTransfer || (!$paymentMethodTransfer->getPaymentAuthorizationEndpoint() && !$paymentMethodTransfer->getPaymentMethodAppConfiguration())) { - return; - } - - $paymentAuthorizeResponseTransfer = $this->requestPaymentAuthorization( - $paymentMethodTransfer, - $quoteTransfer, - $checkoutResponseTransfer->getSaveOrderOrFail(), - ); - $this->processPaymentAuthorizeResponse( - $paymentAuthorizeResponseTransfer, - $checkoutResponseTransfer, - ); - } - - /** - * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer - * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer - * @param \Generated\Shared\Transfer\SaveOrderTransfer $saveOrderTransfer - * - * @return \Generated\Shared\Transfer\PaymentAuthorizeResponseTransfer - */ - protected function requestPaymentAuthorization( - PaymentMethodTransfer $paymentMethodTransfer, - QuoteTransfer $quoteTransfer, - SaveOrderTransfer $saveOrderTransfer - ): PaymentAuthorizeResponseTransfer { - $localeTransfer = $this->localeFacade->getCurrentLocale(); - $quoteTransfer->setOrderReference($saveOrderTransfer->getOrderReference()); - $quoteTransfer->getCustomerOrFail()->setLocale($localeTransfer); - - $language = $this->getCurrentLanguage($localeTransfer); - $postData = [ - 'orderData' => $this->quoteDataMapper->mapQuoteDataByAllowedFields( - $quoteTransfer, - $this->paymentConfig->getQuoteFieldsForForeignPayment(), - ), - 'redirectSuccessUrl' => $this->generatePaymentRedirectUrl( - $language, - $this->paymentConfig->getSuccessRoute(), - ), - 'redirectCancelUrl' => $this->generatePaymentRedirectUrl( - $language, - $this->paymentConfig->getCancelRoute(), - ['orderReference' => $quoteTransfer->getOrderReference()], - ), - 'checkoutSummaryPageUrl' => $this->generatePaymentRedirectUrl( - $language, - $this->paymentConfig->getCheckoutSummaryPageRoute(), - ), - ]; - - $authorizationEndpoint = $this->getAuthorizationEndpoint($paymentMethodTransfer); - - $paymentAuthorizeRequestTransfer = (new PaymentAuthorizeRequestTransfer()) - ->setRequestUrl($authorizationEndpoint) - ->setStoreReference($this->findCurrentStoreReference($quoteTransfer)) - ->setTenantIdentifier($this->paymentConfig->getTenantIdentifier()) - ->setPostData($postData); - - $paymentAuthorizeRequestTransfer = $this->executePaymentAuthorizeRequestExpanderPlugins($paymentAuthorizeRequestTransfer); - - return $this->paymentClient->authorizeForeignPayment($paymentAuthorizeRequestTransfer); - } - - /** - * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer - * - * @throws \Spryker\Zed\Payment\Business\Exception\AuthorizationEndpointNotFoundException - * - * @return string - */ - protected function getAuthorizationEndpoint(PaymentMethodTransfer $paymentMethodTransfer): string - { - $paymentMethodAppConfigurationTransfer = $paymentMethodTransfer->getPaymentMethodAppConfiguration(); - - if (!$paymentMethodAppConfigurationTransfer) { - return $paymentMethodTransfer->getPaymentAuthorizationEndpoint(); - } - - foreach ($paymentMethodAppConfigurationTransfer->getEndpoints() as $endpointTransfer) { - if ($endpointTransfer->getNameOrFail() === 'authorization') { - return sprintf('%s%s', $paymentMethodAppConfigurationTransfer->getBaseUrlOrFail(), $endpointTransfer->getPathOrFail()); - } - } - - throw new AuthorizationEndpointNotFoundException(sprintf('Could not find an authorization endpoint for payment method "%s"', $paymentMethodTransfer->getPaymentMethodKey())); - } - - /** - * @param string $language - * @param string $urlPath - * @param array $queryParts - * - * @return string - */ - protected function generatePaymentRedirectUrl(string $language, string $urlPath, array $queryParts = []): string - { - if ($this->isAbsoluteUrl($urlPath)) { - return $this->addQueryParametersToUrl($urlPath, $queryParts); - } - - $url = sprintf( - '%s/%s%s', - $this->paymentConfig->getBaseUrlYves(), - $language, - $urlPath, - ); - - return Url::generate($url, $queryParts)->build(); - } - - /** - * @param string $url - * - * @return bool - */ - protected function isAbsoluteUrl(string $url): bool - { - $urlComponents = parse_url($url); - - return isset($urlComponents['host']); - } - - /** - * @param string $url - * @param array $queryParams - * - * @return string - */ - protected function addQueryParametersToUrl(string $url, array $queryParams): string - { - if ($queryParams === []) { - return $url; - } - - $urlComponents = parse_url($url); - - $url .= isset($urlComponents['query']) ? '&' : '?'; - $url .= http_build_query($queryParams); - - return $url; - } - - /** - * @param \Generated\Shared\Transfer\LocaleTransfer $localeTransfer - * - * @return string - */ - protected function getCurrentLanguage(LocaleTransfer $localeTransfer): string - { - $splitLocale = explode('_', $localeTransfer->getLocaleNameOrFail()); - - return $splitLocale[0]; - } - - /** - * @param \Generated\Shared\Transfer\PaymentAuthorizeResponseTransfer $paymentAuthorizeResponseTransfer - * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer - * - * @return void - */ - protected function processPaymentAuthorizeResponse( - PaymentAuthorizeResponseTransfer $paymentAuthorizeResponseTransfer, - CheckoutResponseTransfer $checkoutResponseTransfer - ): void { - if (!$paymentAuthorizeResponseTransfer->getIsSuccessful()) { - $checkoutErrorTransfer = (new CheckoutErrorTransfer()) - ->setErrorCode(static::ERROR_CODE_PAYMENT_FAILED) - ->setMessage($paymentAuthorizeResponseTransfer->getMessage()); - $checkoutResponseTransfer->setIsSuccess(false) - ->addError($checkoutErrorTransfer); - - return; - } - - if ($this->paymentConfig->getStoreFrontPaymentPage() === '') { - $checkoutResponseTransfer - ->setIsExternalRedirect(true) - ->setRedirectUrl($paymentAuthorizeResponseTransfer->getRedirectUrl()); - - return; - } - - $redirectUrl = $this->addQueryParametersToUrl($this->paymentConfig->getStoreFrontPaymentPage(), [ - 'url' => base64_encode($paymentAuthorizeResponseTransfer->getRedirectUrl()), - ]); - - $checkoutResponseTransfer - ->setIsExternalRedirect(true) - ->setRedirectUrl($redirectUrl); - } - - /** - * @deprecated Will be removed without replacement. - * - * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer - * - * @return string|null - */ - protected function findCurrentStoreReference(QuoteTransfer $quoteTransfer): ?string - { - return $this->storeFacade - ->getStoreByName($quoteTransfer->getStoreOrFail()->getNameOrFail()) - ->getStoreReference(); - } - - /** - * @param \Generated\Shared\Transfer\PaymentAuthorizeRequestTransfer $paymentAuthorizeRequestTransfer - * - * @return \Generated\Shared\Transfer\PaymentAuthorizeRequestTransfer - */ - protected function executePaymentAuthorizeRequestExpanderPlugins( - PaymentAuthorizeRequestTransfer $paymentAuthorizeRequestTransfer - ): PaymentAuthorizeRequestTransfer { - foreach ($this->paymentAuthorizeRequestExpanderPlugins as $paymentAuthorizeRequestExpanderPlugin) { - $paymentAuthorizeRequestTransfer = $paymentAuthorizeRequestExpanderPlugin->expand($paymentAuthorizeRequestTransfer); - } - - return $paymentAuthorizeRequestTransfer; - } -} diff --git a/src/Spryker/Zed/Payment/Business/Authorizer/ForeignPaymentAuthorizerInterface.php b/src/Spryker/Zed/Payment/Business/Authorizer/ForeignPaymentAuthorizerInterface.php deleted file mode 100644 index a11560b..0000000 --- a/src/Spryker/Zed/Payment/Business/Authorizer/ForeignPaymentAuthorizerInterface.php +++ /dev/null @@ -1,25 +0,0 @@ -quoteDataMapper = $quoteDataMapper; + $this->localeFacade = $localeFacade; + $this->kernelAppFacade = $kernelAppFacade; + $this->paymentRepository = $paymentRepository; + $this->paymentClient = $paymentClient; + $this->paymentConfig = $paymentConfig; + $this->paymentService = $paymentService; + $this->utilEncodingService = $utilEncodingService; + } + + /** + * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer + * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer + * + * @return void + */ + public function initializePayment( + QuoteTransfer $quoteTransfer, + CheckoutResponseTransfer $checkoutResponseTransfer + ): void { + $paymentSelectionKey = $this->paymentService->getPaymentSelectionKey($quoteTransfer->getPaymentOrFail()); + + if ($paymentSelectionKey !== PaymentTransfer::FOREIGN_PAYMENTS || count($quoteTransfer->getPreOrderPaymentData()) > 0) { + return; + } + + $paymentMethodKey = $this->paymentService->getPaymentMethodKey($quoteTransfer->getPaymentOrFail()); + + $paymentMethodTransfer = $this->paymentRepository->findPaymentMethod( + (new PaymentMethodTransfer())->setPaymentMethodKey($paymentMethodKey), + ); + + if (!$paymentMethodTransfer || (!$paymentMethodTransfer->getPaymentAuthorizationEndpoint() && !$paymentMethodTransfer->getPaymentMethodAppConfiguration())) { + return; + } + + $saveOrderTransfer = $checkoutResponseTransfer->getSaveOrderOrFail(); + + $localeTransfer = $this->localeFacade->getCurrentLocale(); + + $quoteTransfer->setOrderReference($saveOrderTransfer->getOrderReference()); + $quoteTransfer->getCustomerOrFail()->setLocale($localeTransfer); + + $language = $this->getCurrentLanguage($localeTransfer); + + $postData = [ + 'orderData' => $this->quoteDataMapper->mapQuoteDataByAllowedFields( + $quoteTransfer, + $this->paymentConfig->getQuoteFieldsForForeignPayment(), + ), + 'redirectSuccessUrl' => $this->generatePaymentRedirectUrl( + $language, + $this->paymentConfig->getSuccessRoute(), + ), + 'redirectCancelUrl' => $this->generatePaymentRedirectUrl( + $language, + $this->paymentConfig->getCancelRoute(), + ['orderReference' => $quoteTransfer->getOrderReference()], + ), + 'checkoutSummaryPageUrl' => $this->generatePaymentRedirectUrl( + $language, + $this->paymentConfig->getCheckoutSummaryPageRoute(), + ), + ]; + + $acpHttpRequestTransfer = new AcpHttpRequestTransfer(); + $acpHttpRequestTransfer + ->setMethod(Request::METHOD_POST) + ->setUri($this->getAuthorizationEndpoint($paymentMethodTransfer)) + ->setBody((string)$this->utilEncodingService->encodeJson($postData)); + + $acpHttpResponseTransfer = $this->kernelAppFacade->makeRequest($acpHttpRequestTransfer); + $decodedResponseBody = $this->utilEncodingService->decodeJson($acpHttpResponseTransfer->getContentOrFail(), true); + + if ($acpHttpResponseTransfer->getHttpStatusCode() !== Response::HTTP_OK || json_last_error() !== JSON_ERROR_NONE) { + $checkoutErrorTransfer = (new CheckoutErrorTransfer()) + ->setErrorCode(static::ERROR_CODE_PAYMENT_FAILED) + ->setMessage($acpHttpResponseTransfer->getContent()); + + $checkoutResponseTransfer->setIsSuccess(false) + ->addError($checkoutErrorTransfer); + + return; + } + + $paymentAuthorizeResponseTransfer = new PaymentAuthorizeResponseTransfer(); + $paymentAuthorizeResponseTransfer->fromArray((array)$decodedResponseBody, true); + + if ($this->paymentConfig->getStoreFrontPaymentPage() === '') { + $checkoutResponseTransfer + ->setIsExternalRedirect(true) + ->setRedirectUrl($paymentAuthorizeResponseTransfer->getRedirectUrl()); + + return; + } + + $redirectUrl = $this->addQueryParametersToUrl($this->paymentConfig->getStoreFrontPaymentPage(), [ + 'url' => base64_encode($paymentAuthorizeResponseTransfer->getRedirectUrl()), + ]); + + $checkoutResponseTransfer + ->setIsExternalRedirect(true) + ->setRedirectUrl($redirectUrl); + } + + /** + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function initializePreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + $quoteTransfer = $preOrderPaymentRequestTransfer->getQuoteOrFail(); + + $paymentMethodTransfer = $this->paymentRepository->findPaymentMethod( + $this->getPaymentMethodTransferFromPreOrderPaymentRequestTransfer($preOrderPaymentRequestTransfer), + ); + + if (!$paymentMethodTransfer) { + return (new PreOrderPaymentResponseTransfer()) + ->setIsSuccessful(false) + ->setError('Payment method not found'); + } + + try { + $url = $this->getAuthorizationEndpoint($paymentMethodTransfer); + } catch (PreOrderPaymentException $e) { + return (new PreOrderPaymentResponseTransfer()) + ->setIsSuccessful(false) + ->setError($e->getMessage()); + } + + $postData = [ + 'orderData' => $this->quoteDataMapper->mapQuoteDataByAllowedFields( + $quoteTransfer, + $this->paymentConfig->getQuoteFieldsForForeignPayment(), + ), + 'preOrderPaymentData' => $preOrderPaymentRequestTransfer->getPreOrderPaymentData(), + ]; + + $acpHttpRequestTransfer = new AcpHttpRequestTransfer(); + $acpHttpRequestTransfer + ->setMethod(Request::METHOD_POST) + ->setUri($url) + ->setBody((string)$this->utilEncodingService->encodeJson($postData)); + + $acpHttpResponseTransfer = $this->kernelAppFacade->makeRequest($acpHttpRequestTransfer); + + // 200 Created is the expected response and only when we receive this it is successful + $isSuccessful = $acpHttpResponseTransfer->getHttpStatusCode() === 200; + + $initializePreOrderPaymentResponseTransfer = new PreOrderPaymentResponseTransfer(); + $initializePreOrderPaymentResponseTransfer + ->setIsSuccessful($isSuccessful); + + if (!$isSuccessful) { + $initializePreOrderPaymentResponseTransfer->setError($acpHttpResponseTransfer->getContent()); + + return $initializePreOrderPaymentResponseTransfer; + } + + $decodedResponseBody = $this->utilEncodingService->decodeJson($acpHttpResponseTransfer->getContentOrFail(), true); + + if (json_last_error() !== JSON_ERROR_NONE) { + $initializePreOrderPaymentResponseTransfer->setError($acpHttpResponseTransfer->getContentOrFail()); + + return $initializePreOrderPaymentResponseTransfer; + } + + if (!isset($decodedResponseBody[PaymentConfig::PRE_ORDER_PAYMENT_DATA_FIELD])) { + $initializePreOrderPaymentResponseTransfer->setError('Response does not have the required preOrderPaymentData.'); + + return $initializePreOrderPaymentResponseTransfer; + } + + if (isset($decodedResponseBody['isSuccessful'])) { + $initializePreOrderPaymentResponseTransfer->setIsSuccessful($decodedResponseBody['isSuccessful']); + + if ($decodedResponseBody['isSuccessful'] === false) { + $initializePreOrderPaymentResponseTransfer->setError(sprintf('Request to payment provider failed. %s', $decodedResponseBody['message'] ?? '')); + + return $initializePreOrderPaymentResponseTransfer; + } + } + + $initializePreOrderPaymentResponseTransfer->setPreOrderPaymentData($decodedResponseBody[PaymentConfig::PRE_ORDER_PAYMENT_DATA_FIELD]); + + return $initializePreOrderPaymentResponseTransfer; + } + + /** + * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer + * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer + * + * @throws \Spryker\Zed\Payment\Business\Exception\PreOrderPaymentException + * + * @return void + */ + public function confirmPreOrderPayment( + QuoteTransfer $quoteTransfer, + CheckoutResponseTransfer $checkoutResponseTransfer + ): void { + if (count($quoteTransfer->getPreOrderPaymentData()) === 0) { + return; + } + + $paymentMethodTransfer = $this->paymentRepository->findPaymentMethod( + (new PaymentMethodTransfer()) + ->setName($quoteTransfer->getPaymentOrFail()->getPaymentMethodOrFail()) + ->setPaymentProvider((new PaymentProviderTransfer())->setName($quoteTransfer->getPaymentOrFail()->getPaymentProviderOrFail())), + ); + + if (!$paymentMethodTransfer || !$paymentMethodTransfer->getPaymentMethodAppConfiguration()) { + return; + } + + $saveOrderTransfer = $checkoutResponseTransfer->getSaveOrderOrFail(); + + $orderData = $this->quoteDataMapper->mapQuoteDataByAllowedFields( + $quoteTransfer, + $this->paymentConfig->getQuoteFieldsForForeignPayment(), + ); + + $requestBody = [ + 'orderReference' => $saveOrderTransfer->getOrderReference(), + 'orderData' => $orderData, + PaymentConfig::PRE_ORDER_PAYMENT_DATA_FIELD => $quoteTransfer->getPreOrderPaymentData(), + ]; + + $acpHttpRequestTransfer = new AcpHttpRequestTransfer(); + $acpHttpRequestTransfer + ->setMethod(Request::METHOD_POST) + ->setUri($this->getConfirmPreOrderPaymentEndpoint($paymentMethodTransfer)) + ->setBody((string)$this->utilEncodingService->encodeJson($requestBody)); + + $acpHttpResponseTransfer = $this->kernelAppFacade->makeRequest($acpHttpRequestTransfer); + + if ($acpHttpResponseTransfer->getHttpStatusCode() !== Response::HTTP_OK) { + throw new PreOrderPaymentException(sprintf( + 'Failed to confirm pre-order payment for order %s. Response: %s', + $saveOrderTransfer->getOrderReference(), + $acpHttpResponseTransfer->getContent(), + )); + } + } + + /** + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function cancelPreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + $paymentMethodTransfer = $this->paymentRepository->findPaymentMethod( + $this->getPaymentMethodTransferFromPreOrderPaymentRequestTransfer($preOrderPaymentRequestTransfer), + ); + + if (!$paymentMethodTransfer) { + return (new PreOrderPaymentResponseTransfer()) + ->setIsSuccessful(false) + ->setError('Payment method not found'); + } + + $postData = [ + 'preOrderPaymentData' => $preOrderPaymentRequestTransfer->getPreOrderPaymentData(), + ]; + + $acpHttpRequestTransfer = new AcpHttpRequestTransfer(); + $acpHttpRequestTransfer + ->setMethod(Request::METHOD_POST) + ->setUri($this->getCancelPreOrderPaymentEndpoint($paymentMethodTransfer)) + ->setBody((string)$this->utilEncodingService->encodeJson($postData)); + + $acpHttpResponseTransfer = $this->kernelAppFacade->makeRequest($acpHttpRequestTransfer); + + // 200 Created is the expected response and only when we receive this it is successful + $isSuccessful = $acpHttpResponseTransfer->getHttpStatusCode() === 200; + + $cancelPreOrderPaymentResponseTransfer = new PreOrderPaymentResponseTransfer(); + $cancelPreOrderPaymentResponseTransfer + ->setIsSuccessful($isSuccessful); + + $decodedResponseBody = (array)$this->utilEncodingService->decodeJson($acpHttpResponseTransfer->getContentOrFail(), true); + + if (json_last_error() !== JSON_ERROR_NONE) { + $cancelPreOrderPaymentResponseTransfer->setError($acpHttpResponseTransfer->getContentOrFail()); + + return $cancelPreOrderPaymentResponseTransfer; + } + + if (!$isSuccessful) { + $cancelPreOrderPaymentResponseTransfer->setError($this->getMessageFromResponse($decodedResponseBody)); + + return $cancelPreOrderPaymentResponseTransfer; + } + + return $cancelPreOrderPaymentResponseTransfer; + } + + /** + * @param array $response + * + * @return string + */ + protected function getMessageFromResponse(array $response): string + { + if (isset($response['error'])) { + return $response['error']; + } + + if (isset($response[0]['message'])) { + return $response[0]['message']; + } + + return 'Response does not contain an error field.'; + } + + /** + * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer + * + * @throws \Spryker\Zed\Payment\Business\Exception\PreOrderPaymentException + * + * @return string + */ + protected function getAuthorizationEndpoint(PaymentMethodTransfer $paymentMethodTransfer): string + { + $paymentMethodAppConfigurationTransfer = $paymentMethodTransfer->getPaymentMethodAppConfiguration(); + + if (!$paymentMethodAppConfigurationTransfer) { + return $paymentMethodTransfer->getPaymentAuthorizationEndpoint(); + } + + foreach ($paymentMethodAppConfigurationTransfer->getEndpoints() as $endpointTransfer) { + if ($endpointTransfer->getNameOrFail() === PaymentConfig::PAYMENT_SERVICE_PROVIDER_ENDPOINT_NAME_AUTHORIZATION) { + return sprintf('%s%s', $paymentMethodAppConfigurationTransfer->getBaseUrlOrFail(), $endpointTransfer->getPathOrFail()); + } + } + + throw new PreOrderPaymentException(sprintf('Could not find an authorization endpoint for the payment method "%s". A reason for this could be that the Payment Apps configuration was not updated or not synced back.', $paymentMethodTransfer->getPaymentMethodKey())); + } + + /** + * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer + * + * @throws \Spryker\Zed\Payment\Business\Exception\PreOrderPaymentException + * + * @return string + */ + protected function getConfirmPreOrderPaymentEndpoint(PaymentMethodTransfer $paymentMethodTransfer): string + { + $paymentMethodAppConfigurationTransfer = $paymentMethodTransfer->getPaymentMethodAppConfiguration(); + + foreach ($paymentMethodAppConfigurationTransfer->getEndpoints() as $endpointTransfer) { + if ($endpointTransfer->getNameOrFail() === PaymentConfig::PAYMENT_SERVICE_PROVIDER_ENDPOINT_NAME_PRE_ORDER_CONFIRMATION) { + return sprintf('%s%s', $paymentMethodAppConfigurationTransfer->getBaseUrlOrFail(), $endpointTransfer->getPathOrFail()); + } + } + + throw new PreOrderPaymentException(sprintf('Could not find an endpoint for pre-order payment confirmation of the payment method "%s". A reason for this could be that the Payment Apps configuration was not updated or not synced back.', $paymentMethodTransfer->getPaymentMethodKey())); + } + + /** + * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer + * + * @throws \Spryker\Zed\Payment\Business\Exception\PreOrderPaymentException + * + * @return string + */ + protected function getCancelPreOrderPaymentEndpoint(PaymentMethodTransfer $paymentMethodTransfer): string + { + $paymentMethodAppConfigurationTransfer = $paymentMethodTransfer->getPaymentMethodAppConfiguration(); + + foreach ($paymentMethodAppConfigurationTransfer->getEndpoints() as $endpointTransfer) { + if ($endpointTransfer->getNameOrFail() === PaymentConfig::PAYMENT_SERVICE_PROVIDER_ENDPOINT_NAME_PRE_ORDER_CANCELLATION) { + return sprintf('%s%s', $paymentMethodAppConfigurationTransfer->getBaseUrlOrFail(), $endpointTransfer->getPathOrFail()); + } + } + + throw new PreOrderPaymentException(sprintf('Could not find an endpoint for pre-order payment cancellation of the payment method "%s". A reason for this could be that the Payment Apps configuration was not updated or not synced back.', $paymentMethodTransfer->getPaymentMethodKey())); + } + + /** + * @param string $language + * @param string $urlPath + * @param array $queryParts + * + * @return string + */ + protected function generatePaymentRedirectUrl(string $language, string $urlPath, array $queryParts = []): string + { + if ($this->isAbsoluteUrl($urlPath)) { + return $this->addQueryParametersToUrl($urlPath, $queryParts); + } + + $url = sprintf( + '%s/%s%s', + $this->paymentConfig->getBaseUrlYves(), + $language, + $urlPath, + ); + + return Url::generate($url, $queryParts)->build(); + } + + /** + * @param string $url + * + * @return bool + */ + protected function isAbsoluteUrl(string $url): bool + { + $urlComponents = parse_url($url); + + return isset($urlComponents['host']); + } + + /** + * @param string $url + * @param array $queryParams + * + * @return string + */ + protected function addQueryParametersToUrl(string $url, array $queryParams): string + { + if ($queryParams === []) { + return $url; + } + + $urlComponents = parse_url($url); + + $url .= isset($urlComponents['query']) ? '&' : '?'; + $url .= http_build_query($queryParams); + + return $url; + } + + /** + * @param \Generated\Shared\Transfer\LocaleTransfer $localeTransfer + * + * @return string + */ + protected function getCurrentLanguage(LocaleTransfer $localeTransfer): string + { + $splitLocale = explode('_', $localeTransfer->getLocaleNameOrFail()); + + return $splitLocale[0]; + } + + /** + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PaymentMethodTransfer + */ + protected function getPaymentMethodTransferFromPreOrderPaymentRequestTransfer( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PaymentMethodTransfer { + $paymentTransfer = $preOrderPaymentRequestTransfer->getPaymentOrFail(); + $paymentProviderTransfer = new PaymentProviderTransfer(); + $paymentProviderTransfer->setName($paymentTransfer->getPaymentProviderOrFail()); + + return (new PaymentMethodTransfer()) + ->setName($paymentTransfer->getPaymentMethodOrFail()) + ->setPaymentProvider($paymentProviderTransfer); + } +} diff --git a/src/Spryker/Zed/Payment/Business/ForeignPayment/ForeignPaymentInterface.php b/src/Spryker/Zed/Payment/Business/ForeignPayment/ForeignPaymentInterface.php new file mode 100644 index 0000000..25c85cd --- /dev/null +++ b/src/Spryker/Zed/Payment/Business/ForeignPayment/ForeignPaymentInterface.php @@ -0,0 +1,53 @@ +setLabelName($updatePaymentMethodTransfer->getName()) + ->setGroupName($updatePaymentMethodTransfer->getProviderName()) + ->setPaymentAuthorizationEndpoint($updatePaymentMethodTransfer->getPaymentAuthorizationEndpoint()) + ->setPaymentMethodAppConfiguration($updatePaymentMethodTransfer->getPaymentMethodAppConfiguration()); + + return $paymentMethodTransfer; + } + /** * @param \Generated\Shared\Transfer\DeletePaymentMethodTransfer $deletePaymentMethodTransfer * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer diff --git a/src/Spryker/Zed/Payment/Business/Mapper/PaymentMethodEventMapperInterface.php b/src/Spryker/Zed/Payment/Business/Mapper/PaymentMethodEventMapperInterface.php index a8c13eb..c26ba14 100644 --- a/src/Spryker/Zed/Payment/Business/Mapper/PaymentMethodEventMapperInterface.php +++ b/src/Spryker/Zed/Payment/Business/Mapper/PaymentMethodEventMapperInterface.php @@ -10,6 +10,7 @@ use Generated\Shared\Transfer\AddPaymentMethodTransfer; use Generated\Shared\Transfer\DeletePaymentMethodTransfer; use Generated\Shared\Transfer\PaymentMethodTransfer; +use Generated\Shared\Transfer\UpdatePaymentMethodTransfer; interface PaymentMethodEventMapperInterface { @@ -24,6 +25,17 @@ public function mapAddPaymentMethodTransferToPaymentMethodTransfer( PaymentMethodTransfer $paymentMethodTransfer ): PaymentMethodTransfer; + /** + * @param \Generated\Shared\Transfer\UpdatePaymentMethodTransfer $updatePaymentMethodTransfer + * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer + * + * @return \Generated\Shared\Transfer\PaymentMethodTransfer + */ + public function mapUpdatePaymentMethodTransferToPaymentMethodTransfer( + UpdatePaymentMethodTransfer $updatePaymentMethodTransfer, + PaymentMethodTransfer $paymentMethodTransfer + ): PaymentMethodTransfer; + /** * @param \Generated\Shared\Transfer\DeletePaymentMethodTransfer $deletePaymentMethodTransfer * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer diff --git a/src/Spryker/Zed/Payment/Business/Mapper/QuoteDataMapper.php b/src/Spryker/Zed/Payment/Business/Mapper/QuoteDataMapper.php index daa0c64..e75de9e 100644 --- a/src/Spryker/Zed/Payment/Business/Mapper/QuoteDataMapper.php +++ b/src/Spryker/Zed/Payment/Business/Mapper/QuoteDataMapper.php @@ -50,6 +50,10 @@ protected function mapTransferDataByAllowedFieldsRecursive( foreach ($allowedFields as $fieldName => $allowedData) { $fieldValue = $camelCasedData[$fieldName]; + if (is_array($allowedData) && $fieldValue === null) { + continue; + } + if (is_array($allowedData) && $fieldValue instanceof AbstractTransfer) { $mappedData = $this->mapTransferDataByAllowedFieldsRecursive($fieldValue, $allowedData, $mappedData); diff --git a/src/Spryker/Zed/Payment/Business/MessageConsumer/PaymentMessageConsumer.php b/src/Spryker/Zed/Payment/Business/MessageConsumer/PaymentMessageConsumer.php new file mode 100644 index 0000000..062bc4b --- /dev/null +++ b/src/Spryker/Zed/Payment/Business/MessageConsumer/PaymentMessageConsumer.php @@ -0,0 +1,81 @@ +paymentMethodUpdater = $paymentMethodUpdater; + } + + /** + * @param \Spryker\Shared\Kernel\Transfer\AbstractTransfer $messageTransfer + * + * @throws \Spryker\Zed\Payment\Business\Exception\PaymentMethodMessageConsumeException + * + * @return void + */ + public function consumePaymentMessage(AbstractTransfer $messageTransfer): void + { + match (get_class($messageTransfer)) { + AddPaymentMethodTransfer::class => $this->addPaymentMethod($messageTransfer), + UpdatePaymentMethodTransfer::class => $this->updatePaymentMethod($messageTransfer), + DeletePaymentMethodTransfer::class => $this->deletePaymentMethod($messageTransfer), + default => throw new PaymentMethodMessageConsumeException(sprintf( + 'Unsupported message type. Expected one of: "%s", "%s", "%s" but got "%s".', + AddPaymentMethodTransfer::class, + UpdatePaymentMethodTransfer::class, + DeletePaymentMethodTransfer::class, + get_class($messageTransfer), + )) + }; + } + + /** + * @param \Generated\Shared\Transfer\AddPaymentMethodTransfer $addPaymentMethodTransfer + * + * @return void + */ + protected function addPaymentMethod(AddPaymentMethodTransfer $addPaymentMethodTransfer): void + { + $this->paymentMethodUpdater->addPaymentMethod($addPaymentMethodTransfer); + } + + /** + * @param \Generated\Shared\Transfer\UpdatePaymentMethodTransfer $updatePaymentMethodTransfer + * + * @return void + */ + protected function updatePaymentMethod(UpdatePaymentMethodTransfer $updatePaymentMethodTransfer): void + { + $this->paymentMethodUpdater->updatePaymentMethod($updatePaymentMethodTransfer); + } + + /** + * @param \Generated\Shared\Transfer\DeletePaymentMethodTransfer $deletePaymentMethodTransfer + * + * @return void + */ + protected function deletePaymentMethod(DeletePaymentMethodTransfer $deletePaymentMethodTransfer): void + { + $this->paymentMethodUpdater->deletePaymentMethod($deletePaymentMethodTransfer); + } +} diff --git a/src/Spryker/Zed/Payment/Business/MessageConsumer/PaymentMessageConsumerInterface.php b/src/Spryker/Zed/Payment/Business/MessageConsumer/PaymentMessageConsumerInterface.php new file mode 100644 index 0000000..d9ab0d0 --- /dev/null +++ b/src/Spryker/Zed/Payment/Business/MessageConsumer/PaymentMessageConsumerInterface.php @@ -0,0 +1,20 @@ +findPaymentMethods($quoteTransfer); $paymentMethodsTransfer = $this->applyFilterPlugins($paymentMethodsTransfer, $quoteTransfer); @@ -190,7 +190,7 @@ protected function isPaymentMethodAvailableForStore( * * @return \Generated\Shared\Transfer\PaymentMethodsTransfer */ - protected function applyFilterPlugins(PaymentMethodsTransfer $paymentMethodsTransfer, $quoteTransfer) + protected function applyFilterPlugins(PaymentMethodsTransfer $paymentMethodsTransfer, $quoteTransfer): PaymentMethodsTransfer { foreach ($this->paymentMethodFilterPlugins as $paymentMethodFilterPlugin) { $paymentMethodsTransfer = $paymentMethodFilterPlugin->filterPaymentMethods($paymentMethodsTransfer, $quoteTransfer); diff --git a/src/Spryker/Zed/Payment/Business/Method/PaymentMethodUpdater.php b/src/Spryker/Zed/Payment/Business/Method/PaymentMethodUpdater.php index 3a2281a..df4508e 100644 --- a/src/Spryker/Zed/Payment/Business/Method/PaymentMethodUpdater.php +++ b/src/Spryker/Zed/Payment/Business/Method/PaymentMethodUpdater.php @@ -19,6 +19,7 @@ use Generated\Shared\Transfer\PaymentProviderTransfer; use Generated\Shared\Transfer\StoreRelationTransfer; use Generated\Shared\Transfer\StoreTransfer; +use Generated\Shared\Transfer\UpdatePaymentMethodTransfer; use Spryker\Zed\Kernel\Persistence\EntityManager\TransactionTrait; use Spryker\Zed\Payment\Business\Generator\PaymentMethodKeyGeneratorInterface; use Spryker\Zed\Payment\Business\Mapper\PaymentMethodEventMapperInterface; @@ -99,16 +100,20 @@ public function __construct( } /** - * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer + * @param \Generated\Shared\Transfer\UpdatePaymentMethodTransfer $updatePaymentMethodTransfer * - * @return \Generated\Shared\Transfer\PaymentMethodResponseTransfer + * @return \Generated\Shared\Transfer\PaymentMethodTransfer */ - public function updatePaymentMethod( - PaymentMethodTransfer $paymentMethodTransfer - ): PaymentMethodResponseTransfer { - return $this->getTransactionHandler()->handleTransaction(function () use ($paymentMethodTransfer) { - return $this->executeUpdatePaymentMethodTransaction($paymentMethodTransfer); - }); + public function updatePaymentMethod(UpdatePaymentMethodTransfer $updatePaymentMethodTransfer): PaymentMethodTransfer + { + $paymentMethodTransfer = $this->paymentMethodEventMapper->mapUpdatePaymentMethodTransferToPaymentMethodTransfer( + $updatePaymentMethodTransfer, + new PaymentMethodTransfer(), + ); + + $existingPaymentMethodTransfer = $this->findExistingPaymentMethod($paymentMethodTransfer); + + return $this->savePaymentMethod($paymentMethodTransfer, $existingPaymentMethodTransfer); } /** @@ -141,10 +146,11 @@ public function enableForeignPaymentMethod(AddPaymentMethodTransfer $addPaymentM ); $messageAttributes = $addPaymentMethodTransfer->getMessageAttributesOrFail(); + $storeTransfer = $this->storeFacade->getStoreByStoreReference( $addPaymentMethodTransfer->getMessageAttributesOrFail()->getStoreReferenceOrFail(), ); - $existingPaymentMethodTransfer = $this->findExistentPaymentMethod( + $existingPaymentMethodTransfer = $this->findExistingPaymentMethod( $paymentMethodTransfer, $storeTransfer, ); @@ -180,7 +186,7 @@ public function addPaymentMethod(AddPaymentMethodTransfer $addPaymentMethodTrans $paymentMethodTransfer->setPaymentMethodKey($this->getPaymentMethodKey($paymentMethodTransfer)); $messageAttributes = $addPaymentMethodTransfer->getMessageAttributesOrFail(); - $existingPaymentMethodTransfer = $this->findExistentPaymentMethod($paymentMethodTransfer); + $existingPaymentMethodTransfer = $this->findExistingPaymentMethod($paymentMethodTransfer); if ( $existingPaymentMethodTransfer @@ -221,7 +227,7 @@ public function disableForeignPaymentMethod(DeletePaymentMethodTransfer $deleteP $storeTransfer = $this->storeFacade->getStoreByStoreReference( $deletePaymentMethodTransfer->getMessageAttributesOrFail()->getStoreReferenceOrFail(), ); - $existingPaymentMethodTransfer = $this->findExistentPaymentMethod( + $existingPaymentMethodTransfer = $this->findExistingPaymentMethod( $paymentMethodTransfer, $storeTransfer, ); @@ -261,7 +267,7 @@ public function deletePaymentMethod(DeletePaymentMethodTransfer $deletePaymentMe ->requireGroupName(); $messageAttributes = $deletePaymentMethodTransfer->getMessageAttributesOrFail(); - $existingPaymentMethodTransfer = $this->findExistentPaymentMethod($paymentMethodTransfer); + $existingPaymentMethodTransfer = $this->findExistingPaymentMethod($paymentMethodTransfer); if ( $existingPaymentMethodTransfer @@ -384,7 +390,7 @@ protected function savePaymentMethodWithStoreRelation( ->addStores($storeTransfer) ->addIdStores($storeTransfer->getIdStore()); - $paymentMethodResponseTransfer = $this->updatePaymentMethod($existingPaymentMethodTransfer); + $paymentMethodResponseTransfer = $this->update($existingPaymentMethodTransfer); } else { $storeRelationTransfer = $paymentMethodTransfer->getStoreRelation() ?? new StoreRelationTransfer(); $storeRelationTransfer @@ -426,11 +432,10 @@ protected function savePaymentMethod( * * @return \Generated\Shared\Transfer\PaymentMethodResponseTransfer */ - protected function executeUpdatePaymentMethodTransaction( + protected function executeUpdateTransaction( PaymentMethodTransfer $paymentMethodTransfer ): PaymentMethodResponseTransfer { - $paymentMethodTransfer->requireIdPaymentMethod() - ->requireStoreRelation(); + $paymentMethodTransfer->requireIdPaymentMethod(); $storeRelationTransfer = $paymentMethodTransfer->getStoreRelation() ->setIdEntity($paymentMethodTransfer->getIdPaymentMethod()); @@ -451,30 +456,6 @@ protected function executeUpdatePaymentMethodTransaction( ->setPaymentMethod($paymentMethodTransfer); } - /** - * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer - * - * @return \Generated\Shared\Transfer\PaymentMethodResponseTransfer - */ - protected function executeUpdateTransaction( - PaymentMethodTransfer $paymentMethodTransfer - ): PaymentMethodResponseTransfer { - $paymentMethodTransfer->requireIdPaymentMethod(); - - $paymentMethodTransfer = $this->paymentEntityManager - ->updatePaymentMethod($paymentMethodTransfer); - - if ($paymentMethodTransfer === null) { - return (new PaymentMethodResponseTransfer()) - ->setIsSuccessful(false) - ->addMessage($this->getErrorMessageTransfer(static::MESSAGE_UPDATE_ERROR)); - } - - return (new PaymentMethodResponseTransfer()) - ->setIsSuccessful(true) - ->setPaymentMethod($paymentMethodTransfer); - } - /** * @param string $paymentProviderName * @@ -522,7 +503,7 @@ protected function generateNowTimestamp(): string * * @return \Generated\Shared\Transfer\PaymentMethodTransfer|null */ - protected function findExistentPaymentMethod( + protected function findExistingPaymentMethod( PaymentMethodTransfer $paymentMethodTransfer, ?StoreTransfer $storeTransfer = null ): ?PaymentMethodTransfer { diff --git a/src/Spryker/Zed/Payment/Business/Method/PaymentMethodUpdaterInterface.php b/src/Spryker/Zed/Payment/Business/Method/PaymentMethodUpdaterInterface.php index 247cfb6..97593a2 100644 --- a/src/Spryker/Zed/Payment/Business/Method/PaymentMethodUpdaterInterface.php +++ b/src/Spryker/Zed/Payment/Business/Method/PaymentMethodUpdaterInterface.php @@ -11,17 +11,16 @@ use Generated\Shared\Transfer\DeletePaymentMethodTransfer; use Generated\Shared\Transfer\PaymentMethodResponseTransfer; use Generated\Shared\Transfer\PaymentMethodTransfer; +use Generated\Shared\Transfer\UpdatePaymentMethodTransfer; interface PaymentMethodUpdaterInterface { /** - * @deprecated Use {@link \Spryker\Zed\Payment\Business\Method\PaymentMethodUpdaterInterface::update()} instead. + * @param \Generated\Shared\Transfer\UpdatePaymentMethodTransfer $updatePaymentMethodTransfer * - * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer - * - * @return \Generated\Shared\Transfer\PaymentMethodResponseTransfer + * @return \Generated\Shared\Transfer\PaymentMethodTransfer */ - public function updatePaymentMethod(PaymentMethodTransfer $paymentMethodTransfer): PaymentMethodResponseTransfer; + public function updatePaymentMethod(UpdatePaymentMethodTransfer $updatePaymentMethodTransfer): PaymentMethodTransfer; /** * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer diff --git a/src/Spryker/Zed/Payment/Business/PaymentBusinessFactory.php b/src/Spryker/Zed/Payment/Business/PaymentBusinessFactory.php index 22017ce..148c14c 100644 --- a/src/Spryker/Zed/Payment/Business/PaymentBusinessFactory.php +++ b/src/Spryker/Zed/Payment/Business/PaymentBusinessFactory.php @@ -10,10 +10,10 @@ use Spryker\Client\Payment\PaymentClientInterface; use Spryker\Service\Payment\PaymentServiceInterface; use Spryker\Zed\Kernel\Business\AbstractBusinessFactory; -use Spryker\Zed\Payment\Business\Authorizer\ForeignPaymentAuthorizer; -use Spryker\Zed\Payment\Business\Authorizer\ForeignPaymentAuthorizerInterface; use Spryker\Zed\Payment\Business\Calculation\PaymentCalculator; +use Spryker\Zed\Payment\Business\Calculation\PaymentCalculatorInterface; use Spryker\Zed\Payment\Business\Checkout\PaymentPluginExecutor; +use Spryker\Zed\Payment\Business\Checkout\PaymentPluginExecutorInterface; use Spryker\Zed\Payment\Business\Creator\PaymentMethodCreator; use Spryker\Zed\Payment\Business\Creator\PaymentMethodCreatorInterface; use Spryker\Zed\Payment\Business\Creator\PaymentProviderCreator; @@ -26,17 +26,22 @@ use Spryker\Zed\Payment\Business\EventEmitter\PaymentMessageOmsEventEmitterInterface; use Spryker\Zed\Payment\Business\Expander\PaymentExpander; use Spryker\Zed\Payment\Business\Expander\PaymentExpanderInterface; +use Spryker\Zed\Payment\Business\ForeignPayment\ForeignPayment; +use Spryker\Zed\Payment\Business\ForeignPayment\ForeignPaymentInterface; use Spryker\Zed\Payment\Business\Generator\PaymentMethodKeyGenerator; use Spryker\Zed\Payment\Business\Generator\PaymentMethodKeyGeneratorInterface; use Spryker\Zed\Payment\Business\Mapper\PaymentMethodEventMapper; use Spryker\Zed\Payment\Business\Mapper\PaymentMethodEventMapperInterface; use Spryker\Zed\Payment\Business\Mapper\QuoteDataMapper; use Spryker\Zed\Payment\Business\Mapper\QuoteDataMapperInterface; +use Spryker\Zed\Payment\Business\MessageConsumer\PaymentMessageConsumer; +use Spryker\Zed\Payment\Business\MessageConsumer\PaymentMessageConsumerInterface; use Spryker\Zed\Payment\Business\MessageEmitter\MessageEmitter; use Spryker\Zed\Payment\Business\MessageEmitter\MessageEmitterInterface; use Spryker\Zed\Payment\Business\Method\PaymentMethodFinder; use Spryker\Zed\Payment\Business\Method\PaymentMethodFinderInterface; use Spryker\Zed\Payment\Business\Method\PaymentMethodReader; +use Spryker\Zed\Payment\Business\Method\PaymentMethodReaderInterface; use Spryker\Zed\Payment\Business\Method\PaymentMethodStoreRelationUpdater; use Spryker\Zed\Payment\Business\Method\PaymentMethodStoreRelationUpdaterInterface; use Spryker\Zed\Payment\Business\Method\PaymentMethodUpdater; @@ -44,8 +49,11 @@ use Spryker\Zed\Payment\Business\Method\PaymentMethodValidator; use Spryker\Zed\Payment\Business\Method\PaymentMethodValidatorInterface as DeprecatedPaymentMethodValidatorInterface; use Spryker\Zed\Payment\Business\Order\SalesPaymentHydrator; +use Spryker\Zed\Payment\Business\Order\SalesPaymentHydratorInterface; use Spryker\Zed\Payment\Business\Order\SalesPaymentReader; +use Spryker\Zed\Payment\Business\Order\SalesPaymentReaderInterface; use Spryker\Zed\Payment\Business\Order\SalesPaymentSaver; +use Spryker\Zed\Payment\Business\Order\SalesPaymentSaverInterface; use Spryker\Zed\Payment\Business\PaymentProviderValidator\PaymentProviderExistsValidator; use Spryker\Zed\Payment\Business\PaymentProviderValidator\PaymentProviderPaymentMethodExistsValidator; use Spryker\Zed\Payment\Business\PaymentProviderValidator\PaymentProviderPaymentMethodUniqueValidator; @@ -61,10 +69,14 @@ use Spryker\Zed\Payment\Business\Validator\PaymentMethod\PaymentMethodValidatorInterface; use Spryker\Zed\Payment\Business\Writer\PaymentWriter; use Spryker\Zed\Payment\Business\Writer\PaymentWriterInterface; +use Spryker\Zed\Payment\Dependency\Facade\PaymentToKernelAppFacadeInterface; use Spryker\Zed\Payment\Dependency\Facade\PaymentToLocaleFacadeInterface; use Spryker\Zed\Payment\Dependency\Facade\PaymentToMessageBrokerInterface; use Spryker\Zed\Payment\Dependency\Facade\PaymentToOmsFacadeInterface; use Spryker\Zed\Payment\Dependency\Facade\PaymentToStoreFacadeInterface; +use Spryker\Zed\Payment\Dependency\Plugin\Checkout\CheckoutPluginCollectionInterface; +use Spryker\Zed\Payment\Dependency\Plugin\Sales\PaymentHydratorPluginCollectionInterface; +use Spryker\Zed\Payment\Dependency\Service\PaymentToUtilEncodingServiceInterface; use Spryker\Zed\Payment\Dependency\Service\PaymentToUtilTextServiceInterface; use Spryker\Zed\Payment\PaymentDependencyProvider; @@ -79,7 +91,7 @@ class PaymentBusinessFactory extends AbstractBusinessFactory /** * @return \Spryker\Zed\Payment\Business\Method\PaymentMethodReaderInterface */ - public function createPaymentMethodReader() + public function createPaymentMethodReader(): PaymentMethodReaderInterface { return new PaymentMethodReader( $this->getPaymentMethodFilterPlugins(), @@ -89,23 +101,6 @@ public function createPaymentMethodReader() ); } - /** - * @return \Spryker\Zed\Payment\Business\Authorizer\ForeignPaymentAuthorizerInterface - */ - public function createForeignPaymentAuthorizer(): ForeignPaymentAuthorizerInterface - { - return new ForeignPaymentAuthorizer( - $this->createQuoteDataMapper(), - $this->getLocaleFacade(), - $this->getRepository(), - $this->getPaymentClient(), - $this->getConfig(), - $this->getStoreFacade(), - $this->getPaymentService(), - $this->getPaymentAuthorizeRequestExpanderPlugins(), - ); - } - /** * @return \Spryker\Client\Payment\PaymentClientInterface */ @@ -130,6 +125,14 @@ public function getLocaleFacade(): PaymentToLocaleFacadeInterface return $this->getProvidedDependency(PaymentDependencyProvider::FACADE_LOCALE); } + /** + * @return \Spryker\Zed\Payment\Dependency\Facade\PaymentToKernelAppFacadeInterface + */ + public function getKernelAppFacade(): PaymentToKernelAppFacadeInterface + { + return $this->getProvidedDependency(PaymentDependencyProvider::FACADE_KERNEL_APP); + } + /** * @return \Spryker\Service\Payment\PaymentServiceInterface */ @@ -160,7 +163,7 @@ public function createPaymentMethodEventMapper(): PaymentMethodEventMapperInterf /** * @return \Spryker\Zed\Payment\Business\Calculation\PaymentCalculatorInterface */ - public function createPaymentCalculator() + public function createPaymentCalculator(): PaymentCalculatorInterface { return new PaymentCalculator(); } @@ -216,10 +219,18 @@ public function getUtilTextService(): PaymentToUtilTextServiceInterface return $this->getProvidedDependency(PaymentDependencyProvider::SERVICE_UTIL_TEXT); } + /** + * @return \Spryker\Zed\Payment\Dependency\Service\PaymentToUtilEncodingServiceInterface + */ + public function getUtilEncodingService(): PaymentToUtilEncodingServiceInterface + { + return $this->getProvidedDependency(PaymentDependencyProvider::SERVICE_UTIL_ENCODING); + } + /** * @return array<\Spryker\Zed\PaymentExtension\Dependency\Plugin\PaymentMethodFilterPluginInterface> */ - public function getPaymentMethodFilterPlugins() + public function getPaymentMethodFilterPlugins(): array { return $this->getProvidedDependency(PaymentDependencyProvider::PAYMENT_METHOD_FILTER_PLUGINS); } @@ -245,7 +256,7 @@ public function createPaymentWriter(): PaymentWriterInterface * * @return \Spryker\Zed\Payment\Business\Checkout\PaymentPluginExecutorInterface */ - public function createCheckoutPaymentPluginExecutor() + public function createCheckoutPaymentPluginExecutor(): PaymentPluginExecutorInterface { return new PaymentPluginExecutor($this->getCheckoutPlugins(), $this->createPaymentSaver()); } @@ -255,7 +266,7 @@ public function createCheckoutPaymentPluginExecutor() * * @return \Spryker\Zed\Payment\Business\Order\SalesPaymentSaverInterface */ - public function createPaymentSaver() + public function createPaymentSaver(): SalesPaymentSaverInterface { return new SalesPaymentSaver($this->getQueryContainer()); } @@ -265,7 +276,7 @@ public function createPaymentSaver() * * @return \Spryker\Zed\Payment\Dependency\Plugin\Checkout\CheckoutPluginCollectionInterface */ - public function getCheckoutPlugins() + public function getCheckoutPlugins(): CheckoutPluginCollectionInterface { return $this->getProvidedDependency(PaymentDependencyProvider::CHECKOUT_PLUGINS); } @@ -275,7 +286,7 @@ public function getCheckoutPlugins() * * @return \Spryker\Zed\Payment\Business\Order\SalesPaymentHydratorInterface */ - public function createPaymentHydrator() + public function createPaymentHydrator(): SalesPaymentHydratorInterface { return new SalesPaymentHydrator( $this->getPaymentHydrationPlugins(), @@ -288,7 +299,7 @@ public function createPaymentHydrator() * * @return \Spryker\Zed\Payment\Dependency\Plugin\Sales\PaymentHydratorPluginCollectionInterface */ - public function getPaymentHydrationPlugins() + public function getPaymentHydrationPlugins(): PaymentHydratorPluginCollectionInterface { return $this->getProvidedDependency(PaymentDependencyProvider::PAYMENT_HYDRATION_PLUGINS); } @@ -298,7 +309,7 @@ public function getPaymentHydrationPlugins() * * @return \Spryker\Zed\Payment\Business\Order\SalesPaymentReaderInterface */ - public function createSalesPaymentReader() + public function createSalesPaymentReader(): SalesPaymentReaderInterface { return new SalesPaymentReader( $this->getQueryContainer(), @@ -350,14 +361,6 @@ public function createPaymentMessageOmsEventEmitter(): PaymentMessageOmsEventEmi ); } - /** - * @return array - */ - public function getPaymentAuthorizeRequestExpanderPlugins(): array - { - return $this->getProvidedDependency(PaymentDependencyProvider::PLUGINS_PAYMENT_AUTHORIZE_REQUEST_EXPANDER); - } - /** * @return \Spryker\Zed\Payment\Business\Creator\PaymentProviderCreatorInterface */ @@ -508,4 +511,29 @@ public function createPaymentExpander(): PaymentExpanderInterface $this->getStoreFacade(), ); } + + /** + * @return \Spryker\Zed\Payment\Business\MessageConsumer\PaymentMessageConsumerInterface + */ + public function createPaymentMessageConsumer(): PaymentMessageConsumerInterface + { + return new PaymentMessageConsumer($this->createPaymentMethodUpdater()); + } + + /** + * @return \Spryker\Zed\Payment\Business\ForeignPayment\ForeignPaymentInterface + */ + public function createForeignPayment(): ForeignPaymentInterface + { + return new ForeignPayment( + $this->createQuoteDataMapper(), + $this->getLocaleFacade(), + $this->getKernelAppFacade(), + $this->getRepository(), + $this->getPaymentClient(), + $this->getConfig(), + $this->getPaymentService(), + $this->getUtilEncodingService(), + ); + } } diff --git a/src/Spryker/Zed/Payment/Business/PaymentFacade.php b/src/Spryker/Zed/Payment/Business/PaymentFacade.php index 84fbbfa..039604a 100644 --- a/src/Spryker/Zed/Payment/Business/PaymentFacade.php +++ b/src/Spryker/Zed/Payment/Business/PaymentFacade.php @@ -28,9 +28,12 @@ use Generated\Shared\Transfer\PaymentProviderResponseTransfer; use Generated\Shared\Transfer\PaymentProviderTransfer; use Generated\Shared\Transfer\PaymentTransfer; +use Generated\Shared\Transfer\PreOrderPaymentRequestTransfer; +use Generated\Shared\Transfer\PreOrderPaymentResponseTransfer; use Generated\Shared\Transfer\QuoteTransfer; use Generated\Shared\Transfer\SalesPaymentTransfer; use Generated\Shared\Transfer\StoreTransfer; +use Spryker\Shared\Kernel\Transfer\AbstractTransfer; use Spryker\Shared\Kernel\Transfer\TransferInterface; use Spryker\Zed\Kernel\Business\AbstractFacade; @@ -72,8 +75,57 @@ public function initForeignPaymentForCheckoutProcess( CheckoutResponseTransfer $checkoutResponseTransfer ): void { $this->getFactory() - ->createForeignPaymentAuthorizer() - ->initForeignPaymentForCheckoutProcess($quoteTransfer, $checkoutResponseTransfer); + ->createForeignPayment() + ->initializePayment($quoteTransfer, $checkoutResponseTransfer); + } + + /** + * {@inheritDoc} + * + * @api + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function initializePreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + return $this->getFactory()->createForeignPayment()->initializePreOrderPayment($preOrderPaymentRequestTransfer); + } + + /** + * {@inheritDoc} + * + * @api + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function cancelPreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + return $this->getFactory()->createForeignPayment()->cancelPreOrderPayment($preOrderPaymentRequestTransfer); + } + + /** + * {@inheritDoc} + * + * @api + * + * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer + * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer + * + * @return void + */ + public function confirmPreOrderPayment( + QuoteTransfer $quoteTransfer, + CheckoutResponseTransfer $checkoutResponseTransfer + ): void { + $this->getFactory() + ->createForeignPayment() + ->confirmPreOrderPayment($quoteTransfer, $checkoutResponseTransfer); } /** @@ -112,6 +164,20 @@ public function addPaymentMethod(AddPaymentMethodTransfer|PaymentMethodAddedTran ->addPaymentMethod($addPaymentMethodTransfer); } + /** + * {@inheritDoc} + * + * @api + * + * @param \Generated\Shared\Transfer\AddPaymentMethodTransfer|\Generated\Shared\Transfer\UpdatePaymentMethodTransfer|\Generated\Shared\Transfer\DeletePaymentMethodTransfer $messageTransfer + * + * @return void + */ + public function consumePaymentMethodMessage(AbstractTransfer $messageTransfer): void + { + $this->getFactory()->createPaymentMessageConsumer()->consumePaymentMessage($messageTransfer); + } + /** * @deprecated Will be removed with next major. This is only an intermediate solution to support both transfer types in {@link \Spryker\Zed\Payment\Business\PaymentFacade::addPaymentMethod()} * @@ -230,7 +296,7 @@ public function updatePaymentMethod( ): PaymentMethodResponseTransfer { return $this->getFactory() ->createPaymentMethodUpdater() - ->updatePaymentMethod($paymentMethodTransfer); + ->update($paymentMethodTransfer); } /** diff --git a/src/Spryker/Zed/Payment/Business/PaymentFacadeInterface.php b/src/Spryker/Zed/Payment/Business/PaymentFacadeInterface.php index 7c9c49b..779607c 100644 --- a/src/Spryker/Zed/Payment/Business/PaymentFacadeInterface.php +++ b/src/Spryker/Zed/Payment/Business/PaymentFacadeInterface.php @@ -28,9 +28,12 @@ use Generated\Shared\Transfer\PaymentProviderResponseTransfer; use Generated\Shared\Transfer\PaymentProviderTransfer; use Generated\Shared\Transfer\PaymentTransfer; +use Generated\Shared\Transfer\PreOrderPaymentRequestTransfer; +use Generated\Shared\Transfer\PreOrderPaymentResponseTransfer; use Generated\Shared\Transfer\QuoteTransfer; use Generated\Shared\Transfer\SalesPaymentTransfer; use Generated\Shared\Transfer\StoreTransfer; +use Spryker\Shared\Kernel\Transfer\AbstractTransfer; use Spryker\Shared\Kernel\Transfer\TransferInterface; /** @@ -77,6 +80,55 @@ public function initForeignPaymentForCheckoutProcess( CheckoutResponseTransfer $checkoutResponseTransfer ): void; + /** + * Specification: + * - Initializes a pre-order payment (pre-order is before the order gets persisted). + * - Requires `PreOrderPaymentRequestTransfer::QUOTE` to be set. + * - Requires `PreOrderPaymentRequestTransfer::PAYMENT_METHOD` to be set. + * - Returns `PreOrderPaymentResponseTransfer::IS_SUCCESS` true if the payment was initialized. + * + * @api + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function initializePreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer; + + /** + * Specification: + * - Cancels a pre-order payment (pre-order is before the order gets persisted). + * - Requires `PreOrderPaymentResponseTransfer::PAYMENT_METHOD` to be set. + * - Returns `PreOrderPaymentResponseTransfer::IS_SUCCESS` true if the cancellation was successful. + * + * @api + * + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function cancelPreOrderPayment( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer; + + /** + * Specification: + * - Confirms a pre-order payment after the order was persisted. + * + * @api + * + * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer + * @param \Generated\Shared\Transfer\CheckoutResponseTransfer $checkoutResponseTransfer + * + * @return void + */ + public function confirmPreOrderPayment( + QuoteTransfer $quoteTransfer, + CheckoutResponseTransfer $checkoutResponseTransfer + ): void; + /** * Specification: * - Used to support only foreign payment methods. @@ -92,7 +144,7 @@ public function initForeignPaymentForCheckoutProcess( * * @api * - * @deprecated Use {@link \Spryker\Zed\Payment\Business\PaymentFacadeInterface::addPaymentMethod()} instead. + * @deprecated Use {@link \Spryker\Zed\Payment\Business\PaymentFacadeInterface::consumePaymentMethodMessage()} instead. * * @param \Generated\Shared\Transfer\AddPaymentMethodTransfer|\Generated\Shared\Transfer\PaymentMethodAddedTransfer $addPaymentMethodTransfer * @@ -103,8 +155,8 @@ public function enableForeignPaymentMethod(AddPaymentMethodTransfer|PaymentMetho /** * Specification: * - Used to support only foreign payment methods. - * - Requires `AddPaymentMethod.labelName` transfer field to be set. - * - Requires `AddPaymentMethod.groupName` transfer field to be set. + * - Requires `AddPaymentMethod.name` transfer field to be set. + * - Requires `AddPaymentMethod.providerName` transfer field to be set. * - Creates payment provider if respective provider doesn't exist in the database. * - Creates payment method if the payment method with provided key doesn't exist in the database. * - Updates payment method if the payment method with provided key exist in the database. @@ -114,12 +166,33 @@ public function enableForeignPaymentMethod(AddPaymentMethodTransfer|PaymentMetho * * @api * + * @deprecated Use {@link \Spryker\Zed\Payment\Business\PaymentFacadeInterface::consumePaymentMethodMessage()} instead. + * * @param \Generated\Shared\Transfer\AddPaymentMethodTransfer|\Generated\Shared\Transfer\PaymentMethodAddedTransfer $addPaymentMethodTransfer * * @return \Generated\Shared\Transfer\PaymentMethodTransfer */ public function addPaymentMethod(AddPaymentMethodTransfer|PaymentMethodAddedTransfer $addPaymentMethodTransfer): PaymentMethodTransfer; + /** + * Specification: + * - Used to support only foreign payment methods. + * - Requires `AbstractTransfer.name` transfer field to be set. + * - Requires `AbstractTransfer.providerName` transfer field to be set. + * - When used with `AddPaymentMethodTransfer`: PaymentMethod will be created if it doesn't exist in the database. + * - When used with `UpdatePaymentMethodTransfer`: PaymentMethod will be updated if it exists in the database. + * - When use with `DeletePaymentMethodTransfer`: PaymentMethod will be hidden if it exists in the database. + * - Checks if there's a `UpdatePaymentMethod.messageAttributes.timestamp` and proceed with action only if it's null or newer than `last_message_timestamp`. + * - Returns `PaymentMethod` transfer filled with payment method data. + * + * @api + * + * @param \Generated\Shared\Transfer\AddPaymentMethodTransfer|\Generated\Shared\Transfer\UpdatePaymentMethodTransfer|\Generated\Shared\Transfer\DeletePaymentMethodTransfer $messageTransfer + * + * @return void + */ + public function consumePaymentMethodMessage(AbstractTransfer $messageTransfer): void; + /** * Specification: * - Used to support only foreign payment methods. diff --git a/src/Spryker/Zed/Payment/Communication/Controller/GatewayController.php b/src/Spryker/Zed/Payment/Communication/Controller/GatewayController.php index bad4cfb..403b52a 100644 --- a/src/Spryker/Zed/Payment/Communication/Controller/GatewayController.php +++ b/src/Spryker/Zed/Payment/Communication/Controller/GatewayController.php @@ -7,6 +7,9 @@ namespace Spryker\Zed\Payment\Communication\Controller; +use Generated\Shared\Transfer\PaymentMethodsTransfer; +use Generated\Shared\Transfer\PreOrderPaymentRequestTransfer; +use Generated\Shared\Transfer\PreOrderPaymentResponseTransfer; use Generated\Shared\Transfer\QuoteTransfer; use Spryker\Zed\Kernel\Communication\Controller\AbstractGatewayController; @@ -18,12 +21,34 @@ */ class GatewayController extends AbstractGatewayController { + /** + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function initializePreOrderPaymentAction( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + return $this->getFacade()->initializePreOrderPayment($preOrderPaymentRequestTransfer); + } + + /** + * @param \Generated\Shared\Transfer\PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + * + * @return \Generated\Shared\Transfer\PreOrderPaymentResponseTransfer + */ + public function cancelPreOrderPaymentAction( + PreOrderPaymentRequestTransfer $preOrderPaymentRequestTransfer + ): PreOrderPaymentResponseTransfer { + return $this->getFacade()->cancelPreOrderPayment($preOrderPaymentRequestTransfer); + } + /** * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer * * @return \Generated\Shared\Transfer\PaymentMethodsTransfer */ - public function getAvailableMethodsAction(QuoteTransfer $quoteTransfer) + public function getAvailableMethodsAction(QuoteTransfer $quoteTransfer): PaymentMethodsTransfer { return $this->getFacade()->getAvailableMethods($quoteTransfer); } diff --git a/src/Spryker/Zed/Payment/Communication/Plugin/Checkout/PaymentConfirmPreOrderPaymentCheckoutPostSavePlugin.php b/src/Spryker/Zed/Payment/Communication/Plugin/Checkout/PaymentConfirmPreOrderPaymentCheckoutPostSavePlugin.php new file mode 100644 index 0000000..1cf537d --- /dev/null +++ b/src/Spryker/Zed/Payment/Communication/Plugin/Checkout/PaymentConfirmPreOrderPaymentCheckoutPostSavePlugin.php @@ -0,0 +1,41 @@ +getFacade()->confirmPreOrderPayment($quoteTransfer, $checkoutResponseTransfer); + } +} diff --git a/src/Spryker/Zed/Payment/Communication/Plugin/MessageBroker/PaymentMethodMessageHandlerPlugin.php b/src/Spryker/Zed/Payment/Communication/Plugin/MessageBroker/PaymentMethodMessageHandlerPlugin.php index 276ba3e..8a27ca4 100644 --- a/src/Spryker/Zed/Payment/Communication/Plugin/MessageBroker/PaymentMethodMessageHandlerPlugin.php +++ b/src/Spryker/Zed/Payment/Communication/Plugin/MessageBroker/PaymentMethodMessageHandlerPlugin.php @@ -11,6 +11,7 @@ use Generated\Shared\Transfer\DeletePaymentMethodTransfer; use Generated\Shared\Transfer\PaymentMethodAddedTransfer; use Generated\Shared\Transfer\PaymentMethodDeletedTransfer; +use Generated\Shared\Transfer\UpdatePaymentMethodTransfer; use Spryker\Zed\Kernel\Communication\AbstractPlugin; use Spryker\Zed\MessageBrokerExtension\Dependency\Plugin\MessageHandlerPluginInterface; @@ -22,6 +23,23 @@ */ class PaymentMethodMessageHandlerPlugin extends AbstractPlugin implements MessageHandlerPluginInterface { + /** + * {@inheritDoc} + * + * @api + * + * @return iterable + */ + public function handles(): iterable + { + yield AddPaymentMethodTransfer::class => [$this->getFacade(), 'consumePaymentMethodMessage']; + yield UpdatePaymentMethodTransfer::class => [$this->getFacade(), 'consumePaymentMethodMessage']; + yield DeletePaymentMethodTransfer::class => [$this->getFacade(), 'consumePaymentMethodMessage']; + // @deprecated + yield PaymentMethodAddedTransfer::class => [$this, 'onPaymentMethodAdded']; + yield PaymentMethodDeletedTransfer::class => [$this, 'onPaymentMethodDeleted']; + } + /** * @deprecated Don't use this method directly, this method is only used for BC reasons. * @@ -49,22 +67,4 @@ public function onPaymentMethodDeleted(PaymentMethodDeletedTransfer $paymentMeth $this->getFacade()->deletePaymentMethod($deletePaymentMethodTransfer); } - - /** - * {@inheritDoc} - * - * @api - * - * @return iterable - */ - public function handles(): iterable - { - return [ - AddPaymentMethodTransfer::class => [$this->getFacade(), 'addPaymentMethod'], - DeletePaymentMethodTransfer::class => [$this->getFacade(), 'deletePaymentMethod'], - // @deprecated - PaymentMethodAddedTransfer::class => [$this, 'onPaymentMethodAdded'], - PaymentMethodDeletedTransfer::class => [$this, 'onPaymentMethodDeleted'], - ]; - } } diff --git a/src/Spryker/Zed/Payment/Dependency/Facade/PaymentToKernelAppFacadeBridge.php b/src/Spryker/Zed/Payment/Dependency/Facade/PaymentToKernelAppFacadeBridge.php new file mode 100644 index 0000000..046e224 --- /dev/null +++ b/src/Spryker/Zed/Payment/Dependency/Facade/PaymentToKernelAppFacadeBridge.php @@ -0,0 +1,37 @@ +kernelAppFacade = $kernelAppFacade; + } + + /** + * @param \Generated\Shared\Transfer\AcpHttpRequestTransfer $acpHttpRequestTransfer + * + * @return \Generated\Shared\Transfer\AcpHttpResponseTransfer + */ + public function makeRequest(AcpHttpRequestTransfer $acpHttpRequestTransfer): AcpHttpResponseTransfer + { + return $this->kernelAppFacade->makeRequest($acpHttpRequestTransfer); + } +} diff --git a/src/Spryker/Zed/Payment/Dependency/Facade/PaymentToKernelAppFacadeInterface.php b/src/Spryker/Zed/Payment/Dependency/Facade/PaymentToKernelAppFacadeInterface.php new file mode 100644 index 0000000..f23ff9a --- /dev/null +++ b/src/Spryker/Zed/Payment/Dependency/Facade/PaymentToKernelAppFacadeInterface.php @@ -0,0 +1,21 @@ +utilEncodingService = $utilEncodingService; + } + + /** + * @param array $value + * @param int|null $options + * @param int|null $depth + * + * @return string|null + */ + public function encodeJson(array $value, ?int $options = null, ?int $depth = null): ?string + { + return $this->utilEncodingService->encodeJson($value, $options, $depth); + } + + /** + * @param string $jsonValue + * @param bool $assoc Deprecated: `false` is deprecated, always use `true` for array return. + * @param int|null $depth + * @param int|null $options + * + * @return object|array|null Deprecated: `object` return value is deprecated. + */ + public function decodeJson(string $jsonValue, bool $assoc = false, ?int $depth = null, ?int $options = null): mixed + { + return $this->utilEncodingService->decodeJson($jsonValue, $assoc, $depth, $options); + } +} diff --git a/src/Spryker/Zed/Payment/Dependency/Service/PaymentToUtilEncodingServiceInterface.php b/src/Spryker/Zed/Payment/Dependency/Service/PaymentToUtilEncodingServiceInterface.php new file mode 100644 index 0000000..25706c3 --- /dev/null +++ b/src/Spryker/Zed/Payment/Dependency/Service/PaymentToUtilEncodingServiceInterface.php @@ -0,0 +1,30 @@ + $value + * @param int|null $options + * @param int|null $depth + * + * @return string|null + */ + public function encodeJson(array $value, ?int $options = null, ?int $depth = null): ?string; + + /** + * @param string $jsonValue + * @param bool $assoc Deprecated: `false` is deprecated, always use `true` for array return. + * @param int|null $depth + * @param int|null $options + * + * @return object|array|null Deprecated: `object` return value is deprecated. + */ + public function decodeJson(string $jsonValue, bool $assoc = false, ?int $depth = null, ?int $options = null): mixed; +} diff --git a/src/Spryker/Zed/Payment/PaymentConfig.php b/src/Spryker/Zed/Payment/PaymentConfig.php index e6222c3..0f2454c 100644 --- a/src/Spryker/Zed/Payment/PaymentConfig.php +++ b/src/Spryker/Zed/Payment/PaymentConfig.php @@ -46,6 +46,26 @@ class PaymentConfig extends AbstractBundleConfig */ protected const BASE_URL_YVES = 'APPLICATION:BASE_URL_YVES'; + /** + * @var string + */ + public const PAYMENT_SERVICE_PROVIDER_ENDPOINT_NAME_AUTHORIZATION = 'authorization'; + + /** + * @var string + */ + public const PAYMENT_SERVICE_PROVIDER_ENDPOINT_NAME_PRE_ORDER_CONFIRMATION = 'pre-order-confirmation'; + + /** + * @var string + */ + public const PAYMENT_SERVICE_PROVIDER_ENDPOINT_NAME_PRE_ORDER_CANCELLATION = 'pre-order-cancellation'; + + /** + * @var string + */ + public const PRE_ORDER_PAYMENT_DATA_FIELD = 'preOrderPaymentData'; + /** * Specification: * - Returns a map of the payment methods and state machine's processes names. diff --git a/src/Spryker/Zed/Payment/PaymentDependencyProvider.php b/src/Spryker/Zed/Payment/PaymentDependencyProvider.php index 3440b0f..00ef231 100644 --- a/src/Spryker/Zed/Payment/PaymentDependencyProvider.php +++ b/src/Spryker/Zed/Payment/PaymentDependencyProvider.php @@ -9,6 +9,7 @@ use Spryker\Zed\Kernel\AbstractBundleDependencyProvider; use Spryker\Zed\Kernel\Container; +use Spryker\Zed\Payment\Dependency\Facade\PaymentToKernelAppFacadeBridge; use Spryker\Zed\Payment\Dependency\Facade\PaymentToLocaleFacadeBridge; use Spryker\Zed\Payment\Dependency\Facade\PaymentToMessageBrokerBridge; use Spryker\Zed\Payment\Dependency\Facade\PaymentToOmsFacadeBridge; @@ -16,6 +17,8 @@ use Spryker\Zed\Payment\Dependency\Plugin\Checkout\CheckoutPluginCollection; use Spryker\Zed\Payment\Dependency\Plugin\Sales\PaymentHydratorPluginCollection; use Spryker\Zed\Payment\Dependency\Plugin\Sales\PaymentHydratorPluginCollectionInterface; +use Spryker\Zed\Payment\Dependency\Service\PaymentToUtilEncodingServiceBridge; +use Spryker\Zed\Payment\Dependency\Service\PaymentToUtilEncodingServiceInterface; use Spryker\Zed\Payment\Dependency\Service\PaymentToUtilTextServiceBridge; /** @@ -33,6 +36,11 @@ class PaymentDependencyProvider extends AbstractBundleDependencyProvider */ public const SERVICE_UTIL_TEXT = 'SERVICE_UTIL_TEXT'; + /** + * @var string + */ + public const SERVICE_UTIL_ENCODING = 'SERVICE_UTIL_ENCODING'; + /** * @var string */ @@ -76,6 +84,8 @@ class PaymentDependencyProvider extends AbstractBundleDependencyProvider public const PAYMENT_HYDRATION_PLUGINS = 'payment hydration plugins'; /** + * @deprecated Use {@link \Spryker\Zed\Payment\Business\ForeignPayment\ForeignPaymentInterface} which uses the KernelApp instead. + * * @var string */ public const PLUGINS_PAYMENT_AUTHORIZE_REQUEST_EXPANDER = 'PLUGINS_PAYMENT_AUTHORIZE_REQUEST_EXPANDER'; @@ -90,6 +100,11 @@ class PaymentDependencyProvider extends AbstractBundleDependencyProvider */ public const FACADE_LOCALE = 'FACADE_LOCALE'; + /** + * @var string + */ + public const FACADE_KERNEL_APP = 'PAYMENT:FACADE_KERNEL_APP'; + /** * @var string */ @@ -120,7 +135,9 @@ public function provideBusinessLayerDependencies(Container $container): Containe $container = $this->addPaymentService($container); $container = $this->addPaymentClient($container); $container = $this->addLocaleFacade($container); + $container = $this->addKernelAppFacade($container); $container = $this->addUtilTextService($container); + $container = $this->addUtilEncodingService($container); $container = $this->addOmsFacade($container); $container = $this->addMessageBrokerFacade($container); $container = $this->addPaymentAuthorizeRequestExpanderPlugins($container); @@ -142,6 +159,20 @@ protected function addUtilTextService(Container $container): Container return $container; } + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return \Spryker\Zed\Kernel\Container + */ + protected function addUtilEncodingService(Container $container): Container + { + $container->set(static::SERVICE_UTIL_ENCODING, function (Container $container): PaymentToUtilEncodingServiceInterface { + return new PaymentToUtilEncodingServiceBridge($container->getLocator()->utilEncoding()->service()); + }); + + return $container; + } + /** * @param \Spryker\Zed\Kernel\Container $container * @@ -158,6 +189,20 @@ protected function addLocaleFacade(Container $container): Container return $container; } + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return \Spryker\Zed\Kernel\Container + */ + protected function addKernelAppFacade(Container $container): Container + { + $container->set(static::FACADE_KERNEL_APP, function (Container $container) { + return new PaymentToKernelAppFacadeBridge($container->getLocator()->kernelApp()->facade()); + }); + + return $container; + } + /** * @param \Spryker\Zed\Kernel\Container $container * @@ -281,6 +326,8 @@ protected function getPaymentHydrationPlugins(): PaymentHydratorPluginCollection } /** + * @deprecated Use {@link \Spryker\Zed\Payment\Business\ForeignPayment\ForeignPaymentInterface} which uses the KernelApp instead. + * * @param \Spryker\Zed\Kernel\Container $container * * @return \Spryker\Zed\Kernel\Container @@ -295,6 +342,8 @@ protected function addPaymentAuthorizeRequestExpanderPlugins(Container $containe } /** + * @deprecated Use {@link \Spryker\Zed\Payment\Business\ForeignPayment\ForeignPaymentInterface} which uses the KernelApp instead. + * * @return array */ protected function getPaymentAuthorizeRequestExpanderPlugins(): array diff --git a/src/Spryker/Zed/Payment/Persistence/PaymentRepository.php b/src/Spryker/Zed/Payment/Persistence/PaymentRepository.php index 13d1bec..d82a181 100644 --- a/src/Spryker/Zed/Payment/Persistence/PaymentRepository.php +++ b/src/Spryker/Zed/Payment/Persistence/PaymentRepository.php @@ -62,6 +62,12 @@ public function findPaymentMethod(PaymentMethodTransfer $paymentMethodTransfer): $paymentMethodQuery->filterByPaymentMethodKey($paymentMethodTransfer->getPaymentMethodKey()); } + if ($paymentMethodTransfer->getName() !== null && $paymentMethodTransfer->getPaymentProvider() !== null && $paymentMethodTransfer->getPaymentProvider()->getName() !== null) { + $paymentMethodQuery + ->filterByLabelName($paymentMethodTransfer->getName()) + ->filterByGroupName($paymentMethodTransfer->getPaymentProvider()->getName()); + } + $paymentMethodEntity = $paymentMethodQuery->findOne(); if (!$paymentMethodEntity) { diff --git a/tests/SprykerTest/Shared/Payment/_support/Helper/PaymentDataHelper.php b/tests/SprykerTest/Shared/Payment/_support/Helper/PaymentDataHelper.php index ffa17ae..41c7ed9 100644 --- a/tests/SprykerTest/Shared/Payment/_support/Helper/PaymentDataHelper.php +++ b/tests/SprykerTest/Shared/Payment/_support/Helper/PaymentDataHelper.php @@ -12,10 +12,12 @@ use Generated\Shared\DataBuilder\DeletePaymentMethodBuilder; use Generated\Shared\DataBuilder\PaymentMethodBuilder; use Generated\Shared\DataBuilder\PaymentProviderBuilder; +use Generated\Shared\DataBuilder\UpdatePaymentMethodBuilder; use Generated\Shared\Transfer\AddPaymentMethodTransfer; use Generated\Shared\Transfer\DeletePaymentMethodTransfer; use Generated\Shared\Transfer\PaymentMethodTransfer; use Generated\Shared\Transfer\PaymentProviderTransfer; +use Generated\Shared\Transfer\UpdatePaymentMethodTransfer; use Orm\Zed\Payment\Persistence\SpyPaymentMethodQuery; use Orm\Zed\Payment\Persistence\SpyPaymentMethodStoreQuery; use Orm\Zed\Payment\Persistence\SpyPaymentProviderQuery; @@ -49,6 +51,21 @@ public function ensurePaymentProviderTableIsEmpty(): void SpyPaymentProviderQuery::create()->deleteAll(); } + /** + * @param array $seed + * + * @return \Generated\Shared\Transfer\PaymentMethodTransfer + */ + public function havePaymentMethodWithPaymentProviderPersisted(array $seed = []): PaymentMethodTransfer + { + $paymentProviderTransfer = $this->havePaymentProvider($seed); + + $seed[PaymentMethodTransfer::PAYMENT_PROVIDER] = $paymentProviderTransfer; + $seed[PaymentMethodTransfer::ID_PAYMENT_PROVIDER] = $paymentProviderTransfer->getIdPaymentProvider(); + + return $this->havePaymentMethod($seed); + } + /** * @param array $override * @@ -90,9 +107,11 @@ public function havePaymentMethod(array $override = []): PaymentMethodTransfer } $paymentMethodEntity->setFkPaymentProvider($paymentMethodTransfer->getIdPaymentProvider()); + if ($paymentMethodTransfer->getPaymentProvider()) { $paymentMethodEntity->setGroupName($paymentMethodTransfer->getPaymentProvider()->getName()); } + $paymentMethodEntity->fromArray($modifiedPaymentMethodData); $paymentMethodEntity->save(); @@ -115,6 +134,26 @@ public function havePaymentMethod(array $override = []): PaymentMethodTransfer return $paymentMethodTransfer; } + /** + * @param int $idPaymentMethod + * + * @return \Generated\Shared\Transfer\PaymentMethodTransfer|null + */ + public function findPaymentMethodById(int $idPaymentMethod): ?PaymentMethodTransfer + { + $paymentMethodEntity = SpyPaymentMethodQuery::create() + ->findOneByIdPaymentMethod($idPaymentMethod); + + if (!$paymentMethodEntity) { + return null; + } + + $paymentMethodTransfer = (new PaymentMethodTransfer())->fromArray($paymentMethodEntity->toArray(), true); + $paymentMethodTransfer->setIdPaymentProvider($paymentMethodEntity->getFkPaymentProvider()); + + return $paymentMethodTransfer; + } + /** * @param \Generated\Shared\Transfer\PaymentMethodTransfer $paymentMethodTransfer * @@ -122,7 +161,6 @@ public function havePaymentMethod(array $override = []): PaymentMethodTransfer */ public function findPaymentMethod(PaymentMethodTransfer $paymentMethodTransfer): ?PaymentMethodTransfer { - $mod = $paymentMethodTransfer->modifiedToArrayNotRecursiveCamelCased(); $paymentMethodEntity = SpyPaymentMethodQuery::create() ->filterByArray($paymentMethodTransfer->modifiedToArrayNotRecursiveCamelCased()) ->findOne(); @@ -150,6 +188,18 @@ public function haveAddPaymentMethodTransfer(array $seedData = [], array $messag ->build(); } + /** + * @param array $seedData + * + * @return \Generated\Shared\Transfer\UpdatePaymentMethodTransfer + */ + public function haveUpdatePaymentMethodTransfer(array $seedData = []): UpdatePaymentMethodTransfer + { + return (new UpdatePaymentMethodBuilder($seedData)) + ->withMessageAttributes() + ->build(); + } + /** * @param array $seedData * diff --git a/tests/SprykerTest/Zed/Payment/Business/Facade/PaymentFacadeForeignPaymentTest.php b/tests/SprykerTest/Zed/Payment/Business/Facade/PaymentFacadeForeignPaymentTest.php new file mode 100644 index 0000000..fe4c109 --- /dev/null +++ b/tests/SprykerTest/Zed/Payment/Business/Facade/PaymentFacadeForeignPaymentTest.php @@ -0,0 +1,73 @@ +toString(); + $paymentProviderKey = 'ProviderKey-' . Uuid::uuid4()->toString(); + + $paymentMethodTransfer = $this->tester->havePaymentMethodWithPaymentProviderPersisted([ + PaymentProviderTransfer::PAYMENT_PROVIDER_KEY => $paymentProviderKey, + PaymentMethodTransfer::IS_ACTIVE => true, + PaymentMethodTransfer::PAYMENT_METHOD_KEY => (new PaymentFacade())->generatePaymentMethodKey($paymentProviderKey, $paymentMethodName), + PaymentMethodTransfer::NAME => $paymentMethodName, + PaymentMethodTransfer::IS_FOREIGN => true, + PaymentMethodTransfer::PAYMENT_AUTHORIZATION_ENDPOINT => 'before-change', + ]); + + $updatePaymentMethodTransfer = $this->tester->haveUpdatePaymentMethodTransfer([ + AddPaymentMethodTransfer::NAME => $paymentMethodName, + AddPaymentMethodTransfer::PROVIDER_NAME => $paymentProviderKey, + AddPaymentMethodTransfer::PAYMENT_AUTHORIZATION_ENDPOINT => 'after-change', + ]); + + // Act + $this->tester->getFacade()->consumePaymentMethodMessage($updatePaymentMethodTransfer); + + // Assert + $updatedPaymentMethodTransfer = $this->tester->findPaymentMethodById($paymentMethodTransfer->getIdPaymentMethod()); + + $this->assertFalse($updatedPaymentMethodTransfer->getIsHidden(), 'Expected that the payment method is visible but it is hidden'); + $this->assertTrue($updatedPaymentMethodTransfer->getIsActive(), 'Expected that the payment method is active but it is inactive'); + $this->assertSame('after-change', $updatedPaymentMethodTransfer->getPaymentAuthorizationEndpoint(), 'Expected that the payment authorization endpoint is updated but it is not'); + } +} diff --git a/tests/SprykerTest/Zed/Payment/Business/Facade/PaymentFacadeTest.php b/tests/SprykerTest/Zed/Payment/Business/Facade/PaymentFacadeTest.php index f058539..e7afabd 100644 --- a/tests/SprykerTest/Zed/Payment/Business/Facade/PaymentFacadeTest.php +++ b/tests/SprykerTest/Zed/Payment/Business/Facade/PaymentFacadeTest.php @@ -15,12 +15,12 @@ use Generated\Shared\DataBuilder\PaymentProviderBuilder; use Generated\Shared\DataBuilder\QuoteBuilder; use Generated\Shared\DataBuilder\StoreRelationBuilder; +use Generated\Shared\Transfer\AcpHttpRequestTransfer; +use Generated\Shared\Transfer\AcpHttpResponseTransfer; use Generated\Shared\Transfer\AddPaymentMethodTransfer; use Generated\Shared\Transfer\CheckoutResponseTransfer; use Generated\Shared\Transfer\DeletePaymentMethodTransfer; use Generated\Shared\Transfer\MessageAttributesTransfer; -use Generated\Shared\Transfer\PaymentAuthorizeRequestTransfer; -use Generated\Shared\Transfer\PaymentAuthorizeResponseTransfer; use Generated\Shared\Transfer\PaymentMethodsTransfer; use Generated\Shared\Transfer\PaymentMethodTransfer; use Generated\Shared\Transfer\PaymentProviderTransfer; @@ -29,16 +29,17 @@ use Generated\Shared\Transfer\StoreRelationTransfer; use Generated\Shared\Transfer\StoreTransfer; use Orm\Zed\Payment\Persistence\SpyPaymentMethodQuery; -use Orm\Zed\Payment\Persistence\SpyPaymentMethodStoreQuery; use Ramsey\Uuid\Uuid; -use Spryker\Client\Payment\PaymentClientInterface; use Spryker\Zed\Kernel\Container; +use Spryker\Zed\KernelApp\Business\KernelAppFacadeInterface; use Spryker\Zed\Payment\Business\Method\PaymentMethodReader; use Spryker\Zed\Payment\Business\PaymentBusinessFactory; use Spryker\Zed\Payment\Business\PaymentFacade; +use Spryker\Zed\Payment\Dependency\Facade\PaymentToKernelAppFacadeBridge; use Spryker\Zed\Payment\PaymentConfig; use Spryker\Zed\Payment\PaymentDependencyProvider; use SprykerTest\Zed\Payment\PaymentBusinessTester; +use Symfony\Component\HttpFoundation\Response; /** * Auto-generated group annotations @@ -185,15 +186,12 @@ public function testUpdatePaymentMethodShouldUpdatePaymentMethodWithStoreRelatio $resultPaymentMethodEntity = SpyPaymentMethodQuery::create() ->filterByIdPaymentMethod($paymentMethodTransfer->getIdPaymentMethod()) ->findOne(); - $storeRelationExist = SpyPaymentMethodStoreQuery::create() - ->filterByFkPaymentMethod($paymentMethodTransfer->getIdPaymentMethod()) - ->exists(); + $this->assertSame( 'test1', $resultPaymentMethodEntity->getPaymentMethodKey(), 'Payment method name should match to the expected value', ); - $this->assertTrue($storeRelationExist, 'Payment method store relation should exists'); } /** @@ -533,7 +531,7 @@ public function testActivatePaymentMethod(): void /** * @return void */ - public function testForeignPaymentAuthorizerReceivesCorrectResponseAndUsingItAddsRedirectUrlWithCorrectData(): void + public function testForeignPaymentInitializePaymentReceivesCorrectResponseAndUsingItAddsRedirectUrlWithCorrectData(): void { // Arrange $paymentProviderTransfer = $this->tester->havePaymentProvider(); @@ -551,20 +549,20 @@ public function testForeignPaymentAuthorizerReceivesCorrectResponseAndUsingItAdd $quoteTransfer->setPayment($paymentTransfer); $checkoutResponseTransfer = $this->buildCheckoutResponseTransfer(); - $paymentClientMock = $this->getMockBuilder(PaymentClientInterface::class)->getMock(); + $kernelAppFacadeMock = $this->getMockBuilder(KernelAppFacadeInterface::class)->getMock(); - $paymentClientMock->expects($this->once()) - ->method('authorizeForeignPayment') - ->with($this->callback(function (PaymentAuthorizeRequestTransfer $paymentAuthorizeRequestTransfer) { - return $paymentAuthorizeRequestTransfer->getRequestUrl() === static::PAYMENT_AUTHORIZATION_ENDPOINT; + $kernelAppFacadeMock->expects($this->once()) + ->method('makeRequest') + ->with($this->callback(function (AcpHttpRequestTransfer $acpHttpRequestTransfer) { + return $acpHttpRequestTransfer->getUri() === static::PAYMENT_AUTHORIZATION_ENDPOINT; })) ->willReturn( - (new PaymentAuthorizeResponseTransfer()) - ->setIsSuccessful(true) - ->setRedirectUrl(static::PAYMENT_AUTHORIZATION_REDIRECT), + (new AcpHttpResponseTransfer()) + ->setHttpStatusCode(Response::HTTP_OK) + ->setContent(json_encode(['redirectUrl' => static::PAYMENT_AUTHORIZATION_REDIRECT])), ); - $this->tester->setDependency(PaymentDependencyProvider::CLIENT_PAYMENT, $paymentClientMock); + $this->tester->setDependency(PaymentDependencyProvider::FACADE_KERNEL_APP, new PaymentToKernelAppFacadeBridge($kernelAppFacadeMock)); // Act $this->tester->getFacade()->initForeignPaymentForCheckoutProcess($quoteTransfer, $checkoutResponseTransfer); @@ -604,25 +602,26 @@ public function testForeignPaymentAuthorizerForwardsAdditionPaymentDataToThePaym $quoteTransfer->setPayment($paymentTransfer); $checkoutResponseTransfer = $this->buildCheckoutResponseTransfer(); - $paymentClientMock = $this->getMockBuilder(PaymentClientInterface::class)->getMock(); - $forwardedAdditionPaymentData = []; - $paymentClientMock->expects($this->once()) - ->method('authorizeForeignPayment') - ->with($this->callback(function (PaymentAuthorizeRequestTransfer $paymentAuthorizeRequestTransfer) use (&$forwardedAdditionPaymentData) { + $kernelAppFacadeMock = $this->getMockBuilder(KernelAppFacadeInterface::class)->getMock(); + + $kernelAppFacadeMock->expects($this->once()) + ->method('makeRequest') + ->with($this->callback(function (AcpHttpRequestTransfer $acpHttpRequestTransfer) use (&$forwardedAdditionPaymentData) { // This is what would be sent, we want to compare later. - $forwardedAdditionPaymentData = $paymentAuthorizeRequestTransfer->getPostData()['orderData'][PaymentTransfer::ADDITIONAL_PAYMENT_DATA]; + $decodedBody = json_decode($acpHttpRequestTransfer->getBody(), true); + $forwardedAdditionPaymentData = $decodedBody['orderData'][PaymentTransfer::ADDITIONAL_PAYMENT_DATA]; - return $paymentAuthorizeRequestTransfer->getRequestUrl() === static::PAYMENT_AUTHORIZATION_ENDPOINT; + return $acpHttpRequestTransfer->getUri() === static::PAYMENT_AUTHORIZATION_ENDPOINT; })) ->willReturn( - (new PaymentAuthorizeResponseTransfer()) - ->setIsSuccessful(true) - ->setRedirectUrl(static::PAYMENT_AUTHORIZATION_REDIRECT), + (new AcpHttpResponseTransfer()) + ->setHttpStatusCode(Response::HTTP_OK) + ->setContent(json_encode(['redirectUrl' => static::PAYMENT_AUTHORIZATION_REDIRECT])), ); - $this->tester->setDependency(PaymentDependencyProvider::CLIENT_PAYMENT, $paymentClientMock); + $this->tester->setDependency(PaymentDependencyProvider::FACADE_KERNEL_APP, new PaymentToKernelAppFacadeBridge($kernelAppFacadeMock)); // Act $this->tester->getFacade()->initForeignPaymentForCheckoutProcess($quoteTransfer, $checkoutResponseTransfer); @@ -679,20 +678,20 @@ public function testInitForeignPaymentForCheckoutProcessReturnsRedirectToRelativ $quoteTransfer->setPayment($paymentTransfer); $checkoutResponseTransfer = $this->buildCheckoutResponseTransfer(); - $paymentClientMock = $this->getMockBuilder(PaymentClientInterface::class)->getMock(); + $kernelAppFacadeMock = $this->getMockBuilder(KernelAppFacadeInterface::class)->getMock(); - $paymentClientMock->expects($this->once()) - ->method('authorizeForeignPayment') - ->with($this->callback(function (PaymentAuthorizeRequestTransfer $paymentAuthorizeRequestTransfer) { - return $paymentAuthorizeRequestTransfer->getRequestUrl() === static::PAYMENT_AUTHORIZATION_ENDPOINT; + $kernelAppFacadeMock->expects($this->once()) + ->method('makeRequest') + ->with($this->callback(function (AcpHttpRequestTransfer $acpHttpRequestTransfer) { + return $acpHttpRequestTransfer->getUri() === static::PAYMENT_AUTHORIZATION_ENDPOINT; })) ->willReturn( - (new PaymentAuthorizeResponseTransfer()) - ->setIsSuccessful(true) - ->setRedirectUrl(static::PAYMENT_AUTHORIZATION_REDIRECT), + (new AcpHttpResponseTransfer()) + ->setHttpStatusCode(Response::HTTP_OK) + ->setContent(json_encode(['redirectUrl' => static::PAYMENT_AUTHORIZATION_REDIRECT])), ); - $this->tester->setDependency(PaymentDependencyProvider::CLIENT_PAYMENT, $paymentClientMock); + $this->tester->setDependency(PaymentDependencyProvider::FACADE_KERNEL_APP, new PaymentToKernelAppFacadeBridge($kernelAppFacadeMock)); $this->tester->mockConfigMethod('getStoreFrontPaymentPage', '/my-custom-payment-page'); @@ -727,20 +726,21 @@ public function testInitForeignPaymentForCheckoutProcessReturnsRedirectToAbsolut $quoteTransfer->setPayment($paymentTransfer); $checkoutResponseTransfer = $this->buildCheckoutResponseTransfer(); - $paymentClientMock = $this->getMockBuilder(PaymentClientInterface::class)->getMock(); + $kernelAppFacadeMock = $this->getMockBuilder(KernelAppFacadeInterface::class)->getMock(); - $paymentClientMock->expects($this->once()) - ->method('authorizeForeignPayment') - ->with($this->callback(function (PaymentAuthorizeRequestTransfer $paymentAuthorizeRequestTransfer) { - return $paymentAuthorizeRequestTransfer->getRequestUrl() === static::PAYMENT_AUTHORIZATION_ENDPOINT; + $kernelAppFacadeMock->expects($this->once()) + ->method('makeRequest') + ->with($this->callback(function (AcpHttpRequestTransfer $acpHttpRequestTransfer) { + return $acpHttpRequestTransfer->getUri() === static::PAYMENT_AUTHORIZATION_ENDPOINT; })) ->willReturn( - (new PaymentAuthorizeResponseTransfer()) - ->setIsSuccessful(true) - ->setRedirectUrl(static::PAYMENT_AUTHORIZATION_REDIRECT), + (new AcpHttpResponseTransfer()) + ->setHttpStatusCode(Response::HTTP_OK) + ->setContent(json_encode(['redirectUrl' => static::PAYMENT_AUTHORIZATION_REDIRECT])), ); - $this->tester->setDependency(PaymentDependencyProvider::CLIENT_PAYMENT, $paymentClientMock); + $this->tester->setDependency(PaymentDependencyProvider::FACADE_KERNEL_APP, new PaymentToKernelAppFacadeBridge($kernelAppFacadeMock)); + $this->tester->mockConfigMethod('getStoreFrontPaymentPage', 'https://my-custom-domain.com/payment?some=param'); // Act diff --git a/tests/SprykerTest/Zed/Payment/_support/PaymentBusinessTester.php b/tests/SprykerTest/Zed/Payment/_support/PaymentBusinessTester.php index f807425..b0e42e1 100644 --- a/tests/SprykerTest/Zed/Payment/_support/PaymentBusinessTester.php +++ b/tests/SprykerTest/Zed/Payment/_support/PaymentBusinessTester.php @@ -148,7 +148,6 @@ public function haveDeletePaymentMethodTransferWithTimestamp( ): DeletePaymentMethodTransfer { return $this->haveDeletePaymentMethodTransfer([ DeletePaymentMethodTransfer::NAME => static::PAYMENT_METHOD_NAME, - DeletePaymentMethodTransfer::PAYMENT_AUTHORIZATION_ENDPOINT => static::PAYMENT_REDIRECT_URL, DeletePaymentMethodTransfer::PROVIDER_NAME => $paymentProviderTransfer->getPaymentProviderKey(), DeletePaymentMethodTransfer::MESSAGE_ATTRIBUTES => [ MessageAttributesTransfer::STORE_REFERENCE => static::STORE_REFERENCE, @@ -169,7 +168,6 @@ public function haveDeletePaymentMethodTransferWithoutTimestamp( return $this->haveDeletePaymentMethodTransfer([ DeletePaymentMethodTransfer::NAME => static::PAYMENT_METHOD_NAME, - DeletePaymentMethodTransfer::PAYMENT_AUTHORIZATION_ENDPOINT => static::PAYMENT_REDIRECT_URL, DeletePaymentMethodTransfer::PROVIDER_NAME => $providerKey, DeletePaymentMethodTransfer::MESSAGE_ATTRIBUTES => [ MessageAttributesTransfer::STORE_REFERENCE => static::STORE_REFERENCE,