Easyredsys

Easyredsys es una librería basada en Java que facilita la integración de cualquier TPV Virtual de entidades bancarias colaboradoras con Redsys, como BSCH, BBVA, ING Direct, La Caixa, etc. (ver listado completo de entidades colaboradoras), realizando todo el trabajo técnico y centrándose en la funcionalidad final para los integradores de medios de pago.

Easyredsys está basada en las librerías oficiales Java de Redsys pero añadiendon una serie de funcionalidades, las cuales facilitan muchísimo su integración en cualquier aplicación, ya sea de escritorio, web o móvil como Android.

Permite realizar compras CES, compras No CES, autorizaciones, autenticaciones, devoluciones, pagos diferidos y pagos recurrentes ocultando toda la complejidad al desarrollador.

Easyredsys es software libre y está distribuida mediante The Apache Software License, Version 2.0. En los repositorios centrales de maven tienes disponible esta librería ya empaquetada disponible para usar o si lo prefieres puedes compilarla tú mismo desde el código fuente que se encuentra en Github en la dirección https://github.com/majulvez/easyredsys

En el código fuente hay un module de ejemplo de cómo integrar la librería en un proyecto real basado en gradle. Dentro de ese módulo hay un fichero llamado index.jsp en el cual hay un ejemplo funcional de realización de una compra tipo Comercio Electrónico Seguro (CES) y otra de tipo No CES usando integración por servicios web. Puedes ver funcionando el módulo en esta dirección https://easyredsys.miguelangeljulvez.com/easyredsys

Ejemplo de Uso: Compra CES  - Comunicación easyredsys -> banco

Lo primero de todo, añade la dependencia maven a tu proyecto

<dependency>
  <group>com.miguelangeljulvez.easyredsys</group>
  <name>easyredsys-client</name>
  <version>1.0.0</version>
</dependency>

A continuación, crea una clase que implemente la interfaz AppConfig e introduce los datos de tu pasarela que te habrá facilitado tu entidad bancaria

import com.miguelangeljulvez.easyredsys.client.AppConfig;
import com.miguelangeljulvez.easyredsys.client.core.Notification;

public class AppConfigImpl implements AppConfig {

    static String getMerchantCode() {
        return "061978060"; //Este es el código de comercio
    }

    static String getTerminal() {
        return "001"; //Este es el identificador de la terminal
    }

    static String getSecretKey() {
        return "sq7HjrUOBfKmC576ILgskD5srU870gJ7"; //Esta es la clave secreta de tu pasarela en PRODUCCIÓN
                                                   //La clave de preproducción es igual para todas las pasarelas por lo que no tienes que indicarla
    }

    static boolean isTestMode() {
        return true; //Establécelo a false cuando quieras hacer funcionar la pasarela en el entorno de producción
    }

    @Override
    public void saveNotification(Notification notification) {
        // Pon aquí lo que quieras hacer con la notificación. Seguramente, almacenar en tu base de datos que el pedido ha sido pagado
        // Las notificaciones aquí recibidas ya han pasado todas las comprobaciones de seguridad y son válidas
    }
}

A continuación, modifica tu aplicación para usar Easyredsys

<%
OrderCES orderCES = new OrderCES.Builder(AppConfigImpl.class)
                        .transactionType(TransactionType.AUTORIZACION)
                        .currency(Currency.EUR)
                        .consumerLanguage(Language.SPANISH)
                        .order("<Identificador único>") //Identificador que debes generar con 12 caracteres máximo y único
                        .amount(<Cantidad a cobrar>) //La cantidad es sin decimales. Por ejemplo, 10.00€ correspondería al valor 1000
                        .productDescription("Product description")
                        .payMethods(PaymentMethod.TARJETA)
                        .urlOk(<La url al terminar el proceso del banco con éxito>) //La página a la que redirigir al usuario después de que la compra ha finalizado correctamente
                        .urlKo(<La url al terminar el proceso del banco con fallo>) //La página a la que redirigir al usuario después de que la compra ha finalizado erróneamente
                        .urlNotification(<La url de tu servicio de recogida de notificaciones>) //Ver sección notificaciones mas adelante
                        .build();

MessageOrderCESRequest messageOrderCESRequest = new MessageOrderCESRequest.Builder(AppConfigImpl.class)
                        .withOrder(orderCES)
                        .build();
%>

Y crea el formulario que se comunicará con la pasarela de pago

<form action="<%=messageOrderCESRequest.getRedsysUrl()%>" method="post">
    <input name="Ds_SignatureVersion" value="<%=messageOrderCESRequest.getDs_SignatureVersion()%>" type="hidden"/>
    <input name="Ds_MerchantParameters" value="<%=messageOrderCESRequest.getDs_MerchantParameters()%>" type="hidden"/>
    <input name="Ds_Signature" value="<%=messageOrderCESRequest.getDs_Signature()%>" type="hidden"/>
    <input type="submit" value="Submit"/>
