diff --git a/controllers/front/notify.php b/controllers/front/notify.php index cd4c2f5f..fa2e6442 100755 --- a/controllers/front/notify.php +++ b/controllers/front/notify.php @@ -47,7 +47,6 @@ public function postProcess() { $cartId = Tools::getValue('cartId'); $secureKey = Tools::getValue('secureKey'); - $cart = new Cart($cartId); if (!Validate::isLoadedObject($cart)) { @@ -71,18 +70,6 @@ public function postProcess() die($this->module->l('Lock already exist', self::FILENAME)); } - if ($cart->orderExists()) { - $orderId = $this->getOrderId($cartId); - $order = new Order($orderId); - - $saferPayAuthorizedStatus = (int) Configuration::get(\Invertus\SaferPay\Config\SaferPayConfig::SAFERPAY_PAYMENT_AUTHORIZED); - $saferPayCapturedStatus = (int) Configuration::get(\Invertus\SaferPay\Config\SaferPayConfig::SAFERPAY_PAYMENT_COMPLETED); - - if ((int) $order->current_state === $saferPayAuthorizedStatus || (int) $order->current_state === $saferPayCapturedStatus) { - die($this->module->l('Order already created', self::FILENAME)); - } - } - /** @var SaferPayOrderRepository $saferPayOrderRepository */ $saferPayOrderRepository = $this->module->getService(SaferPayOrderRepository::class); @@ -121,6 +108,18 @@ public function postProcess() $order = new Order($orderId); $paymentMethod = $assertResponseBody->getPaymentMeans()->getBrand()->getPaymentMethod(); + // if payment does not support order capture, it means it always auto-captures it (at least with accountToAccount payment), + // so in this case if status comes back "captured" we just update the order state accordingly + if (!SaferPayConfig::supportsOrderCapture($paymentMethod) && + $transactionStatus === TransactionStatus::CAPTURED + ) { + /** @var SaferPayOrderStatusService $orderStatusService */ + $orderStatusService = $this->module->getService(SaferPayOrderStatusService::class); + $orderStatusService->setComplete($order); + + return; + } + if (SaferPayConfig::supportsOrderCapture($paymentMethod) && (int) Configuration::get(SaferPayConfig::PAYMENT_BEHAVIOR) === SaferPayConfig::DEFAULT_PAYMENT_BEHAVIOR_CAPTURE && $transactionStatus !== TransactionStatus::CAPTURED @@ -137,15 +136,20 @@ public function postProcess() $order = new Order($orderId); } - $saferPayOrderId = $saferPayOrderRepository->getIdByOrderId($order->id); - $saferPayOrder = new SaferPayOrder($saferPayOrderId); - - if ($order->id && $saferPayOrder->id) { + if ($order->id) { // assuming order transaction was declined $order->setCurrentState(_SAFERPAY_PAYMENT_AUTHORIZATION_FAILED_); $order->update(); + $saferPayOrder = new SaferPayOrder($saferPayOrderRepository->getIdByOrderId($order->id)); + } else { + // assuming order transaction was cancelled before ps order was even made + $saferPayOrder = new SaferPayOrder($saferPayOrderRepository->getIdByCartId($cartId)); + } + + if ($saferPayOrder->id) { $saferPayOrder->authorized = false; $saferPayOrder->pending = false; + $saferPayOrder->canceled = true; $saferPayOrder->update(); } diff --git a/controllers/front/return.php b/controllers/front/return.php index 9db0e2ba..5dccbef7 100755 --- a/controllers/front/return.php +++ b/controllers/front/return.php @@ -26,6 +26,7 @@ use Invertus\SaferPay\Controller\AbstractSaferPayController; use Invertus\SaferPay\DTO\Response\Assert\AssertBody; use Invertus\SaferPay\Enum\ControllerName; +use Invertus\SaferPay\Exception\Api\SaferPayApiException; use Invertus\SaferPay\Repository\SaferPayOrderRepository; use Invertus\SaferPay\Service\SaferPayOrderStatusService; use Invertus\SaferPay\Service\TransactionFlow\SaferPayTransactionAssertion; @@ -50,16 +51,23 @@ public function postProcess() return; } - if ($isBusinessLicence) { - $response = $this->executeTransaction($cartId, $selectedCard); - } else { - $response = $this->assertTransaction($cartId); - } + try { + if ($isBusinessLicence) { + $response = $this->executeTransaction($cartId, $selectedCard); + } else { + $response = $this->assertTransaction($cartId); + } + + \PrestaShopLogger::addLog($response->getTransaction()->getStatus()); - /** @var SaferPayOrderStatusService $orderStatusService */ - $orderStatusService = $this->module->getService(SaferPayOrderStatusService::class); - if ($response->getTransaction()->getStatus() === TransactionStatus::PENDING) { - $orderStatusService->setPending($order); + /** @var SaferPayOrderStatusService $orderStatusService */ + $orderStatusService = $this->module->getService(SaferPayOrderStatusService::class); + if ($response->getTransaction()->getStatus() === TransactionStatus::PENDING) { + $orderStatusService->setPending($order); + } + } catch (SaferPayApiException $e) { + \PrestaShopLogger::addLog($e->getMessage()); + // we only care if we have a response with pending status, else we skip further actions } } /** @@ -175,19 +183,16 @@ protected function processGetStatus() $saferPayOrderId = $saferPayOrderRepository->getIdByCartId($cartId); $saferPayOrder = new SaferPayOrder($saferPayOrderId); - if ($saferPayOrder->canceled || !$saferPayOrder->id_order) { - $href = $this->context->link->getModuleLink( - $this->module->name, - ControllerName::FAIL, - [ - 'cartId' => $cartId, - 'secureKey' => $secureKey, - 'moduleId' => $moduleId, - ], - true - ); - } else { - $href = $this->context->link->getModuleLink( + if (!$saferPayOrder->id || $saferPayOrder->canceled) { + $this->ajaxDie(json_encode([ + 'isFinished' => true, + 'href' => $this->getFailControllerLink($cartId, $secureKey, $moduleId) + ])); + } + + $this->ajaxDie(json_encode([ + 'isFinished' => $saferPayOrder->authorized || $saferPayOrder->captured || $saferPayOrder->pending, + 'href' => $this->context->link->getModuleLink( $this->module->name, $this->getSuccessControllerName($isBusinessLicence, $fieldToken), [ @@ -197,12 +202,7 @@ protected function processGetStatus() 'secureKey' => $secureKey, 'selectedCard' => $selectedCard, ] - ); - } - - $this->ajaxDie(json_encode([ - 'isFinished' => $saferPayOrder->authorized || $saferPayOrder->captured || $saferPayOrder->canceled || $saferPayOrder->pending, - 'href' => $href + ) ])); } @@ -221,6 +221,20 @@ private function getSuccessControllerName($isBusinessLicence, $fieldToken) return $successController; } + private function getFailControllerLink($cartId, $secureKey, $moduleId) + { + return $this->context->link->getModuleLink( + $this->module->name, + ControllerName::FAIL, + [ + 'cartId' => $cartId, + 'secureKey' => $secureKey, + 'moduleId' => $moduleId, + ], + true + ); + } + /** * @param int $orderId * @param int $selectedCard diff --git a/src/Service/SaferPayOrderStatusService.php b/src/Service/SaferPayOrderStatusService.php index 7a995f98..38dd60f0 100755 --- a/src/Service/SaferPayOrderStatusService.php +++ b/src/Service/SaferPayOrderStatusService.php @@ -121,6 +121,15 @@ public function setPending(Order $order) $order->setCurrentState(_SAFERPAY_PAYMENT_PENDING_); } + public function setComplete(Order $order) + { + $saferPayOrder = $this->orderRepository->getByOrderId($order->id); + $saferPayOrder->captured = 1; + + $saferPayOrder->update(); + $order->setCurrentState(_SAFERPAY_PAYMENT_COMPLETED_); + } + /** TODO extract capture api code to different service like Assert for readability */ public function capture(Order $order, $refundedAmount = 0, $isRefund = false) {