I design one payment gateway But It's hosted payment so i want remove that payment method for admin order and reorder.so please some one tell me how to disable this method only for admin orders like Paypal standard.
Disable Payment Method for Admin in Magento 1
magento-1payment-gatewaypayment-methods
Related Solutions
We should take a look at the payment abstract class vendor/magento/module-payment/Model/Method/AbstractMethod.php
. We can see the method public function isAvailable()
- This class will check whether payment method can be used.
public function isAvailable(\Magento\Quote\Api\Data\CartInterface $quote = null)
{
if (!$this->isActive($quote ? $quote->getStoreId() : null)) {
return false;
}
$checkResult = new DataObject();
$checkResult->setData('is_available', true);
// for future use in observers
$this->_eventManager->dispatch(
'payment_method_is_active',
[
'result' => $checkResult,
'method_instance' => $this,
'quote' => $quote
]
);
return $checkResult->getData('is_available');
}
As can we see, there is an Observer event, like Magento 1, we can use Observer to disable our Payment Methods. It's Magento 1 way. However, Magento 2 introduces to developers a new way - Plugin.
Create DI on front page: app/code/{Vendor}/{Module Name}/etc/frontend/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Payment\Model\Method\AbstractMethod">
<plugin sortOrder="5" name="testValidate"
type="{Vendor}\{Module Name}\Plugin\Model\Method\Available" sortOrder="1" disabled="false" />
</type>
</config>
app/code/{Vendor}/{Module Name}/Plugin/Model/Method/Available.php
<?php
namespace {Vender}\{Module Name}\Plugin\Model\Method;
class Available
{
/**
*
* @param \Magento\Payment\Model\Method\AbstractMethod $subject
* @param $result
* @return bool
* @throws \Magento\Framework\Exception\LocalizedException
*/
public function afterIsAvailable(\Magento\Payment\Model\Method\AbstractMethod $subject, $result)
{
if($subject->getCode() == 'your payment code, eg: cashondelivery') {
return false;
}
return $result;
}
}
$subject
is the current Payment Method Model.
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);
}
}
Best Answer
Jaydeep Sinh Parmar,can do this by Magento Event/Observer
First,using payment_method_is_active disable on depends current store.
Code for this:
Module config.xml code:
Observer code is: