DevopensourceTeam / Devopensource_Redsys

Método de pago para Redsys para Magento compatible con SHA-256 y parche SUPEE-6788
https://devopensource.com/blog/devopensource-y-redsys
27 stars 11 forks source link

Problema función Callback #44

Closed ajaferreira closed 8 years ago

ajaferreira commented 8 years ago

El módulo me funciona perfectamente con excepción de la función Callback. Ya está implementada esta función? Estoy con la versión 1.9.2.1 de Magento y ningún cambio en los parámetros de configuración relacionados con la función Callback parece tener cualquier efecto. Por ejemplo: si cambio la configuración a "Custom Callback" y introduzco una URL cualquiera, me sigue enviando a "checkout/onepage/success" o "checkout/onepage/failure". Además, claro, los pedidos nunca se quedan en el estado que defina en la configuración.

danielozano commented 8 years ago

Hola @ajaferreira.

¿Has probado a meter un Mage::log() en dicha función?

Creo (y espero no equivocarme) que hay una diferencia entre la URL_OK (success)/URL_KO(failure) y el callback.

Si dentro de tu TPV tienes activada la notificación asíncrona, hará una petición a tu función callback, y según el estado de la transacción redirigirá a la URL_OK(checkout/onepage/success) o a la URL_KO(checkout/onepage/failure), por o que el paso por la función callback es invisible para el usuario.

Yo probaría a poner un log dentro de dicha función para ver si realmente está pasando por ahí:

Mage::log('mensaje', null, 'test-redsys.log');

Espero no haberme equivocado y que esto te sea de ayuda (en caso de que no lo hayas probado ya).

Un saludo.

ajaferreira commented 8 years ago

Hola @danielozano,

Gracias por tu comentario.

Por lo que entiendo, el callback estará redireccionando correctamente a las URL_OK y URL_KO, ya que los pedidos de prueba que estoy haciendo se terminan correctamente con indicación de éxito o fallo, en las respectivas URL's por defecto del Magento.

Siendo el paso por la función callback invisible, mi problema está en que esa función ignora todas las definiciones que hago en la configuración del módulo, con excepción del parámetro de recuperar el carrito de compras en caso de fallo.

Lo que realmente necesito que funcione es que los pedidos se queden automáticamente en proceso o cancelados, dependiendo de la aceptación o no del pago con tarjeta bancária. Iré a activar el log como indicas, para ver porque falla esta fase del proceso de callback, y luego comento algo.

Un saludo.

mbernabeu commented 8 years ago

Hola @ajaferreira como comenta @danielozano el callback no tiene nada que ver con la url_ok/url_ko

La url_ok/url_ko es la url a la que se redirecciona el cliente cuando finaliza el pago en la pasarela url_ok en caso de pago correcto o ko en caso incorrecto.

Luego esta el callback que es independiente de la redireccion del cliente y es una llamada que nos realiza la pasarela de pago en la que nos indica si el cobro se ha realizado correctamente o no, primero comprueba si el callback esta entrando correctamente puedes verlo en la administración en el historico de pedido, si estas en una url local o bien en algún dev cerrado no podrás recibir la llamada ya que Redsys no podrá acceder a la url.

ajaferreira commented 8 years ago

Hola @mbernabeu,

Gracias por aclararme un poco más de la función del callback. Tengo el módulo configurado en modo de prueba (sis-t), pero está instalado en un servidor que se encuentra en producción y disponible en la web. Estoy seguro que no habrá problemas de conexión entre el servidor y la pasarela de Redsys, ya que puedo enviar pedidos de cobro y recibir la confirmación. Mi duda es: ¿cómo puedo confirmar si tengo algún problema de conexión entre la pasarela de pago y el callback?

Me dices que debo mirar el histórico de los pedidos. Aquí veo que se van procesando hasta llegar al paso "Entro TPV Virtual", pero luego no se registra el paso siguiente. Imagino que seria el callback, el responsable por añadir los pasos "En proceso" o "Cancelado", en el histórico del pedido. Si esto es correcto, ¿que tipo de configuración puede estar fallando, para que la pasarela de pago no pueda hacer la llamada al callback?

¡Gracias de antemano por vuestra ayuda!

