No mostrar más este mensaje

ecommerce

Confirmación/Devolución 

 

A continuación veremos un ejemplo de llamada al WebService de TPV Virtual para la operativa Petición de Pago. Los pasos que realizaremos son:

  1. Calculamos la firma (más información en el apartado 2.3.3 de esta guía)
  2. Creamos el XML a enviar
  3. Instanciamos un stub del Web Service (más información de la creación del WebService en el apartado 4 de esta guía)
  4. Añadimos la información (el XML creado anteriormente)
  5. Realizamos la petición.

En el ejemplo se usan constantes para los datos de envío. En un escenario real no serán constantes sinó variables de la aplicación. Los datos propios del comercio (identificador, clave secreta, terminal, etc…) son ficticios. Es necesario cambiarlos por los correspondientes a cada comercio.

Declaramos las constantes que contienen la información del pago:

private static final Double IMPORTE         = Double.valueOf(1.45); private static final String PEDIDO             = "123456"; private static final String COMERCIO         = "99999999"; private static final String MONEDA             = "978"; private static final String TARJETA         = "1234567890123456"; private static final String CVV2            = "123"; private static final String TIPO_TRANSACCION    = "A"; private static final String TERMINAL         = "2"; private static final String CLAVE_SECRETA         = "poiuytrewq9876543210"; private static final String FECHA             = "1215";

Declaramos constantes con los nombres de los tags XML correspondientes a:

4_4
private static final String XML_DATOSENTRADA             = "DATOSENTRADA";
private static final String XML_DS_MERCHANT_AMOUNT         = "DS_MERCHANT_AMOUNT"
private static final String XML_DS_MERCHANT_ORDER         = "DS_MERCHANT_ORDER"
private static final String XML_DS_MERCHANT_MERCHANTCODE     = "DS_MERCHANT_MERCHANTCODE";
private static final String XML_DS_MERCHANT_TERMINAL        = "DS_MERCHANT_TERMINAL";
private static final String XML_DS_MERCHANT_CURRENCY        = "DS_MERCHANT_CURRENCY"
private static final String XML_DS_MERCHANT_TRANSACTIONTYPE     = "DS_MERCHANT_TRANSACTIONTYPE"
private static final String XML_DS_MERCHANT_AUTHORISATIONCODE     = "DS_MERCHANT_AUTHORISATIONCODE";
private static final String XML_DS_MERCHANT_MERCHANTSIGNATURE     = "DS_MERCHANT_MERCHANTSIGNATURE";

A continuamos se detalle un método main de ejemplo:

public static void main(String[] args) throws NoSuchAlgorithmException, ParserConfigurationException, IOException, TransformerException {

String firma = FirmaUtils.getFirmaWSPeticionesConfirmacionDevolucion(IMPORTEPEDIDOCOMERCIOMONEDATIPO_TRANSACCIONCLAVE_SECRETA);

    // Creamos el XML
    Document xmlDocument = createXML(firma);

    // Pasamos el objeto XML a String
    String xmlDatosEntrada = documentToString(xmlDocument);

    // Eliminamos todo lo que vaya antes del tag XML_DATOS_ENTRADA
    String datosEntrada = xmlDatosEntrada.substring(xmlDatosEntrada.indexOf(XML_DATOSENTRADA) - 1);
        
    // Creamos el stub del WebService
    SerClsWSEntradaServiceStub entradaServiceStub = new SerClsWSEntradaServiceStub();

    // Creamos un objeto TrataPeticion al que le añadimos los datos de entrada
    TrataPeticion trataPeticion = new TrataPeticion();
    trataPeticion.setDatoEntrada(datosEntrada);

    // Llamamos al WebService y obtenemos la respuesta del mismo
    TrataPeticionResponse trataPeticionResponse = entradaServiceStub.trataPeticion(trataPeticion);

    // Leemos el mensaje de retorno
    String trataPeticionReturn = trataPeticionResponse.getTrataPeticionReturn();

    System.out.println(trataPeticionReturn);

}

Los métodos mostrados a continuación son usados por el main descrito anteriormente:

// Transforma un objeto del tipo Document a un String
private static 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();
    }

// Crea un objeto Document (XML) con los datos a enviar
    private static Document createXML(String firma) throws ParserConfigurationException {

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

        Document document = implementation.createDocument(nullXML_DATOSENTRADAnull);
        document.setXmlVersion("1.0");

        Element raiz = document.getDocumentElement();

        addElemento(document, raiz, XML_DS_MERCHANT_AMOUNT, (int) (IMPORTE * 100));
        addElemento(document, raiz, XML_DS_MERCHANT_ORDERPEDIDO);
        addElemento(document, raiz, XML_DS_MERCHANT_MERCHANTCODECOMERCIO);
        addElemento(document, raiz, XML_DS_MERCHANT_CURRENCYMONEDA);
        addElemento(document, raiz, XML_DS_MERCHANT_TRANSACTIONTYPETIPO_TRANSACCION);
        addElemento(document, raiz, XML_DS_MERCHANT_TERMINALTERMINAL);
        addElemento(document, raiz, XML_DS_MERCHANT_MERCHANTSIGNATURE, firma);
        addElemento(document, raiz, XML_DS_MERCHANT_AUTHORISATIONCODECODIGO_AUTORIZACION);

        return document;
    }

// Añade un nuevo elemento al objeto Document    
private static 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);
        }
    }

Si ejecutamos este programa estaremos enviando esta petición (los datos son ficticios, esto solo es una simulación de ejemplo):

<DATOSENTRADA>
    <DS_MERCHANT_AMOUNT>145</DS_MERCHANT_AMOUNT>
    <DS_MERCHANT_ORDER>123456</DS_MERCHANT_ORDER>
    <DS_MERCHANT_MERCHANTCODE>99999999</DS_MERCHANT_MERCHANTCODE>
    <DS_MERCHANT_CURRENCY>978</DS_MERCHANT_CURRENCY>
    <DS_MERCHANT_TRANSACTIONTYPE>3</DS_MERCHANT_TRANSACTIONTYPE>
    <DS_MERCHANT_TERMINAL>2</DS_MERCHANT_TERMINAL>
    <DS_MERCHANT_MERCHANTSIGNATURE>39a2d3310270dee8688c6d34a9a88ed7afac31e3</DS_MERCHANT_MERCHANTSIGNATURE>
    <DS_MERCHANT_AUTHORISATIONCODE>239991</DS_MERCHANT_AUTHORISATIONCODE>
</DATOSENTRADA>

Y obtendremos esta respuesta:

<RETORNOXML>
    <CODIGO>0</CODIGO>
    <OPERACION>
        <Ds_Amount>145</Ds_Amount>
        <Ds_Currency>978</Ds_Currency>
        <Ds_Order>123456</Ds_Order>
        <Ds_Signature>39a2d3310270dee8688c6d34a9a88ed7afac31e3</Ds_Signature>
        <Ds_MerchantCode>99999999</Ds_MerchantCode>
        <Ds_Terminal>2</Ds_Terminal>
        <Ds_Response>0900</Ds_Response>
        <Ds_AuthorisationCode>239991</Ds_AuthorisationCode>
        <Ds_TransactionType>3</Ds_TransactionType>
        <Ds_SecurePayment>0</Ds_SecurePayment>
        <Ds_Language>1</Ds_Language>
        <Ds_MerchantData></Ds_MerchantData>
        <Ds_Card_Country>724</Ds_Card_Country>
    </OPERACION>
</RETORNOXML>

En los ficheros anexos a esta guía se puede encontrar este ejemplo