How to filter payment method in one-page checkout in Magento?


Q: How will you filter the payment method in one-page checkout based on some conditions?
A: There are different ways to do so. Some of them are:

  1. By overriding template: app/design/frontend/[interface]/[theme]/template/checkout/onepage/payment/methods.phtml
  2. By overriding method: Mage_Checkout_Block_Onepage_Payment_Methods::_canUseMethod()
  3. By overriding method: Mage_Payment_Model_Method_Abstract::isAvailable()
  4. By overriding method: Mage_Checkout_Block_Onepage_Payment_Methods::getMethods()
  5. By observing event: payment_method_is_active
  6. and so on.

Among the above methods obviously using event-observer technique is the best way to go (#5).
And here I will be discussing how to enable the PayPal (Website Standard) method only when current currency is USD.


Suppose a skeleton module(MagePsycho_Paymentfilter) has already been created.
1> Register the event: ‘payment_method_is_active’ in config.xml.
Add the following XML code in app/code/local/MagePsycho/Paymentfilter/etc/config.xml:


2> Implement the observer model
Create observer file: app/code/local/MagePsycho/Paymentfilter/Model/Observer.php and paste the following code:

 * @category   MagePsycho
 * @package    MagePsycho_Paymentfilter
 * @author     [email protected]
 * @website
 * @license  Open Software License (OSL 3.0)
class MagePsycho_Paymentfilter_Model_Observer {

	public function paymentMethodIsActive(Varien_Event_Observer $observer) {
		$event			 = $observer->getEvent();
		$method			 = $event->getMethodInstance();
		$result			 = $event->getResult();
		$currencyCode	 = Mage::app()->getStore()->getCurrentCurrencyCode();
		if( $currencyCode == 'USD'){
			if($method->getCode() == 'paypal_standard' ){
				$result->isAvailable = true;
				$result->isAvailable = false;


3> Go ahead for testing.

Happy E-Commerce!