*/ class Mage_Paypal_PayflowController extends Mage_Core_Controller_Front_Action { /** * When a customer cancel payment from payflow gateway. */ public function cancelPaymentAction() { $gotoSection = $this->_cancelPayment(); $redirectBlock = $this->_getIframeBlock() ->setGotoSection($gotoSection) ->setTemplate('paypal/payflowlink/redirect.phtml'); $this->getResponse()->setBody($redirectBlock->toHtml()); } /** * When a customer return to website from payflow gateway. */ public function returnUrlAction() { $redirectBlock = $this->_getIframeBlock() ->setTemplate('paypal/payflowlink/redirect.phtml'); $session = $this->_getCheckout(); if ($session->getLastRealOrderId()) { $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId()); if ($order && $order->getIncrementId() == $session->getLastRealOrderId()) { $allowedOrderStates = array( Mage_Sales_Model_Order::STATE_PROCESSING, Mage_Sales_Model_Order::STATE_COMPLETE ); if (in_array($order->getState(), $allowedOrderStates)) { $session->unsLastRealOrderId(); $redirectBlock->setGotoSuccessPage(true); } else { $gotoSection = $this->_cancelPayment( Mage::helper('core') ->stripTags( strval($this->getRequest()->getParam('RESPMSG')) ) ); $redirectBlock->setGotoSection($gotoSection); $redirectBlock->setErrorMsg($this->__('Payment has been declined. Please try again.')); } } } $this->getResponse()->setBody($redirectBlock->toHtml()); } /** * Submit transaction to Payflow getaway into iframe */ public function formAction() { $this->getResponse() ->setBody($this->_getIframeBlock()->toHtml()); } /** * Get response from PayPal by silent post method */ public function silentPostAction() { $data = $this->getRequest()->getPost(); if (isset($data['INVNUM'])) { /** @var $paymentModel Mage_Paypal_Model_Payflowlink */ $paymentModel = Mage::getModel('paypal/payflowlink'); try { $paymentModel->process($data); } catch (Exception $e) { Mage::logException($e); } } } /** * Cancel order, return quote to customer * * @param string $errorMsg * @return mixed */ protected function _cancelPayment($errorMsg = '') { $gotoSection = false; $session = $this->_getCheckout(); if ($session->getLastRealOrderId()) { $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId()); if ($order->getId()) { //Cancel order if ($order->getState() != Mage_Sales_Model_Order::STATE_CANCELED) { $order->registerCancellation($errorMsg)->save(); } $quote = Mage::getModel('sales/quote') ->load($order->getQuoteId()); //Return quote if ($quote->getId()) { $quote->setIsActive(1) ->setReservedOrderId(NULL) ->save(); $session->replaceQuote($quote); } //Unset data $session->unsLastRealOrderId(); //Redirect to payment step $gotoSection = 'payment'; } } return $gotoSection; } /** * Get frontend checkout session object * * @return Mage_Checkout_Model_Session */ protected function _getCheckout() { return Mage::getSingleton('checkout/session'); } /** * Get iframe block * * @return Mage_Paypal_Block_Payflow_Link_Iframe */ protected function _getIframeBlock() { $this->loadLayout('paypal_payflow_link_iframe'); return $this->getLayout() ->getBlock('payflow.link.iframe'); } }