As we know that Magento is an powerful ecommerce platform these days which offers managed marketing, catalog-management, seo tools and many more. But magento doesn't provide some of the essential features of a ecommerce platform. Similarly order cancellation from front end is not possible without custom programmaticallyhack in coding. It's a great feature to build up customer trust factor on ecommerce website. In this article, we are going to elaborate steps to cancel a order programmaticallyin magento 2 and for implementation of this functionality you don't need to install any module or patch in magento setup.
Step 1 : Create a new Controller
We need to initialize our code with controller which would contains a constructor & execute interface method. In constructor, we need to pass a argument of orderManagement type.
Namespace\Module_Name\Controller\Action;
use \Magento\Framework\App\Action\Action
class Cancelmyorder extends \Magento\Framework\App\Action\Action
{
//Var $orderMgt : Order Management
protected $orderMgt;
//Var $messageManager : Message Manager
protected $messageManager;
public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Sales\Api\OrderManagementInterface $orderMgt, \Magento\Framework\Message\ManagerInterface $messageManager ) {
$this->orderMgt = $orderMgt;
$this->messageManager = $messageManager;
parent::__construct($context);
}
public function execute() {
// Initiate Object Manager
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
// Fetch Loggedin User Session
$customerSession = $objectManager->get('Magento\Customer\Model\Session');
// Check is User Logged In or Not
if(!$customerSession->isLoggedIn()) { $this->_redirect('/'); die; }
// Get request parameters
$cid = $customerSession->getCustomer()->getId();
$oid = $this->getRequest()->getParam('order_id');
// Get request parameters
$order = $objectManager->create('Magento\Sales\Model\Order')->load($oid);
// Fetch Order Data
$orderdata = $order->getData();
// Get Order Status
$order_status = $orderdata["status"];
// Get Customer Id of Order
$cus_id = $orderdata["customer_id"];
// Check if logged in user & Order customer is same or not
if($cid != $cus_id) { $this->messageManager->addError("Sorry, We cant cancel your order right now.") ; }
// Check Order Status
if($order_status == "pending") {
$this->orderMgt->cancel($oid);
$this->messageManager->addSuccess("Your order has been cancelled successfully.") ;
} else {
$this->messageManager->addError("Sorry, We cant cancel your order right now.") ;
}
}
}
Step 2 : Execute Method
In this step, we will call method by passing valid order id in template file.
$order_id = 123;
$this->cancelmyorder($order_id);
Now, you are ready with custom script to cancel order programmatically. Once, code will get execute, you'll get a sucess or error message.