mbernabeu commented 8 years ago

Si se queda en entra TPV es que no esta entrando bien el callback debería de verse así mirate las issues cerradas por que este problema se ha solucionado varias veces-

captura de pantalla 2016-03-30 a las 11 36 22

ajaferreira commented 8 years ago

Pues sí, el "Entra TPV" es el último que recibo a cada pedido de pruebas. Desconocía la posibilidad de ver las issues cerradas, y lo siento por mí falta de conocimiento. Ahora las miraré y luego confirmo la resolución del problema.

Una vez más, ¡gracias!

danielozano commented 8 years ago

Sí efectivamente puede que el callback no sea accesible. Si le metes un log al __construct de dicho callback o a la propia función puedes ver si realmente te funciona o no.

Si utilizas el que viene por defecto y funciona correcto.. es que tu controlador está mal creado.

ajaferreira commented 8 years ago

Me gustaría tener algo concreto para reportar, pero los de Redsys están tardando bastante en recuperar mi acceso al entorno de pruebas de mi TPV Virtual, el cual dejó de funcionar en cuanto envié la solicitud para pasar a entorno real. Ahora mismo sigo sin haber recibido datos de acceso al entorno real, y el acceso al entorno de pruebas parece estar desactivado o me habrán cambiado la contraseña sin avisar... O sea, no tengo manera de confirmar el resultado de la operación desde el panel de control de Redsys!

Cuanto al problema del callback, sigue todo igual. He revisado las varias issues cerradas relacionadas con este problema, y lo único que quedó claro es que la url del callback la tengo que definir manualmente debido a tener multi idiomas configurados. Después de confirmar que la dirección del callback que he definido en la configuración (www.direccion.com/es/redsys/index/callback, para idioma Español) no me devuelve ningún error 404, hice una prueba y me sigue sin haber procesado el pedido.

Una consulta: segundo los de Redsys, la URL del callback no puede redireccionar a otra URL. Cuando intento acceder a la URL www.direccion.com/es/redsys/index/callback, veo que me redirecciona a www.direccion.com/es/, abriendo la página inicial de mi web. Será este el problema? Tengo el PHP instalado como FastCGI. Será necesario tocar el .httaccess, para evitar que esta URL se redireccione a la página inicial?

danielozano commented 8 years ago

Hola @ajaferreira, la redirección es un comportamiento normal del callback.

    public function callbackAction()
    {
        $this->helper = Mage::helper('devopensource_redsys');

        $params = $this->getRequest()->getPost();
        if (count($params) > 0){
            $data    = $_POST["Ds_MerchantParameters"];
            $signature_response    = $_POST["Ds_Signature"];

            $redsys     = new RedsysAPI;
            $decodeData = $redsys->decodeMerchantParameters($data);

            $sha256key = Mage::getStoreConfig('payment/redsys/sha256key',Mage::app()->getStore());
            $signature = $redsys->createMerchantSignatureNotif($sha256key,$data);

            $amount     = $redsys->getParameter('Ds_Amount');
            $orderId      = $redsys->getParameter('Ds_Order');
            $merchantcode    = $redsys->getParameter('Ds_MerchantCode');
            $terminal  = $redsys->getParameter('Ds_Terminal');
            $response = $redsys->getParameter('Ds_Response');
            $transaction = $redsys->getParameter('Ds_TransactionType');

            $merchantcodemagento = Mage::getStoreConfig('payment/redsys/merchantcode',Mage::app()->getStore());
            $terminalmagento = Mage::getStoreConfig('payment/redsys/terminal',Mage::app()->getStore());
            $transactionmagento =Mage::getStoreConfig('payment/redsys/transaction',Mage::app()->getStore());

            if ($signature === $signature_response
                && isset($orderId)
                && $transaction == $transactionmagento
                && $merchantcode == $merchantcodemagento
                && intval(strval($terminalmagento)) == intval(strval($terminal))
            ) {
                $responsecode = intval($response);
                if ($responsecode <= 99){
                    $authorisationcode = $redsys->getParameter('Ds_AuthorisationCode');
                    $order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
                    $transaction_amount = number_format($order->getTotalDue(), 2, '', '');
                    $amountOrder = (float)$transaction_amount;

                    if ($amountOrder != $amount) {
                        $order->addStatusHistoryComment($this->__("Error: Amount is diferent"),false);
                        $this->helper->stateErrorTpv($order);
                        $this->helper->restoreStock($order);
                    }

                    try {
                        $comment = $this->__('TPV payment accepted. (response: %s, authorization: %s)',$response,$authorisationcode);
                        $this->helper->stateConfirmTpv($order,$comment);
                        $order->sendNewOrderEmail();
                        $this->helper->createInvoice($order);
                        $this->helper->createTransaction($order,$decodeData);
                    } catch (Exception $e) {
                        $order->addStatusHistoryComment($this->__("TPV Error: %s",$e->getMessage()), false);
                        $order->save();
                    }
                } else {
                    $errorMessage = $this->helper->comentarioReponse($responsecode)." ".$this->__("(response:%s)",$response);
                    $order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
                    $this->helper->stateErrorTpv($order,$errorMessage);
                    $this->helper->restoreStock($order);
                }

            } else {
                $order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
                $order->addStatusHistoryComment($this->__("Error: Signature is wrong"),false);
                $this->helper->stateErrorTpv($order);
                $this->helper->restoreStock($order);

            }

        }else{
            $this->_redirect('');
        }
}

