Magento 2.0.7 – Disable Payment Method on Frontend Only

magento-2.0.7payment-methods

How to disable payment method

Check / Money Order

only on frontend, but left available for admin on backend ?

I can't find solution for M2

Best Answer

Best idea to use event/observer concept.Fire an observer on event: payment_method_is_active

Create events.xml at app\code\[Vendorname]\[Modulename]\etc\

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="payment_method_is_active">
        <observer name="disable_pg" instance="[Vendorname]\[Modulename]\Observer\ObserverforDisabledFrontendPg" />
    </event>
</config>

then at observer class ObserverforDisabledFrontendPg.php rewrite below code:

<?php
namespace [Vendorname]\[Modulename]\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\Request\DataPersistorInterface;
use Magento\Framework\App\ObjectManager;

class ObserverforDisabledFrontendPg implements ObserverInterface
{
    protected $_appState;
    public function __construct(
        \Magento\Framework\App\State $appState
    ) {
        $this->_appState = $appState;
    }

    /**
     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return void
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
      $result = $observer->getEvent()->getResult();
      $method_instance = $observer->getEvent()->getMethodInstance();
      $quote = $observer->getEvent()->getQuote();

      if(null !== $quote){
          /* 
          *  During Checkout magento call payment methods from both
          *   area frontend and Web_api are
          */

          if($method_instance->getCode() =='checkmo' && 
            in_array($this->_appState->getAreaCode(), $this->getDisableAreas()))
            {
               $result->setData('is_available',false);
               //$items= $quote->getAllVisibleItems();    
          }
      }

    }      

    protected function getDisableAreas(){

        return array( \Magento\Framework\App\Area::AREA_FRONTEND, \Magento\Framework\App\Area::AREA_WEBAPI_REST);
    }


}