Solucionar error en pasarela de pago CECA al cancelar pago

Hace un tiempo escribí sobre cómo configurar la pasarela de pago Redsys para WooCommerce, hoy quiero retomar el tema para ayudaros a solucionar un problema que podéis encontrar referido a la pasarela de pago CECA.

La mayoría de tiendas online que he desarrollado han utilizado bancos que están bajo la firma Redsys. Esta compañía que trabaja con Banco Santander, Bankia, Banco de Sabadell y muchos más, tiene su propio plugin para WooCommerce (y otras plataformas como Magento, Prestashop, etc.), que funciona perfectamente. Sin embargo, en ocasiones, aparece un cliente que no cumple esta premisa y toca encontrar otras soluciones que pueden dar algún problema.

A continuación te explico cómo instalar el método de pago CECABANK para WooCommerce y solucionar un problema bastante común.

Instalar TPV Virtual gratuito para CECA

Hasta la fecha no he encontrado un plugin oficial desarrollado por CECA, por lo que hay que acuidar a soluciones de terceros o crear un plugin propio con la documentación que aporta la empresa. En este caso decidí utilizar un plugin que podéis encontrar en GitHub y que os ayudará a crear este método de pago como si de cualquier otro fuera.

Para instalarlo únicamente tenéis que seguir las instrucciones que encontraréis en GitHub. Una vez instalado y activado, en los ajustes de WooCommerce, bajo la pestaña de Finalizar compra, se activará un nuevo método llamado Pasarela CECABANK. Basta con rellenar las opciones con los datos que nos ha facilitado en banco, hacer las pruebas pertinentes en modo pruebas y, una vez que esté todo correcto, pasar al modo producción para que los usuarios puedan pagar mediante tarjeta.

Error al cancelar pago en la pasarela de CECA para WooCommerce

Ya tenemos nuestro método de pago activo y todo debe funcionar correctamente, sin embargo un cliente me notificó que al cancelar el pago, una vez estamos en la pasarela del banco, el pedido se procesa como completado a pesar de no efectuar la compra. Esto es un problema muy grave que debe solucionarse inmediatamente y, aunque no he encontrado una solución en internet, es fácil de resolver a primera vista.

Lo primero que tenemos que entender es cómo se comunica WooCommerce con el banco para saber si debe marcar el pedido como pagado, cancelado, etc. y esto se consigue mediante una URL de respuesta que envía la pasarela de pago y que WooCommerce interpreta. Resumiendo, podemos decir que existen dos direcciones que notifican el estado del pago: la que dice que todo está correcto (URL_OK) y la que dice que el pago no se ha completado (URL_NOK).

En este tutorial únicamente vamos a corregir la URL_NOK que se encarga de notificar a WooCommerce que algo falla. Lo haremos mediante la función get_cancel_order_url().

Solucionando el error en el código del plugin

Vamos a echar un vistazo a las líneas del código que hacen referencia a estas direcciones:

        function get_ceca_args( $order ) {
            $result = array();

            $result['MerchantID'] = $this->merchand_id;
            $result['AcquirerBIN'] = $this->acquirer_bin;
            $result['TerminalID'] = $this->terminal_id;
            $result['URL_OK'] = $this->get_return_url( $order );
            $result['URL_NOK'] = $this->get_return_url( $order );
            $result['Firma'] = $this->calculate_sign( $order );
            $result['Cifrado'] = 'SHA1';
            $result['Num_operacion'] = $order->id;
            $result['Importe'] = $order->get_total()*100;
            $result['TipoMoneda'] = $this->currency;
            $result['Exponente'] = '2';
            $result['Pago_soportado'] = 'SSL';
            $result['idioma'] = $this->language;

            return $result;
        }

Como podéis ver en las líneas 7 y 8, ambas variables tienen el mismo valor, ERROR. Este valor es el de la URL_OK, por eso al cancelar el pago se procesa como pagado. ¿La solución? Asignar la URL que marca como CANCELADO el pago a la variable URL_NOK, que en WooCommerce podemos obtenerlo así:

            $result['URL_NOK'] = $order->get_cancel_order_url();

