was successfully added to your cart.

Redsys borra el carrito cuando cancelamos el pedido, prevenir el borrado del carrito en Magento con proveedores externos de pago.

Recientemente me encuentro inmerso en un proyecto bastante chulo por la temática del mismo. Entre todos los problemas a resolver se encontraba este.

Trabajamos con un entorno de Magento con versión 1.9.2
Y la versión del modulo de Redsys para Magento es la 2.8.4

Esta es la problemática:

  • Llenamos el carrito.
  • Nos dirigmos a completar nuestros datos de envío y registro y seleccionamos como método de pago Redsys.
  • Estando en la pasarela de pago, pulsamos hacia atrás en el navegador o en cancelar pago de Redsys, porque queremos pagar con paypal por ejemplo.
  • Walaa!!, tenemos que volver a empezar, «Su carrito está vacío».

Esto es debido a lo siguiente:

  • Cuando pasamos a la plataforma de pago de Redsys, el modulo de este coge el carrito de tu sesión y lo convierte en pedido.
  • Al guardar tu carrito como pedido desaparece del front, lo que hace que cuando volvamos no tengamos el carrito.

 

Para evitar esto, debemos poner el carrito como activo aun habiendolo convertido en pedido.
Después, en el callback de «Pago correcto, metodo(successAction)» eliminamos el carrito. Para hacer esto tenemos que hacer tres modificaciones.

  1. Las URL_OK y URL_KO hay que dejarlas tal cual nos viene en el modulo de Redsys, estas URL se cambian en IndexController.php:

    $miObj->setParameter("DS_MERCHANT_URLOK",$urltienda);
    $miObj->setParameter("DS_MERCHANT_URLKO",$urltienda);
  2. Debido a que tenemos habilitado el OnePageCheckout de Magento, las modificaciones las haremos como OnePageCheckout.
    En el siguiente fichero, haremos las siguientes modificaciones en la función «saveOrderAction»:

    Fichero de modificación de Magento OnePageCheckout

            
            //$this->getOnepage()->getQuote()->save();    Comentamos esta linea.
            
            if (isset($redirectUrl)) {
        	    $result['redirect'] = $redirectUrl;
        	    $this->getOnepage()->getQuote()->setIsActive(1) ;//AÑADIMOS ESTA LINEA AQUÍ
    	}		
    	$this->getOnepage()->getQuote()->save(); //Añadimos esta linea aquí.
    
  3. En este punto, pulsando hacia atrás nuestro carrito seguirá activo, pero queremos que cuando finalicemos el pago aparezca el carrito vacío, por lo tanto tenemos que modificar en este mismo fichero la función successAction:
        /**
         * Order success action
         */
        public function successAction()
        {
    	    Mage::log("Success Action", null, 'debug-david-escudero.log');
            $session = $this->getOnepage()->getCheckout();
            if (!$session->getLastSuccessQuoteId()) {
                $this->_redirect('checkout/cart');
                return;
            }
    		Mage::log("Success Action2", null, 'debug-david-escudero.log');
            $lastQuoteId = $session->getLastQuoteId();
            $lastOrderId = $session->getLastOrderId();
            $lastRecurringProfiles = $session->getLastRecurringProfileIds();
            if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) {
                $this->_redirect('checkout/cart');
                return;
            }
            
            $this->getOnepage()->getQuote()->setIsActive(false) ;		
    		$this->getOnepage()->getQuote()->save(); 
            Mage::getSingleton('checkout/cart')->truncate();
    		Mage::log("Success Action3", null, 'debug-david-escudero.log');
            $session->clear();
            $this->loadLayout();
            $this->_initLayoutMessages('checkout/session');
            Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId)));
            $this->renderLayout();
        }
    

 

Con estos cambios ya os debería funcionar todo correctamente, el pedido se hace correctamente con Redsys, puedes ir hacia atrás cuando estás en el TPV y os funcionará el vaciado del carrito cuando finalizas el pago.

Y llegados a este punto, si no sabeis donde modifcar vuestra plantilla de finalización de pedido, os indico como debeis hacerlo.

Hay que modificar 2 ficheros «.phtml» que se encuentran en las siguientes rutas:

En estas plantillas podeis usar HTML y personalizarlas a vuestra imagen corporativa.