searchCriteriaBuilder = $searchCriteriaBuilder; $this->orderRepository = $orderRepository; } /** * Cancels an order and authorization transaction. * * @param string $incrementId * @return bool */ public function execute(string $incrementId): bool { $order = $this->getOrder($incrementId); if ($order === null) { return false; } // `\Magento\Sales\Model\Service\OrderService::cancel` cannot be used for cancellation as the service uses // the order repository with outdated payment method instance (ex. contains Vault instead of Braintree) $order->cancel(); $this->orderRepository->save($order); return true; } /** * Gets order by increment ID. * * @param string $incrementId * @return OrderInterface|null */ private function getOrder(string $incrementId) { $searchCriteria = $this->searchCriteriaBuilder->addFilter(OrderInterface::INCREMENT_ID, $incrementId) ->create(); $items = $this->orderRepository->getList($searchCriteria) ->getItems(); return array_pop($items); } }