Con esta modificación del plugin conseguiremos que al cancelar el pago no se marque como pagado en WooCommerce, pero todavía falta un ajuste más que debemos hacer para que todo funcione correctamente.

Error en el cálculo de firma

No voy a extenderme ya que la solución es muy similar al apartado anterior. Al haber cambiado el valor de URL_NOK, debemos hacerlo coincidir en la firma que se genera para procesar el pago. Si nos vamos unas líneas más arriba en el código del plugin podremos encontrar una función que genera la firma: calculate_sign(). Corregimos el código de forma que quede así:

        function calculate_sign ( $order ) {

            // Clave_encriptacion+MerchantID+AcquirerBIN+TerminalID+Num_operacion+Importe+
            // TipoMoneda+Exponente+“SHA1”+URL_OK+URL_NOK
            $signature_str = $this->password
                .$this->merchand_id
                .$this->acquirer_bin
                .$this->terminal_id
                .$order->id
                .$order->get_total()*100
                .$this->currency
                .'2SHA1'
                .$this->get_return_url( $order )
                .$order->get_cancel_order_url();

            return sha1($signature_str);
        }

Con esto habremos acabado. Si todo ha ido bien podrás comprobar que el botón de cancelar ahora funciona como debe: cancela el pago y se lo notifica a WooCommerce correctamente.

Si has seguido los pasos y aun así tienes dudas o hay algo que falla, no dudes en dejar un comentario para poder echarte una mano.