Si te fijas, si no hay parámetros POST hace una re-dirección a la home, por lo que si intentas visitarla desde el navegador recibirás la redirección.

Creo que cuando pasas a entorno real te cierran el de pruebas. Por lo que tendrás que debugear con el entorno real.

Cuando puedas acceder a tu TPV estaría bien que nos pasaras algunos parámetros de configuración. Yo de momento probaría metiendo logs dentro del callback definido por defecto (en la función que te he dejado arriba).

Por ejemplo puedes comprobar si llegan bien los parámetros desde el TPV añadiendo (por cada parámetro a comprobar):

Mage::log($signature, null, 'debug-devopensource.log');
....
ajaferreira commented 8 years ago

Gracias a todos por vuestra ayuda imprescindible!

Después de aplicar los logs, tanto el message en el inicio de la función callback, como el $signature, justo después de se asignar la variable, he visto que ni siquiera se creaban los respectivos ficheros en /var/log. A partir de ahí, y mismo sin poder acceder al TPV Virtual para comprobar que error salía, estaba seguro que el problema estaría en que no habría conexión a la URL de Callback en mi servidor.

Después de probar varios tipos de Custom Callback (tengo web con multi idiomas...), empecé a hacer pruebas con el "Compilation" y la cache desactivados, y finalmente encontré la configuración correcta: {{unsecure_base_url}}es/redsys/index/callback (para web en Español, claro).

Ya había probado esta configuración antes sin éxito, pero creo que podrá haber fallado por estar algo en la cache...

Ahora sí, ya veo los pedidos procesados correctamente: Apr 1, 2016 9:00:17 PM|Canceled Customer Not Notified Error: Tarjeta ajena al servicio (respuesta:0180) Apr 1, 2016 9:00:06 PM|Pending Customer Not Notified Entra TPV


Apr 1, 2016 9:02:14 PM|Processing Customer Not Notified Factura 300000151 creada Apr 1, 2016 9:02:14 PM|Processing Customer Notification Not Applicable Captura de importe de 16,00 € online. Apr 1, 2016 9:02:12 PM|Processing Customer Not Notified Pago TPV aceptado. (respuesta: 0000, autorizacion: 617269) Apr 1, 2016 9:01:54 PM|Pending Customer Not Notified Entra TPV

Además, ya recibo los logs que quería: -- debug-devopensource.log 2016-04-01T19:00:16+00:00 DEBUG (7): c-cFgsVeieJUka1HdNOaDm9awydEqge88_58qNPRiGk=

2016-04-01T19:02:12+00:00 DEBUG (7): KeXo5QSpTjpBXkwlP29WUQHpy33ziBWMIqLnRD7v6Xc=

test-redsys.log 2016-04-01T19:00:16+00:00 DEBUG (7): mensaje 2016-04-01T19:02:12+00:00 DEBUG (7): mensaje

Solucionado!