No mostrar más este mensaje

ecommerce

Firma del comercio

 

Se dotará al comercio de una clave, que se utilizará para firmar los datos aportados por el mismo, pudiendo verificarse no solo la identificación del comercio, sino que los datos no han sido alterados en ningún momento. Se utilizará como algoritmo de securización el Hash SHA-1, que garantiza los requisitos mínimos de seguridad en cuanto a la autenticación del origen. La clave se proporcionará para ser incluida en la web del comercio.

Este mismo algoritmo se utilizará para asegurar al comercio la autenticidad de los datos de la respuesta, en caso de que se proporcione URL de notificación por parte del comercio.

Más información en el apartado 2.4.3 de esta misma guía

A continuación mostramos un ejemplo en JSP:

Indicamos que es una página JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"  pageEncoding="ISO-8859-1"%>

Importamos todas las clases necesarias

<%@ page import="es.lacaixa.redsys.FirmaUtils,
javax.xml.parsers.DocumentBuilder,
javax.xml.parsers.DocumentBuilderFactory,
javax.xml.parsers.ParserConfigurationException,
javax.xml.transform.dom.DOMSource,
javax.xml.transform.stream.StreamResult,
org.w3c.dom.DOMImplementation,
org.w3c.dom.Document,
org.w3c.dom.Element,
org.w3c.dom.Text,
java.io.StringWriter,
javax.xml.transform.Transformer,
javax.xml.transform.TransformerException,
javax.xml.transform.TransformerFactory"
 %>

Declaramos las variables a usar. En un entorno real algunos de estos datos no serán fijos y los recuperaremos de la request

<%! 

    String    VERSION             = "0.1";
    double    IMPORTE             = (double)1.45; 
    String    PEDIDO              = "123456";
    String    MONEDA              = "978";
    String    COMERCIO            = "99999999";
    String    URL_NOTIFICACION    = "http://prueba.com/apl/RedsysSamples/RespuestaXMLServlet ";
    String    URL_OK              = "http://prueba.com/OK.html";
    String    URL_KO              = "http://prueba.com/KO.html";
    String    TERMINAL            = "2";
    String    TIPO_TRANSACCION    = "0";
    String    TARJETA             = "1234567890123456";
    String    FECHA               = "1212";
    String    CVV2                = "123";
    String    CLAVE_SECRETA       = "poiuytrewq9876543210";
    String    URL_ACTION          = "https://sis-t.SERMEPA.es:25443/sis/entradaXMLEntidad";


%>

Calculamos la firma del comercio usando la clase importada previamente. Generamos el XML usando funciones definidas posteriormente:

<%
String FIRMA   = FirmaUtils.getFirmaEnvioXML(Double.valueOf(IMPORTE), 
                                             PEDIDO, 
                                             COMERCIO, 
                                             MONEDA, 
                                             TARJETA, 
                                             URL_NOTIFICACION, 
                                             CVV2, 
                                             null
                                             CLAVE_SECRETA, 
                                             TIPO_TRANSACCION);

Document datosEntradaDoc = createXML(FIRMA, PEDIDO);
String datosEntrada = documentToString(datosEntradaDoc);
datosEntrada = datosEntrada.substring(datosEntrada.indexOf("<DATOSENTRADA>"));
%>

Funciones de apoyo para generar el código XML a enviar desde el formulario:

<%!
private String documentToString(Document document) throws TransformerException {

    DOMSource domSource = new DOMSource(document);
    StringWriter writer = new StringWriter();
    StreamResult result = new StreamResult(writer);
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.transform(domSource, result);
    return writer.toString();
}

private Document createXML(String firma, String pedido) throws ParserConfigurationException {

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    DOMImplementation implementation = builder.getDOMImplementation();

    Document document = implementation.createDocument(null, XML_DATOSENTRADA, null);
    document.setXmlVersion("1.0");

    Element raiz = document.getDocumentElement();

    addElemento(document, raiz, XML_DS_VERSION, VERSION);
    addElemento(document, raiz, XML_DS_MERCHANT_AMOUNT, (int) (IMPORTE * 100));
    addElemento(document, raiz, XML_DS_MERCHANT_CURRENCY, MONEDA);
    addElemento(document, raiz, XML_DS_MERCHANT_ORDER, pedido);
    addElemento(document, raiz, XML_DS_MERCHANT_MERCHANTCODE, COMERCIO);
    addElemento(document, raiz, XML_DS_MERCHANT_MERCHANTURL, URL_NOTIFICACION);
    addElemento(document, raiz, XML_DS_MERCHANT_URLOK, URL_OK);
    addElemento(document, raiz, XML_DS_MERCHANT_URLKO, URL_KO);
    addElemento(document, raiz, XML_DS_MERCHANT_MERCHANTSIGNATURE, firma);
    addElemento(document, raiz, XML_DS_MERCHANT_TERMINAL, TERMINAL);
    addElemento(document, raiz, XML_DS_MERCHANT_TRANSACTIONTYPE, TIPO_TRANSACCION);
    addElemento(document, raiz, XML_DS_MERCHANT_PAN, TARJETA);
    addElemento(document, raiz, XML_DS_MERCHANT_EXPIRYDATE, FECHA);
    addElemento(document, raiz, XML_DS_MERCHANT_CVV2, CVV2);

    return document;
}

private void addElemento(Document document, Element raiz, String nombreElemento, Object valorElemento) {

    if (valorElemento != null) {

        // Creamos un nuevo elemento
        Element hijo = document.createElement(nombreElemento);

        // Ingresamos la info
        Text hijoValor = document.createTextNode(valorElemento.toString());

        // Añadimos el valor al elemento
        hijo.appendChild(hijoValor);

        // Añadimos el elemento a la raiz
        raiz.appendChild(hijo);
    }
}
%>

Creamos el código HTML con el form correspondiente. El form se ha de enviar por POST contiene un solo campo llamado “entrada” que contiene el XML generado anteriormente. Cualquier diferencia en los nombres de los campos del XML será crítica para el buen funcionamiento de la pasarela.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Ejemplo petición POST con con Envío XML</title>
    </head>
    
    <body>

        <h1>Ejemplo petición POST con Envío XML</h1>

        <form id="peticionPostForm" action="
<%= URL_ACTION %>" method="post" enctype="application/x-www-form-urlencoded">

            <input type="hidden" name="entrada" value="
<%= datosEntrada %>"/>            
            <input type="submit" value="Realizar Pago"/>
            
        </form>

    </body>
</html>

Para probarlo, entramos al navegador (el host y context-root variarán en función de cada desarrollo):

3_1_1_a

Cuando realicemos el submit del formulario este nos enviará a la pasarela de pago. En ese punto el control lo tiene la pasarela y estamos fuera de nuestra aplicación. El pago se realiza automáticamente puesto que ya hemos suministrado los datos del pago:

3_1_1_b

Cuando le demos a continuar el navegador nos redirigirá a la URL de OK que hayamos enviado en el formulario:

3_1_1_c

Si hay algún problema durante el proceso nos redigirá a la URL de KO.