* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ namespace PrestaShop\Module\PrestashopCheckout\PayPal\Order\QueryHandler; use Exception; use PrestaShop\Module\PrestashopCheckout\Exception\HttpTimeoutException; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Exception\PayPalOrderException; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetPayPalOrderForCheckoutCompletedQuery; use PrestaShop\Module\PrestashopCheckout\PayPal\Order\Query\GetPayPalOrderForCheckoutCompletedQueryResult; use PrestaShop\Module\PrestashopCheckout\PaypalOrder; use Psr\SimpleCache\CacheInterface; /** * We need to know if the Order Status is APPROVED and in case of Card payment if 3D Secure allow to capture */ class GetPayPalOrderForCheckoutCompletedQueryHandler { /** * @var CacheInterface */ private $orderPayPalCache; public function __construct(CacheInterface $orderPayPalCache) { $this->orderPayPalCache = $orderPayPalCache; } public function handle(GetPayPalOrderForCheckoutCompletedQuery $getPayPalOrderQuery) { $payPalOrderId = $getPayPalOrderQuery->getOrderPayPalId()->getValue(); /** @var array{id: string, status: string} $order */ $order = $this->orderPayPalCache->get($payPalOrderId); if (!empty($order) && in_array($order['status'], ['COMPLETED', 'CANCELED'])) { return new GetPayPalOrderForCheckoutCompletedQueryResult($order); } try { $orderPayPal = new PaypalOrder($payPalOrderId); $orderToStoreInCache = !empty($order) ? array_replace_recursive($order, $orderPayPal->getOrder()) : $orderPayPal->getOrder(); $this->orderPayPalCache->set($payPalOrderId, $orderToStoreInCache); } catch (HttpTimeoutException $exception) { throw $exception; } catch (Exception $exception) { throw new PayPalOrderException(sprintf('Unable to retrieve PayPal Order %s', $payPalOrderId), PayPalOrderException::CANNOT_RETRIEVE_ORDER, $exception); } if (!$orderPayPal->isLoaded()) { throw new PayPalOrderException(sprintf('No data for PayPal Order %s', $payPalOrderId), PayPalOrderException::EMPTY_ORDER_DATA); } return new GetPayPalOrderForCheckoutCompletedQueryResult($orderPayPal->getOrder()); } }