</form>

Ejemplo de Uso: Compra CES - Comunicación banco -> easyredsys

Importar esta librería a tu proyecto web para que Easyredsys pueda recibir todos los tipos de notificaciones del banco,

<dependency>
  <group>com.miguelangeljulvez.easyredsys</group>
  <name>easyredsys-server</name>
  <version>1.0.0</version>
</dependency>

Esta librería, habilita uno servicios web axis/jax-ws/jax-rs para que el banco pueda llamar a tu aplicación con las notificaciones de los pedidos realizados.

Para usar estos servicios, debes añadir los ficheros web.xml, beans.xml y server-config.wsdd que se encuentran dentro del ejemplo de integración que hay en el códig fuente (submodulo integration-example-war) en el directorio webapps/WEB-INF de tu proyecto. Ese mismo módulo puedes verlo funcionando en https://easyredsys.miguelangeljulvez.com

Una vez hecho esto, arranca tu servidor de aplicaciones (esta librería ha sido testeada con apache tomcat 8 y wildfly 10) y despliega tu aplicación web. Para comprobar que los servicios están escuchando accede las siguientes url:

Notificaciones SOAP - recomendada (Notificación on-line: literal): http://<urlDeTuSitio>/<contexto>/literal/InotificacionSIS

Notificaciones SOAP (Notificación on-line: con wsdl y sin wsdl): http://<urlDeTuSitio>/<contexto>/axis/InotificacionSIS

Notificaciones REST (Notificación on-line: síncrona y asíncrona): http://<urlDeTuSitio>/<contexto>/rest/InotificacionSIS

Es recomendable que publiques estos servicios bajo https

Deberás usar una de estas 3 urls a la hora de crear el pedido según el tipo de notificación que hayas configurado en la pasarela de pago. Por ejemplo:

OrderCES orderCES = new OrderCES.Builder(AppConfigImpl.class)
                        ...
                        .urlNotification("https://<urlDeTuSitio>/<contexto>/rest/InotifiacionSIS")
                        .build();

Las notificaciones que envía el banco son recibidas en el método saveNotificacion() de la clase AppConfigImpl.java que has implementado

@Override
public void saveNotification(Notification notification) {
    System.out.println("NOTIFICACIÓN RECIBIDA DEL BANCO: ");
    System.out.println(notification);
}

Las notificaciones que aquí se reciben ya han pasado todas las verificaciones y controles de seguridad. En el objeto Notificacion tienes toda la información enviada por Redsys, incluido el orderId, para que marques en tu backend los pedidos como realizados.

Ejemplo de Uso: Compra No CES - Comunicación easyredsys -> banco -> easyredsys

El uso de easyredsys para la integración mediante servicios web es muy similar a lo que hemos visto hasta ahora

OrderNoCES orderNoCES = new OrderNoCES.Builder(AppConfigImpl.class)
        .transactionType(TransactionType.AUTORIZACION)
        .currency(Currency.EUR)
        .order(String.valueOf(getRandomOrder()))
        .amount(1000)
        .cardNumber("4548812049400004")
        .cvv2("123")
        .expiryDate("2012")
        .build();

MessageOrderNoCESRequest messageOrderNoCESRequest = new MessageOrderNoCESRequest.Builder(AppConfigImpl.class)
        .withOrder(orderNoCES)
        .build();

String codigo = null;
try {
    MessageOrderNoCESResponse messageOrderNoCESResponse = EasyRedsysService.request(messageOrderNoCESRequest, AppConfigImpl.class);

    codigo = messageOrderNoCESResponse.getCodigo();
} catch (OperationException e) {
    e.printStackTrace();
    codigo = e.getCode();
}

Sino se produce ninguna OperationException, la compra se ha realizado correctamente. Date cuenta que se pasa como parámetro tanto al mensaje a enviar como al servicios de envío los datos de la pasarela de pago que has definido en la clase AppConfigImpl.class

En el código fuente de github puedes ver una serie de test funcionales con ejemplos para la realización de las distintas operaciones: autorizaciones, devoluciones, pagos recurrentes, etc

También tienes disponible el javadoc de la librería en esta dirección https://easyredsys.miguelangeljulvez.com/easyredsys/javadoc/

 

Si deseas que te ayude con la integración de la pasarela Redsys en tus sistemas o si deseas conocer cómo personalizar la página web del banco para que tenga el aspecto de tu web al realizar la compra, puedes ponerte en contacto conmigo a través de este formulario