Below code worked in Magento 2
Automatically cancel pending payment orders older than 1 day using cron
Create a custom module with required files
Custom/Module/etc/crontab.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Cron:etc/crontab.xsd">
<group id="default">
<job name="order_cancel_orders" instance="Custom\Module\Cron\OrderCancelOrders" method="execute">
<schedule>*/5 * * * *</schedule>
</job>
</group>
</config>
Custom/Module/Cron/OrderCancelOrders.php
<?php
namespace Custom\Module\Cron;
use Exception;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\Stdlib\DateTime\DateTime;
use Magento\Sales\Api\OrderManagementInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Psr\Log\LoggerInterface;
use Magento\Sales\Model\Order;
class OrderCancelOrders
{
protected $productRepository;
protected $dateTime;
protected $logger;
protected $date;
protected $orderRepository;
protected $searchCriteriaBuilder;
protected $orderManagement;
public function __construct(
ProductRepositoryInterface $productRepository,
DateTime $dateTime,
TimezoneInterface $date,
LoggerInterface $logger,
OrderRepositoryInterface $orderRepository,
SearchCriteriaBuilder $searchCriteriaBuilder,
OrderManagementInterface $orderManagement
)
{
$this->productRepository = $productRepository;
$this->dateTime = $dateTime;
$this->logger = $logger;
$this->date = $date;
$this->orderRepository = $orderRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->orderManagement = $orderManagement;
}
public function execute()
{
$this->logger->info('Orders Cancel cron job running');
$date = (new \DateTime())->modify('-1 day');
$this->logger->info('Date'.$date);
$searchCriteria = $this->searchCriteriaBuilder
->addFilter(
'status',
'pending_payment',
'eq'
)->addFilter(
'created_at',
$date->format('Y-m-d'),
'gt'
)->setPageSize(
10
)->create();
try {
$ordersData = $this->orderRepository->getList($searchCriteria);
foreach ($ordersData->getItems() as $orders) {
if ($orders->getId()) {
$this->orderManagement->cancel($orders->getId());
$this->logger->info("OrderID# {$orders->getId()} OrderIncrementID# {$orders->getIncrementId()} successfully order canceled and reverted stock.");
}
}
} catch (\Exception $e) {
$this->logger->critical($e->getMessage());
}
}
}