* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ if (!defined('_PS_VERSION_')) { exit; } use PsCheckout\Core\Exception\PsCheckoutException; use PsCheckout\Core\PayPal\Order\Action\CancelPayPalOrderAction; use PsCheckout\Core\PayPal\Order\Request\ValueObject\CancelPayPalOrderRequest; use PsCheckout\Infrastructure\Controller\AbstractFrontController; use PsCheckout\Utility\Common\InputStreamUtility; use Psr\Log\LoggerInterface; /** * This controller receive ajax call on customer canceled payment */ class Ps_CheckoutCancelModuleFrontController extends AbstractFrontController { /** * @see FrontController::postProcess() */ public function postProcess() { /** @var LoggerInterface $logger */ $logger = $this->module->getService(LoggerInterface::class); try { if (!Validate::isLoadedObject($this->context->cart)) { $this->exitWithResponse([ 'httpCode' => 400, 'body' => 'No cart found.', ]); } /** @var InputStreamUtility $inputStreamUtility */ $inputStreamUtility = $this->module->getService(InputStreamUtility::class); $bodyContent = $inputStreamUtility->getBodyContent(); if (empty($bodyContent)) { $this->exitWithResponse([ 'httpCode' => 400, 'body' => 'Payload invalid', ]); } $bodyValues = json_decode($bodyContent, true); if (empty($bodyValues)) { $this->exitWithResponse([ 'httpCode' => 400, 'body' => 'Payload invalid', ]); } $orderCancelRequest = new CancelPayPalOrderRequest($bodyValues, $this->context->cart->id); if ($orderCancelRequest->getOrderId()) { /** @var CancelPayPalOrderAction $cancelPayPalOrderAction */ $cancelPayPalOrderAction = $this->module->getService(CancelPayPalOrderAction::class); $cancelPayPalOrderAction->execute($orderCancelRequest); } $logger->log( $orderCancelRequest->getError() ? 400 : 200, 'Customer canceled payment', [ 'PayPalOrderId' => $orderCancelRequest->getOrderId(), 'FundingSource' => $orderCancelRequest->getFundingSource(), 'id_cart' => $this->context->cart->id, 'isExpressCheckout' => $orderCancelRequest->isExpressCheckout(), 'isHostedFields' => $orderCancelRequest->isHostedFields(), 'reason' => $orderCancelRequest->getReason(), 'error' => $orderCancelRequest->getError(), ] ); $this->exitWithResponse([ 'status' => true, 'httpCode' => 200, 'body' => $bodyValues, 'exceptionCode' => null, 'exceptionMessage' => null, ]); } catch (Exception $exception) { $this->exitWithExceptionMessage($exception); } catch (Throwable $exception) { $this->exitWithExceptionMessage(new PsCheckoutException( 'An error occurred while canceling the PayPal order.', PsCheckoutException::UNKNOWN, $exception )); } } }