How to filter payment method in onepage checkout

January 9, 2013  |  6 Comments  |  by Raj (MagePsycho)  |  Latest, Magento

Introduction

Q: How will you filter the payment method in onepage 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 etc.

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

Steps

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:

...
<frontend>
	...
	<events>
		<payment_method_is_active>
			<observers>
				<paymentfilter_payment_method_is_active>
					<type>singleton</type>
					<class>paymentfilter/observer</class>
					<method>paymentMethodIsActive</method>
				</paymentfilter_payment_method_is_active>
			</observers>
		</payment_method_is_active>
	</events>
	...
</frontend>
...

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

<?php
/**
 * @category   MagePsycho
 * @package    MagePsycho_Paymentfilter
 * @author     magepsycho@gmail.com
 * @website    http://www.magepsycho.com
 * @license    http://opensource.org/licenses/osl-3.0.php  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;
			}else{
				$result->isAvailable = false;
			}
		}
	}

}

3> Go ahead for testing.

Happy E-Commerce!

Posted in Latest, Magento and tagged , , , , . Bookmark the permalink.

About Raj (MagePsycho)

Raj, the guy behind MagePsycho is a Zend PHP5 Certified Engineer, Magento Certified Developer, Magento Moderator / Freelancer with specialization in web applications (CMS, E-Commerce, ERP etc.). Catch him on: Twitter: @magepsycho Skype: magentopycho
  • http://www.steven-sanders.com/ Steven-Sanders

    Implementation of this observer method affects the frontend and admin pages of Magento, correct? Not just within One Page Checkout.

    In order to have it only affect one or the other,would you change the config xml to fall within the “frontend” or “admin” tags, rather than the “global” tag?

    We want all payment methods available for use by our phone sales reps, but only certain methods for online orders made by customers on the frontend.

    • http://www.magepsycho.com MagePsycho

      Yes you are correct. Event should be registered in frontend section if you want to filter only for frontend checkout.

  • http://owlymedia.com/ Nikhil Goyal

    Can this be also implemented so that payment methods are shown based on Zipcode entered by users..

    • Magento Developer

      @a23dbcf6aec7ddb700492e1c19ec6ffc:disqus yes. Just you need to change the condition, for example: if( $currencyCode == ‘USD’){

  • khushbu

    i am not getting enabled cash on delivery method can i have zip file of code plz.
    thanks in advance.

  • http://lasart.es/ Rosario Lamb

    What we’re basically doing here are three things, first we are overriding the block responsible for showing each of the payments methods on the checkout. We also add our new order status Expedite. The last part is the most interesting one, we’re registering a new class we created as an observer for the checkout_type_onepage_save_order_after event. This means that whenever Magento receives an order from the user and saves it, it automatically calls our function. This is a common pattern that you can find everywhere (native win32 application using the available windows hooks for example).