diff --git a/app/code/Magento/Checkout/Api/Exception/PaymentProcessingRateLimitExceededException.php b/app/code/Magento/Checkout/Api/Exception/PaymentProcessingRateLimitExceededException.php
index e398bf40039..018c18112a7 100644
--- a/app/code/Magento/Checkout/Api/Exception/PaymentProcessingRateLimitExceededException.php
+++ b/app/code/Magento/Checkout/Api/Exception/PaymentProcessingRateLimitExceededException.php
@@ -11,7 +11,7 @@ namespace Magento\Checkout\Api\Exception;
use Magento\Framework\Exception\LocalizedException;
/**
- * Thrown when too many payment processing requests have been initiated by a user.
+ * Thrown when too many payment processing/saving requests have been initiated by a user.
*/
class PaymentProcessingRateLimitExceededException extends LocalizedException
{
diff --git a/app/code/Magento/Checkout/Api/PaymentSavingRateLimiterInterface.php b/app/code/Magento/Checkout/Api/PaymentSavingRateLimiterInterface.php
new file mode 100644
index 00000000000..c964029ff8b
--- /dev/null
+++ b/app/code/Magento/Checkout/Api/PaymentSavingRateLimiterInterface.php
@@ -0,0 +1,25 @@
+userContext = $userContext;
- $this->customerRepo = $customerRepo;
- $this->captchaHelper = $captchaHelper;
- $this->request = $request;
- $this->captchaResolver = $captchaResolver;
+ $limiterFactory = $limiterFactory ?? ObjectManager::getInstance()->get(CaptchaRateLimiterFactory::class);
+ $this->limiter = $limiterFactory->create([
+ 'userContext' => $userContext,
+ 'customerRepo' => $customerRepo,
+ 'captchaHelper' => $captchaHelper,
+ 'captchaResolver' => $captchaResolver,
+ 'request' => $request,
+ 'captchaId' => self::CAPTCHA_FORM
+ ]);
}
/**
@@ -77,47 +64,10 @@ class CaptchaPaymentProcessingRateLimiter implements PaymentProcessingRateLimite
*/
public function limit(): void
{
- if ($this->userContext->getUserType() !== UserContextInterface::USER_TYPE_GUEST
- && $this->userContext->getUserType() !== UserContextInterface::USER_TYPE_CUSTOMER
- && $this->userContext->getUserType() !== null
- ) {
- return;
+ try {
+ $this->limiter->limit();
+ } catch (LocalizedException $exception) {
+ throw new PaymentProcessingRateLimitExceededException(__($exception->getMessage()), $exception);
}
-
- $login = $this->retrieveLogin();
- /** @var Captcha $captcha */
- $captcha = $this->captchaHelper->getCaptcha(self::CAPTCHA_FORM);
- /** @var PaymentProcessingRateLimitExceededException|null $exception */
- $exception = null;
- if ($captcha->isRequired($login)) {
- $value = $this->captchaResolver->resolve($this->request, self::CAPTCHA_FORM);
- if ($value && !$captcha->isCorrect($value)) {
- $exception = new PaymentProcessingRateLimitExceededException(__('Incorrect CAPTCHA'));
- } elseif (!$value) {
- $exception = new PaymentProcessingRateLimitExceededException(
- __('Please provide CAPTCHA code and try again')
- );
- }
- }
-
- $captcha->logAttempt($login);
- if ($exception) {
- throw $exception;
- }
- }
-
- /**
- * Retrieve current user login.
- *
- * @return string|null
- */
- private function retrieveLogin(): ?string
- {
- $login = null;
- if ($this->userContext->getUserId()) {
- $login = $this->customerRepo->getById($this->userContext->getUserId())->getEmail();
- }
-
- return $login;
}
}
diff --git a/app/code/Magento/Checkout/Model/CaptchaPaymentSavingRateLimiter.php b/app/code/Magento/Checkout/Model/CaptchaPaymentSavingRateLimiter.php
new file mode 100644
index 00000000000..7d52a1a0e19
--- /dev/null
+++ b/app/code/Magento/Checkout/Model/CaptchaPaymentSavingRateLimiter.php
@@ -0,0 +1,55 @@
+limiter = $limiterFactory->create(['captchaId' => self::CAPTCHA_FORM]);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function limit(): void
+ {
+ try {
+ $this->limiter->limit();
+ } catch (LocalizedException $exception) {
+ throw new PaymentProcessingRateLimitExceededException(
+ __(
+ 'Could not store billing/shipping information at the moment'
+ .' but you can proceed with the checkout'
+ ),
+ $exception
+ );
+ }
+ }
+}
diff --git a/app/code/Magento/Checkout/Model/CaptchaRateLimiter.php b/app/code/Magento/Checkout/Model/CaptchaRateLimiter.php
new file mode 100644
index 00000000000..e643d61e82b
--- /dev/null
+++ b/app/code/Magento/Checkout/Model/CaptchaRateLimiter.php
@@ -0,0 +1,129 @@
+userContext = $userContext;
+ $this->customerRepo = $customerRepo;
+ $this->captchaHelper = $captchaHelper;
+ $this->request = $request;
+ $this->captchaResolver = $captchaResolver;
+ $this->captchaId = $captchaId;
+ }
+
+ /**
+ * Validate CAPTCHA if necessary.
+ *
+ * @return void
+ * @throws LocalizedException
+ */
+ public function limit(): void
+ {
+ if ($this->userContext->getUserType() !== UserContextInterface::USER_TYPE_GUEST
+ && $this->userContext->getUserType() !== UserContextInterface::USER_TYPE_CUSTOMER
+ && $this->userContext->getUserType() !== null
+ ) {
+ return;
+ }
+
+ $login = $this->retrieveLogin();
+ /** @var Captcha $captcha */
+ $captcha = $this->captchaHelper->getCaptcha($this->captchaId);
+ /** @var LocalizedException|null $exception */
+ $exception = null;
+ if ($captcha->isRequired($login)) {
+ $value = $this->captchaResolver->resolve($this->request, $this->captchaId);
+ if ($value && !$captcha->isCorrect($value)) {
+ $exception = new LocalizedException(__('Incorrect CAPTCHA'));
+ } elseif (!$value) {
+ $exception = new LocalizedException(
+ __('Please provide CAPTCHA code and try again')
+ );
+ }
+ }
+
+ $captcha->logAttempt($login);
+ if ($exception) {
+ throw $exception;
+ }
+ }
+
+ /**
+ * Retrieve current user login.
+ *
+ * @return string|null
+ */
+ private function retrieveLogin(): ?string
+ {
+ $login = null;
+ if ($this->userContext->getUserId()) {
+ $login = $this->customerRepo->getById($this->userContext->getUserId())->getEmail();
+ }
+
+ return $login;
+ }
+}
diff --git a/app/code/Magento/Checkout/Model/GuestPaymentInformationManagement.php b/app/code/Magento/Checkout/Model/GuestPaymentInformationManagement.php
index 2b2824213df..0ca398b73a0 100644
--- a/app/code/Magento/Checkout/Model/GuestPaymentInformationManagement.php
+++ b/app/code/Magento/Checkout/Model/GuestPaymentInformationManagement.php
@@ -7,7 +7,9 @@ declare(strict_types=1);
namespace Magento\Checkout\Model;
+use Magento\Checkout\Api\Exception\PaymentProcessingRateLimitExceededException;
use Magento\Checkout\Api\PaymentProcessingRateLimiterInterface;
+use Magento\Checkout\Api\PaymentSavingRateLimiterInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Framework\Exception\CouldNotSaveException;
@@ -62,6 +64,16 @@ class GuestPaymentInformationManagement implements \Magento\Checkout\Api\GuestPa
private $paymentsRateLimiter;
/**
+ * @var PaymentSavingRateLimiterInterface
+ */
+ private $savingRateLimiter;
+
+ /**
+ * @var bool
+ */
+ private $saveRateLimitDisabled = false;
+
+ /**
* @param \Magento\Quote\Api\GuestBillingAddressManagementInterface $billingAddressManagement
* @param \Magento\Quote\Api\GuestPaymentMethodManagementInterface $paymentMethodManagement
* @param \Magento\Quote\Api\GuestCartManagementInterface $cartManagement
@@ -69,6 +81,7 @@ class GuestPaymentInformationManagement implements \Magento\Checkout\Api\GuestPa
* @param \Magento\Quote\Model\QuoteIdMaskFactory $quoteIdMaskFactory
* @param CartRepositoryInterface $cartRepository
* @param PaymentProcessingRateLimiterInterface|null $paymentsRateLimiter
+ * @param PaymentSavingRateLimiterInterface|null $savingRateLimiter
* @codeCoverageIgnore
*/
public function __construct(
@@ -78,7 +91,8 @@ class GuestPaymentInformationManagement implements \Magento\Checkout\Api\GuestPa
\Magento\Checkout\Api\PaymentInformationManagementInterface $paymentInformationManagement,
\Magento\Quote\Model\QuoteIdMaskFactory $quoteIdMaskFactory,
CartRepositoryInterface $cartRepository,
- ?PaymentProcessingRateLimiterInterface $paymentsRateLimiter = null
+ ?PaymentProcessingRateLimiterInterface $paymentsRateLimiter = null,
+ ?PaymentSavingRateLimiterInterface $savingRateLimiter = null
) {
$this->billingAddressManagement = $billingAddressManagement;
$this->paymentMethodManagement = $paymentMethodManagement;
@@ -88,6 +102,8 @@ class GuestPaymentInformationManagement implements \Magento\Checkout\Api\GuestPa
$this->cartRepository = $cartRepository;
$this->paymentsRateLimiter = $paymentsRateLimiter
?? ObjectManager::getInstance()->get(PaymentProcessingRateLimiterInterface::class);
+ $this->savingRateLimiter = $savingRateLimiter
+ ?? ObjectManager::getInstance()->get(PaymentSavingRateLimiterInterface::class);
}
/**
@@ -99,7 +115,14 @@ class GuestPaymentInformationManagement implements \Magento\Checkout\Api\GuestPa
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
- $this->savePaymentInformation($cartId, $email, $paymentMethod, $billingAddress);
+ $this->paymentsRateLimiter->limit();
+ try {
+ //Have to do this hack because of savePaymentInformation() plugins.
+ $this->saveRateLimitDisabled = true;
+ $this->savePaymentInformation($cartId, $email, $paymentMethod, $billingAddress);
+ } finally {
+ $this->saveRateLimitDisabled = false;
+ }
try {
$orderId = $this->cartManagement->placeOrder($cartId);
} catch (\Magento\Framework\Exception\LocalizedException $e) {
@@ -130,7 +153,14 @@ class GuestPaymentInformationManagement implements \Magento\Checkout\Api\GuestPa
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
- $this->paymentsRateLimiter->limit();
+ if (!$this->saveRateLimitDisabled) {
+ try {
+ $this->savingRateLimiter->limit();
+ } catch (PaymentProcessingRateLimitExceededException $ex) {
+ //Limit reached
+ return false;
+ }
+ }
$quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id');
/** @var Quote $quote */
diff --git a/app/code/Magento/Checkout/Model/PaymentInformationManagement.php b/app/code/Magento/Checkout/Model/PaymentInformationManagement.php
index a6e448ecdb8..3b36391530c 100644
--- a/app/code/Magento/Checkout/Model/PaymentInformationManagement.php
+++ b/app/code/Magento/Checkout/Model/PaymentInformationManagement.php
@@ -6,7 +6,9 @@
namespace Magento\Checkout\Model;
+use Magento\Checkout\Api\Exception\PaymentProcessingRateLimitExceededException;
use Magento\Checkout\Api\PaymentProcessingRateLimiterInterface;
+use Magento\Checkout\Api\PaymentSavingRateLimiterInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Exception\CouldNotSaveException;
@@ -59,12 +61,23 @@ class PaymentInformationManagement implements \Magento\Checkout\Api\PaymentInfor
private $paymentRateLimiter;
/**
+ * @var PaymentSavingRateLimiterInterface
+ */
+ private $saveRateLimiter;
+
+ /**
+ * @var bool
+ */
+ private $saveRateLimiterDisabled = false;
+
+ /**
* @param \Magento\Quote\Api\BillingAddressManagementInterface $billingAddressManagement
* @param \Magento\Quote\Api\PaymentMethodManagementInterface $paymentMethodManagement
* @param \Magento\Quote\Api\CartManagementInterface $cartManagement
* @param PaymentDetailsFactory $paymentDetailsFactory
* @param \Magento\Quote\Api\CartTotalRepositoryInterface $cartTotalsRepository
* @param PaymentProcessingRateLimiterInterface|null $paymentRateLimiter
+ * @param PaymentSavingRateLimiterInterface|null $saveRateLimiter
* @codeCoverageIgnore
*/
public function __construct(
@@ -73,7 +86,8 @@ class PaymentInformationManagement implements \Magento\Checkout\Api\PaymentInfor
\Magento\Quote\Api\CartManagementInterface $cartManagement,
\Magento\Checkout\Model\PaymentDetailsFactory $paymentDetailsFactory,
\Magento\Quote\Api\CartTotalRepositoryInterface $cartTotalsRepository,
- ?PaymentProcessingRateLimiterInterface $paymentRateLimiter = null
+ ?PaymentProcessingRateLimiterInterface $paymentRateLimiter = null,
+ ?PaymentSavingRateLimiterInterface $saveRateLimiter = null
) {
$this->billingAddressManagement = $billingAddressManagement;
$this->paymentMethodManagement = $paymentMethodManagement;
@@ -82,6 +96,8 @@ class PaymentInformationManagement implements \Magento\Checkout\Api\PaymentInfor
$this->cartTotalsRepository = $cartTotalsRepository;
$this->paymentRateLimiter = $paymentRateLimiter
?? ObjectManager::getInstance()->get(PaymentProcessingRateLimiterInterface::class);
+ $this->saveRateLimiter = $saveRateLimiter
+ ?? ObjectManager::getInstance()->get(PaymentSavingRateLimiterInterface::class);
}
/**
@@ -92,7 +108,14 @@ class PaymentInformationManagement implements \Magento\Checkout\Api\PaymentInfor
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
- $this->savePaymentInformation($cartId, $paymentMethod, $billingAddress);
+ $this->paymentRateLimiter->limit();
+ try {
+ //Have to do this hack because of plugins for savePaymentInformation()
+ $this->saveRateLimiterDisabled = true;
+ $this->savePaymentInformation($cartId, $paymentMethod, $billingAddress);
+ } finally {
+ $this->saveRateLimiterDisabled = false;
+ }
try {
$orderId = $this->cartManagement->placeOrder($cartId);
} catch (\Magento\Framework\Exception\LocalizedException $e) {
@@ -121,7 +144,14 @@ class PaymentInformationManagement implements \Magento\Checkout\Api\PaymentInfor
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
- $this->paymentRateLimiter->limit();
+ if (!$this->saveRateLimiterDisabled) {
+ try {
+ $this->saveRateLimiter->limit();
+ } catch (PaymentProcessingRateLimitExceededException $ex) {
+ //Limit reached
+ return false;
+ }
+ }
if ($billingAddress) {
/** @var \Magento\Quote\Api\CartRepositoryInterface $quoteRepository */
diff --git a/app/code/Magento/Checkout/etc/di.xml b/app/code/Magento/Checkout/etc/di.xml
index 0c1d866dfc2..1af46c87869 100644
--- a/app/code/Magento/Checkout/etc/di.xml
+++ b/app/code/Magento/Checkout/etc/di.xml
@@ -51,4 +51,6 @@
+
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/action/set-payment-information-extended.js b/app/code/Magento/Checkout/view/frontend/web/js/action/set-payment-information-extended.js
index ae5b0914e83..46b2756f0f2 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/action/set-payment-information-extended.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/action/set-payment-information-extended.js
@@ -15,7 +15,7 @@ define([
'Magento_Checkout/js/action/get-totals',
'Magento_Checkout/js/model/full-screen-loader',
'underscore',
- 'Magento_Checkout/js/model/payment/set-payment-hooks'
+ 'Magento_Checkout/js/model/payment/place-order-hooks'
], function (quote, urlBuilder, storage, errorProcessor, customer, getTotalsAction, fullScreenLoader, _, hooks) {
'use strict';
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/model/payment/set-payment-hooks.js b/app/code/Magento/Checkout/view/frontend/web/js/model/payment/set-payment-hooks.js
index 5cd31d85c9a..e69de29bb2d 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/model/payment/set-payment-hooks.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/model/payment/set-payment-hooks.js
@@ -1,13 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-define([], function () {
- 'use strict';
-
- return {
- requestModifiers: [],
- afterRequestListeners: []
- };
-});
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/checkout/placeOrderCaptcha.js b/app/code/Magento/Checkout/view/frontend/web/js/view/checkout/placeOrderCaptcha.js
index d0e27ad8e0a..fcbf3e27c93 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/checkout/placeOrderCaptcha.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/checkout/placeOrderCaptcha.js
@@ -30,7 +30,7 @@ function (defaultCaptcha, captchaList, _, placeOrderHooks) {
}
});
placeOrderHooks.afterRequestListeners.push(function () {
- self.refresh();
+ //self.refresh();
});
}
}
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/checkout/setPaymentCaptcha.js b/app/code/Magento/Checkout/view/frontend/web/js/view/checkout/setPaymentCaptcha.js
index 93f3bb8b2a4..e69de29bb2d 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/checkout/setPaymentCaptcha.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/checkout/setPaymentCaptcha.js
@@ -1,38 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-define([
- 'Magento_Captcha/js/view/checkout/defaultCaptcha',
- 'Magento_Captcha/js/model/captchaList',
- 'underscore',
- 'Magento_Checkout/js/model/payment/set-payment-hooks'
-],
-function (defaultCaptcha, captchaList, _, setPaymentHooks) {
- 'use strict';
-
- return defaultCaptcha.extend({
- /** @inheritdoc */
- initialize: function () {
- var self = this,
- currentCaptcha;
-
- this._super();
- currentCaptcha = captchaList.getCaptchaByFormId(this.formId);
-
- if (currentCaptcha != null) {
- currentCaptcha.setIsVisible(true);
- this.setCurrentCaptcha(currentCaptcha);
- setPaymentHooks.requestModifiers.push(function (headers) {
- if (self.isRequired()) {
- headers['X-Captcha'] = self.captchaValue()();
- }
- });
- setPaymentHooks.afterRequestListeners.push(function () {
- self.refresh();
- });
- }
- }
- });
-});
diff --git a/app/code/Magento/Multishipping/Controller/Checkout/OverviewPost.php b/app/code/Magento/Multishipping/Controller/Checkout/OverviewPost.php
index b3333d828a0..0b85f710e5c 100644
--- a/app/code/Magento/Multishipping/Controller/Checkout/OverviewPost.php
+++ b/app/code/Magento/Multishipping/Controller/Checkout/OverviewPost.php
@@ -5,6 +5,7 @@
*/
namespace Magento\Multishipping\Controller\Checkout;
+use Magento\Checkout\Api\Exception\PaymentProcessingRateLimitExceededException;
use Magento\Checkout\Api\PaymentProcessingRateLimiterInterface;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\App\ObjectManager;
@@ -126,6 +127,9 @@ class OverviewPost extends \Magento\Multishipping\Controller\Checkout implements
$this->_getCheckout()->getCheckoutSession()->setDisplaySuccess(true);
$this->_redirect('*/*/success');
}
+ } catch (PaymentProcessingRateLimitExceededException $ex) {
+ $this->messageManager->addErrorMessage($ex->getMessage());
+ $this->_redirect('*/*/overview');
} catch (PaymentException $e) {
$message = $e->getMessage();
if (!empty($message)) {
diff --git a/app/code/Magento/QuoteGraphQl/Model/Cart/SetPaymentMethodOnCart.php b/app/code/Magento/QuoteGraphQl/Model/Cart/SetPaymentMethodOnCart.php
index 81a30216f00..56ff0a4edb0 100644
--- a/app/code/Magento/QuoteGraphQl/Model/Cart/SetPaymentMethodOnCart.php
+++ b/app/code/Magento/QuoteGraphQl/Model/Cart/SetPaymentMethodOnCart.php
@@ -9,6 +9,7 @@ namespace Magento\QuoteGraphQl\Model\Cart;
use Magento\Checkout\Api\Exception\PaymentProcessingRateLimitExceededException;
use Magento\Checkout\Api\PaymentProcessingRateLimiterInterface;
+use Magento\Checkout\Api\PaymentSavingRateLimiterInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
@@ -22,6 +23,8 @@ use Magento\QuoteGraphQl\Model\Cart\Payment\AdditionalDataProviderPool;
/**
* Saves related payment method info for a cart.
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class SetPaymentMethodOnCart
{
@@ -41,7 +44,7 @@ class SetPaymentMethodOnCart
private $additionalDataProviderPool;
/**
- * @var PaymentProcessingRateLimiterInterface
+ * @var PaymentSavingRateLimiterInterface
*/
private $paymentRateLimiter;
@@ -50,18 +53,22 @@ class SetPaymentMethodOnCart
* @param PaymentInterfaceFactory $paymentFactory
* @param AdditionalDataProviderPool $additionalDataProviderPool
* @param PaymentProcessingRateLimiterInterface|null $paymentRateLimiter
+ * @param PaymentSavingRateLimiterInterface|null $savingRateLimiter
+ *
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function __construct(
PaymentMethodManagementInterface $paymentMethodManagement,
PaymentInterfaceFactory $paymentFactory,
AdditionalDataProviderPool $additionalDataProviderPool,
- ?PaymentProcessingRateLimiterInterface $paymentRateLimiter = null
+ ?PaymentProcessingRateLimiterInterface $paymentRateLimiter = null,
+ ?PaymentSavingRateLimiterInterface $savingRateLimiter = null
) {
$this->paymentMethodManagement = $paymentMethodManagement;
$this->paymentFactory = $paymentFactory;
$this->additionalDataProviderPool = $additionalDataProviderPool;
- $this->paymentRateLimiter = $paymentRateLimiter
- ?? ObjectManager::getInstance()->get(PaymentProcessingRateLimiterInterface::class);
+ $this->paymentRateLimiter = $savingRateLimiter
+ ?? ObjectManager::getInstance()->get(PaymentSavingRateLimiterInterface::class);
}
/**
@@ -75,7 +82,12 @@ class SetPaymentMethodOnCart
public function execute(Quote $cart, array $paymentData): void
{
try {
- $this->paymentRateLimiter->limit();
+ try {
+ $this->paymentRateLimiter->limit();
+ } catch (PaymentProcessingRateLimitExceededException $ex) {
+ //Limit reached
+ return;
+ }
} catch (PaymentProcessingRateLimitExceededException $exception) {
throw new GraphQlInputException(__($exception->getMessage()), $exception);
}