Comentarios

  • medios pago dice:

    Estimado amigo,

    Las Url's que indicas son simplemente las Url's de navegador a las que CECA notifica la respuesta del pago. No hace nada mas…

    URL_OK –> CECA enviará por navegador un POST con el array de valores para la respuesta aceptada.
    URL_NOK –> CECA enviará por navegador un POST el array de valores para la respuesta denegada.

    Según observamos sólo tienes en cuenta las Url's de respuesta por navegador para cambiar los estados del pedido en referencia al pago.

    En los plugins de pago de los diferentes CMS siempre debes controlar los estados del pedido por la Url de callback ya que si petase el navegador, en el camino del banco o procesador de la transacción hacía el comercio, se habría cobrado la operación pero el cliente no lo detectaría. Con la posibilidad de que el cliente lo intentase de nuevo y provocase un duplicado.

    Saludos,

    • Hola,

      Efectivamente estamos cambiando las url de respuesta dado que el problema es que, una vez estamos en la pasarela, si pulsamos el botón cancelar, CECA le envía una respuesta al comercio de que el pago se ha realizado bien cuando en realidad el pago ha sido cancelado. Como comento en el artículo, la URL_OK y la URL_NOK son idénticas, cuando deberían ser distintas si no me equivoco. El resto de la operativa lo hace correctamente el plugin y no hay que modificarlo.

      Gracias por la aportación, si crees que habría que tener algo más en cuenta se agradece la info 🙂
      Un saludo!

      • centinel dice:

        Hola Carlos,

        Y si cuando pulsas el botón de "Cancelar" en la pasarela, CECA envía la respuesta al comercio y antes de ser recibida por el comercio peta el navegador del cliente ?

        Redsys salva este tema con una tercera Url de retorno en la que envía un POST con la respuesta de la transacción en Callback por ejemplo por CURL, de servidor a servidor sin pasar por navegador. De esa forma, aunque pete el navegador del cliente, siempre quedará el estado correcto en el historial de la cuenta del cliente.

        CECA no se como resuelve esto y si lo has tenido en cuenta, pero te lo comento por si acaso…

        Saludos,
        Centinel

        • Hola Centinel,

          Es la primera vez que me encuentro con un cliente que utilice CECA y desconozco cómo trabaja en ese aspecto. Utilicé este plugin y me notificaron el problema que surgía al cancelar el pago. Como no pude encontrar ninguna solución a este tema en concreto decidí crear el post para quien le fuera de ayuda.

          Por ahora no han vuelto a pasarme incidencias con el TPV, así que por ahora me vale 🙂 Habría que mirar la documentación pero como se trata de una pasarela que rara vez vaya a volver a utilizar no puedo dedicarle el tiempo que necesitaría.

          Gracias por pasarte de nuevo!
          Un saludo.

          • Jesús Gutiérrez dice:

            Hola Carlos.

            Desconozco como funciona ese plugin, pero basándome en tu post te comento lo siguiente.

            Como bien dice Centinel, esas urls que está utilizando el plugin no son las correctas para marcar una operación como realizada. ¿Qué pasa si el usuario cuando se le muestra la pantalla del tpv-virtual de "operación realizada correctamente" en vez de dar al botón de continuar cierra el navegador y no devuelve el control al comercio? Pues entiendo que la operación estará realizada pero woocomerce no la habrá marcado como "realizada".

            Para ello está la url de callback o como la llamamos nosotros la "url de comunicación online" que además es una url que el plugin dice que tienes que configurar

            The comunication address for the TPV is should be something like:
            http://yourdomain.com/?wc-api=wc_gateway_ceca

            or

            https://yourdomain.com/?wc-api=wc_gateway_ceca

            Esta url o comunicación es una llamada de servidor a servidor sin que el usuario interactue en nada y que solo se hace cuando la operación se ha realizado de forma correcta. Esta llamada es la que se tiene que encargar de marcar la operación en woocomerce como "realizada" y no la otra.

            Para cualquier consulta al respecto estamos a vuestra disposición en el email tpv@cecabank.es.

            – Soporte técnico TPV-Virtual Cecabank –

          • Hola Jesús,

            Tenéis ambos toda la razón. Hace poco me encontré con este mismo problema que comentáis.

            Gracias por vuestra aportación. ¡Feliz año!

  • Robert dice:

    Buenas,
    Tengo una tienda con woocommerce y haciendo los cambios que propones queda resuelto el problema de calculo de la firma, pero cuando cancelo en la pasarela CECA me devuelve al woocommerce como si hubiese hecho la compra satisfactoriamente, osea no toma la URL_NOK sino la URL_OK y el pedido se procesa como OK cuando deberia indicar que se ha cancelado la transaccion.

    Te agradeceria si pudieras darme tu opinion al respecto,

    Gracias

  • Hola Carlos,
    agradecerte este articulo en español, la solución que propone el autor en github (https://github.com/juanmirod/woocommerce-ceca-gateway/blob/master/woocommerce-ceca-gateway.php) es la siguiente forma:

    $result['URL_OK'] = $this->get_return_url( $order );
    $result['URL_NOK'] = get_permalink( woocommerce_get_page_id( 'checkout' ) );

    Debido a mi poco conocimiento de WooCommerce no se si es lo mismo que tu propones.
    Me podrias indicar si es una solución igual de valida o consideras mejor la tuya?

    Desde hace unos días me ha surgido un problema y es que a pesar de realizarse el pago indica como no finalizada la compra.

    Un saludo.

    • Hola Victorio,

      Te aconsejo que sigas lo que dice el autor del plugin, ya que veo que lo ha actualizado en los últimos meses. Tengo pendiente actualizar el artículo pero estoy con otros proyectos desde hace tiempo que me impiden actualizar el blog.

      Quizá el problema lo tengas en la comunicación que se envía desde el tpv a woocommerce, es algo que debes tener configurado desde el panel del banco. Ahora mismo no tengo a mano el panel pero en la documentación encontrarás info (punto 6):
      https://comercios.ceca.es/docs_constpv/img/manual_comercios.pdf

      La URL que debes poner te la especifica el autor del plugin en las instrucciones:
      https://github.com/juanmirod/woocommerce-ceca-gateway

      Si has hecho todo esto debería funcionar correctamente.
      Espero que así sea.

      Un saludo!

Deja un comentario

¿Quieres recibir las últimas novedades en tu e-mail?

¡GRACIAS!