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:

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).

Manuel

What would I need to do if I wanted to make the payment methods dependent on the shipping method that was chosen in the step before. The big problem is, that the payment_method_is_active Event is only dispatched when onepage is loading. After that it is not dispatched any longer, so there is no way there is any reaction to the choice of shipping.

Magento Developer

Just try to capture the $_POST params in the observer and check for shipping method data. If there’s no any then try to get the shipping method from $quote object.

mau

Hi, I’m trying to display a “confirm” window when the user clicks on the “continue” button at the payment method step in checkout, but only if the selected payment method is PayPal. How can I check for the selected method at this step? I did the confirm window on template/checkout/onepage/payment.phtml like this: