From 18a7df4f8cfca682dd658818391775f457ba1a24 Mon Sep 17 00:00:00 2001 From: Julius Zukauskas Date: Thu, 27 Jun 2024 12:53:03 +0300 Subject: [PATCH] handle pending decline --- controllers/front/notify.php | 54 ++++++++++++++++++++--------- src/Api/Request/AssertService.php | 1 + src/Processor/CheckoutProcessor.php | 3 +- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/controllers/front/notify.php b/controllers/front/notify.php index f4a24aae..5bfd644d 100755 --- a/controllers/front/notify.php +++ b/controllers/front/notify.php @@ -75,13 +75,7 @@ public function postProcess() } if ($cart->orderExists()) { - if (method_exists('Order', 'getIdByCartId')) { - $orderId = Order::getIdByCartId($cartId); - } else { - // For PrestaShop 1.6 use the alternative method - $orderId = Order::getOrderByCartId($cartId); - } - + $orderId = $this->getOrderId($cartId); $order = new Order($orderId); $saferPayAuthorizedStatus = (int) Configuration::get(\Invertus\SaferPay\Config\SaferPayConfig::SAFERPAY_PAYMENT_AUTHORIZED); @@ -92,11 +86,11 @@ public function postProcess() } } + /** @var SaferPayOrderRepository $saferPayOrderRepository */ + $saferPayOrderRepository = $this->module->getService(SaferPayOrderRepository::class); + try { $assertResponseBody = $this->assertTransaction($cartId); - - /** @var SaferPayOrderRepository $saferPayOrderRepository */ - $saferPayOrderRepository = $this->module->getService(SaferPayOrderRepository::class); $saferPayOrderId = $saferPayOrderRepository->getIdByCartId($cartId); /** @var UpdateSaferPayOrderAction $updateSaferPayOrderAction */ @@ -104,12 +98,7 @@ public function postProcess() $updateSaferPayOrderAction->run(new SaferPayOrder($saferPayOrderId), self::SAFERPAY_ORDER_AUTHORIZE_ACTION); // If order does not exist but assertion is valid that means order authorized or captured. - if (method_exists('Order', 'getIdByCartId')) { - $orderId = Order::getIdByCartId($cartId); - } else { - // For PrestaShop 1.6 use the alternative method - $orderId = Order::getOrderByCartId($cartId); - } + $orderId = $this->getOrderId($cartId); if (!$orderId) { /** @var CheckoutProcessor $checkoutProcessor **/ $checkoutProcessor = $this->module->getService(CheckoutProcessor::class); @@ -163,6 +152,24 @@ public function postProcess() $orderStatusService->capture($order); } } catch (Exception $e) { + // this might be executed after pending transaction is declined (e.g. with accountToAccount payment) + if (!isset($order)) { + $orderId = $this->getOrderId($cartId); + $order = new Order($orderId); + } + + $saferPayOrderId = $saferPayOrderRepository->getIdByOrderId($order->id); + $saferPayOrder = new SaferPayOrder($saferPayOrderId); + + if ($order->id && $saferPayOrder->id) { + // assuming order transaction was declined + $order->setCurrentState(_SAFERPAY_PAYMENT_AUTHORIZATION_FAILED_); + $order->update(); + $saferPayOrder->authorized = false; + $saferPayOrder->pending = false; + $saferPayOrder->update(); + } + PrestaShopLogger::addLog( sprintf( '%s has caught an error: %s', @@ -188,6 +195,21 @@ private function assertTransaction($cartId) { return $transactionAssert->assert($cartId); } + /** + * @param int $cartId + * + * @return bool|int + */ + private function getOrderId($cartId) + { + if (method_exists('Order', 'getIdByCartId')) { + return Order::getIdByCartId($cartId); + } else { + // For PrestaShop 1.6 use the alternative method + return Order::getOrderByCartId($cartId); + } + } + protected function displayMaintenancePage() { return true; diff --git a/src/Api/Request/AssertService.php b/src/Api/Request/AssertService.php index c430dbce..d1297a41 100755 --- a/src/Api/Request/AssertService.php +++ b/src/Api/Request/AssertService.php @@ -29,6 +29,7 @@ use Invertus\SaferPay\DTO\Response\Assert\AssertBody; use Invertus\SaferPay\EntityBuilder\SaferPayAssertBuilder; use Invertus\SaferPay\Exception\Api\SaferPayApiException; +use Invertus\SaferPay\Exception\Api\TransactionDeclinedException; use Invertus\SaferPay\Service\Response\AssertResponseObjectCreator; use SaferPayOrder; diff --git a/src/Processor/CheckoutProcessor.php b/src/Processor/CheckoutProcessor.php index 478520eb..5b6912f1 100644 --- a/src/Processor/CheckoutProcessor.php +++ b/src/Processor/CheckoutProcessor.php @@ -37,6 +37,7 @@ use Invertus\SaferPay\Repository\SaferPayOrderRepository; use Invertus\SaferPay\Service\SaferPayInitialize; use Order; +use PrestaShop\PrestaShop\Adapter\Entity\PrestaShopLogger; use PrestaShopException; use SaferPayOrder; @@ -203,7 +204,6 @@ private function processAuthorizedOrder(CheckoutData $data, Cart $cart) } $saferPayOrder->id_order = $order->id; - if ($data->getOrderStatus() === 'AUTHORIZED') { $order->setCurrentState(_SAFERPAY_PAYMENT_AUTHORIZED_); $saferPayOrder->authorized = 1; @@ -212,7 +212,6 @@ private function processAuthorizedOrder(CheckoutData $data, Cart $cart) $saferPayOrder->captured = 1; } elseif ($data->getOrderStatus() === 'PENDING') { $order->setCurrentState(_SAFERPAY_PAYMENT_PENDING_); - $saferPayOrder->authorized = 1; $saferPayOrder->pending = 1; }