Question

How to save the order to order table under any state when the payment is cancelled via paypal standard.

Was it helpful?

Solution

After spending few hours on this I first came to know that the magento 1.9 includes paypal Express along with paypal standard. so making this clear I just deactivated the express via sql changes and block rewrites (referring some external sources). coming back to the point we need an override for the paypal cancellation action. This can be obtained by an observer sales_order_payment_cancel, rest of the below codes explain other process as well. Hope this should help someone.

local/Stackoverflow/Paypalstandard/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Stackoverflow_Paypalstandard>
            <version>0.1.0</version>
        </Stackoverflow_Paypalstandard>
    </modules>
    <global>
        <models>
            <custom_paypalstandard>
                <class>Stackoverflow_Paypalstandard_Model</class>
            </custom_paypalstandard>
        </models>
        <blocks>
            <custom_paypalstandard>
                <class>Stackoverflow_Paypalstandard_Block</class>
            </custom_paypalstandard>
            <paypal>
                <rewrite>
                    <standard_redirect>Stackoverflow_Paypalstandard_Block_Standard_Redirect</standard_redirect>
                    <adminhtml_system_config_fieldset_location>Stackoverflow_Paypalstandard_Block_Adminhtml_System_Config_Fieldset_Location</adminhtml_system_config_fieldset_location>
                </rewrite>
            </paypal>
        </blocks>
        <events>
            <sales_order_payment_cancel>
                <observers>
                    <after_placing_order>
                        <class>custom_paypalstandard/observer</class>
                        <method>implementOrderStatus</method>
                    </after_placing_order>
                </observers>
            </sales_order_payment_cancel>
        </events>
    </global>
</config>

local/Stackoverflow/Paypalstandard/Block/Adminhtml/System/Config/Fieldset/Location.php

This is a part of override to deactivate the paypal express - for this please refer Some link.

local/Stackoverflow/Paypalstandard/Block/Standard/Redirect.php

class Stackoverflow_Paypalstandard_Block_Standard_Redirect extends Mage_Paypal_Block_Standard_Redirect
{
    public function _toHtml()
    {
        $standard = Mage::getModel('paypal/standard');

        $form = new Varien_Data_Form();
        $form->setAction($standard->getConfig()->getPaypalUrl())
            ->setId('paypal_standard_checkout')
            ->setName('paypal_standard_checkout')
            ->setMethod('POST')
            ->setUseContainer(true);
        foreach ($standard->getStandardCheckoutFormFields() as $field=>$value) {
            $form->addField($field, 'hidden', array('name'=>$field, 'value'=>$value));
        }
        $idSuffix = Mage::helper('core')->uniqHash();
        $submitButton = new Varien_Data_Form_Element_Submit(array(
            'value'    => $this->__('Click here if you are not redirected within 10 seconds...'),
        ));
        $id = "submit_to_paypal_button_{$idSuffix}";
        $submitButton->setId($id);
        $form->addElement($submitButton);
        $html = '<html><body>';
        $html.= $this->__('You will be redirected to the PayPal website in a few seconds.');
        $html.= $form->toHtml();
        $html.= '<script type="text/javascript">document.getElementById("paypal_standard_checkout").submit();</script>';
        $html.= '</body></html>';

        return $html;
    }
}

local/Stackoverflow/Paypalstandard/Model/Observer.php


class Stackoverflow_Paypalstandard_Model_Observer
{

 public function implementOrderStatus($observer)
    {
        $payment = $observer->getEvent()->getPayment();
        $order = $payment->getOrder();
        $order->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_CANCEL, false);
        $orderIds = Mage::getSingleton('adminhtml/session')->getNonCancelledOrders();
        if (!$orderIds) {
            $orderIds = array($order->getId());
        } else {
            $orderIds[] = $order->getId();
        }
        Mage::getSingleton('adminhtml/session')->setNonCancelledOrders($orderIds);
    }
}

etc/modules/Stackoverflow_Paypalstandard.xml


<config>
    <modules>
        <Stackoverflow_Paypalstandard>
            <active>true</active>
            <codePool>local</codePool>
        </Stackoverflow_Paypalstandard>
    </modules>
</config>
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top