You are on page 1of 7

Apr JUL Aug

09 4 captures

22 Feb 2015 - 9 Jul 2015


2014 2015 2016

About this capture

JA Magz - шаблон joomla Окна

Ultimas Noticias:

Estos minidrones de Parrot funcionan en aire, tierra y agua

WebCarreno.org !!

• Inicio
• Manuales
• Tutoriales
• E-Libros

• Autentificación

Recuérdeme

Consumo de Web Services SRI - Envío de Comprobantes


Detalles

Categoría: SRI - Tutorial

Escrito por Cristhian Carreño

5 meses 3 dias atras

Visto: 5928

Compartir

• Imprimir
• Correo electrónico
Primero para el consumo de un web services debemos identificar si el servicio web está basado en REST o
SOAP, en este caso para el web service que nos da el SRI, está basado en SOAP, por lo cual debemos de
trabajar con estructura XML para el manejo de datos.

El primer paso para continuar con este tutorial, se deberá tener la factura o el comprobante ya firmado, eso
se encuentra en el tutorial SRI Firma Digital XadES-BES, luego de tener el XML firmado nosotros
procederemos a enviar este XML al web services es de donde empezaremos el tutorial.

En este tutorial se a aplicado una metodología muy práctica para trabajar con el web services, por lo cual no
se a utilizado ningún gestor o librerías de terceros, un código muy sencillo y limpio para incorporar a
nuestro proyecto.

Pasos:

Instalar el SoapUI: Es una magnifica herramienta la cual nos permite testear en tiempo real los web services,
en donde podremos enviar y recibir parametros para probar el funcionamiento del mismo.

Rutas:

Para realizar las pruebas de nuestro web services utilizamos las siguientes rutas en donde se encuentran
nuestros archivos WDSL:

https://celcer.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantes?wsdl

https://celcer.sri.gob.ec/comprobantes-electronicos-ws/AutorizacionComprobantes?wsdl

Para poner en producción en cambio utilizamos estas rutas

https://cel.sri.gob.ec/comprobantes-electronicos-ws/RecepcionComprobantes?wsdl

https://cel.sri.gob.ec/comprobantes-electronicos-ws/AutorizacionComprobantes?wsdl

Funciones que utilizaremos para manejar los XML

Está función toma la ruta del documento firmado y lo convierte en un objeto Document, esto es para que
pueda ser manejado más rápidamente en la ejecución de nuestro programa, lo único que nos solicita como
parámetro es la ruta del documento.

public class XML_Utilidades {

public Document getDoc(String dir) throws SAXException,


ParserConfigurationException, IOException{

File fXmlFile = new File(dir);

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();


DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
return doc;
}

Esta función convierte en String el objeto Document, para que podamos obtener parámetros, o escribir
nuevos argumentos. A está función enviamos como parámetro un objeto Document.

public String convertDocumentToString(Document doc) {


TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = tf.newTransformer();
// below code to remove XML declaration
// transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
String output = writer.getBuffer().toString();
return output;
} catch (TransformerException e) {
e.printStackTrace();
}

return null;
}

Esta función realiza lo contrario, vuelve el objeto String a un tipo Document

public Document convertStringToDocument(String xmlStr) {


DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try
{
builder = factory.newDocumentBuilder();
Document doc = builder.parse( new InputSource( new StringReader( xmlStr ) )
);
return doc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

Esta función convierte en Base64 el objeto Document que contendría el XML, proceso importante para el
envío y recepción de datos en un Web Services

public String converBase64(Document doc) throws UnsupportedEncodingException{

String str = convertDocumentToString(doc);

String bytesEncoded = DatatypeConverter.printBase64Binary(str.getBytes("UTF-


8"));

return bytesEncoded;
}

Esta función obtiene los datos jerarquicamente desde un archivo XML, en este caso se encontraría embebido
en un objeto Document, adicional mente se encuentran dos parámetros que debemos de ingresar el rootNodo y
el infoNodo el cual nos devolverá la data dentro de las etiquetas, por ejemplo:
<mensaje>
<data>hola</data>
</mensaje>

En este caso el root es <mensaje> y el nodo a obtener es <data> nos devolverá como String: hola, esa es la
manera de funcionar de la función getNodes(), a continuación.

public String getNodes(String rootNodo, String infoNodo, Document doc){

String resultNodo = null;


Element docEle = doc.getDocumentElement();

NodeList studentList = docEle.getElementsByTagName(rootNodo);

if(studentList.getLength()>0){
Node node = studentList.item(0);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element e = (Element) node;
NodeList nodeList = e.getElementsByTagName(infoNodo);
resultNodo = nodeList.item(0).getChildNodes().item(0).getNodeValue();
}}
return resultNodo;
}

Esta función podría inclusive reemplazar a la función anterior y los que hace es coleccionar de una
estructura XML repetitiva el último tag, esto se puede aprender de mejor manera en el proceso.

public String getLastNode(String pathLevelXML, String nodo, Document doc) throws


XPathExpressionException{

//Ejemplo:
//RespuestaAutorizacionComprobante/autorizaciones/autorizacion[last()]/estado
String pathFull = pathLevelXML + nodo;

XPath xpath = XPathFactory.newInstance().newXPath();

return xpath.evaluate(pathFull, doc);

Esta función es opcional y nos setea una dirección proxy cuando la salida en nuestra empresa no es directa si
no a través de un servidor Proxy. Esta función debe de ser tomada muy en cuenta si no, no podremos enviar
ni recibir peticiones debido a que nuestro programa busca la configuración de red por defecto, osea Internet
sin proxys.

public java.net.Proxy setProxy(String ip, int port){

java.net.Proxy proxy = new java.net.Proxy(java.net.Proxy.Type.HTTP, new


InetSocketAddress(ip, port));

return proxy;

Esta función enviará al servicio web de forma parametrizada los comprobantes que queremos enviar al web
services para que pueda recibir el comprobante, como se puede observar es una estructura basada en SOAP a
la cual se le envian los parámetros en el tag <ec:validarComprobante></ec:validarComprobante>, está es la forma como el
software SoapUI, lo hace

public String formatSendPost(String bytesEncodeBase64){


String xml = "<soapenv:Envelope
xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:ec='http://ec.gob.sri.ws.recepcion'>"+
"<soapenv:Header/>"+
"<soapenv:Body>"+
"<ec:validarComprobante>"+
"<xml>"+bytesEncodeBase64+"</xml>"+
"</ec:validarComprobante>"+
"</soapenv:Body>"+
"</soapenv:Envelope>";

return xml;
}

Esta sería la función más importante debido que es la q consume el web services del SRI para el envío de
comprobantes para su posterior autorización, la cual la explicaremos paso a paso:

Parametros de entrada:

String urlWebServices: Será la dirección de consumo de nuestro servicio Web en este caso para el
ambiente de prueba de recepción de comprobantes sería: "https://celcer.sri.gob.ec/comprobantes-electronicos-
ws/RecepcionComprobantes?wsdl"

String method: En este caso es una petición tipo "POST"

String host: La ruta del servidor Host en donde se hace el envío: "celcer.sri.gob.ec"

String getEncodeXML: Antes de ingresar esta variable se tienen que correr una serie de funciones, esta
variable es la que recibe el XML codificado para ser enviado, para eso se sigue el siguiente procedimiento:

1.- Escoger el documento XML y transformarlo en Document con la función ya explicada getDoc(Ruta).

2.- Escoger la función converBase64(Document), la cual nos pide como parámetro un objeto tipo Document, que lo obtuvimos con la
función anterior, esta función codifica el XML de manera que la data pueda ser enviada hacia el servicio web.

3.- Escoger la función formatSendPost(String), el cual recibirá la función que arrojo como resultado converBase64() de tipo String, esta función
contiene el XML ya codificado y este resultado será la variable getEncodeXML de tipo string.

Proxy proxy: Como se explico anteriormente en está variable se ingresan los parametros de su proxy en
caso tengan uno, si no tienen entonces envíen un valor nulo, la función que se utiliza es: setProxy("Dirección IP",
Puerto) devuelve variable tipo proxy.

El código a continuación de la función que envía todos estos parámetros al web services:

public boolean sendPostSoap(String urlWebServices, String method, String host, String


getEncodeXML, Proxy proxy){

try {

URL oURL = new URL(urlWebServices);

HttpURLConnection con = (HttpURLConnection) oURL.openConnection(proxy);


con.setDoOutput(true);

con.setRequestMethod(method);
con.setRequestProperty("Content-type", "text/xml; charset=utf-8");
con.setRequestProperty("SOAPAction", "");
con.setRequestProperty("Host", host);

OutputStream reqStreamOut = con.getOutputStream();


reqStreamOut.write(getEncodeXML.getBytes());

java.io.BufferedReader rd = new java.io.BufferedReader(new


java.io.InputStreamReader(con.getInputStream(), "UTF8"));

String line = "";


StringBuilder sb = new StringBuilder();

while ((line = rd.readLine()) != null)


sb.append(line);

getEstadoPostSoap(xml_utilidades.convertStringToDocument(sb.toString()),
"RespuestaRecepcionComprobante",
"estado");//está extrae la data de los nodos en un archivo
XML

con.disconnect();

return true;

}catch (Exception ex) {


System.out.println(ex.getMessage());
}
return false;
}

Para finalizar, la siguiente función se encarga de tomar los parámetros que recibe como respuesta nuestro
web services, debido a que devuelve la información en formato XML, se elaboró esta función la cual extrae
la data de los nodos que nos interesan.

Está función debe de ir antes de finalizar la petición tipo Http que se recibe, esto se puede apreciar en la
función anterior, en donde construye nuevamente en base al String q nos da como respuesta el SRI, un
documento tipo XML.

Para entender esto, por favor comprender muy bien la estructura de datos en los archivos XML, hay mucha
información al respecto.

public boolean getEstadoPostSoap(Document doc, String nodoRaiz, String nodoElemento){

String estado = xml_utilidades.getNodes(nodoRaiz, nodoElemento, doc );

if(estado.equals("DEVUELTA")){

System.out.println("Clave de Accceso: " +


getNodes("comprobante","claveAcceso", doc));
System.out.println("Identificador Error: " +
getNodes("mensaje","identificador", doc));
System.out.println("Descripción Error: " + getNodes("mensaje","mensaje",
doc));
System.out.println("Descripción Adicional Error: " +
getNodes("mensaje","informacionAdicional", doc));
System.out.println("Tipo mensaje: " + getNodes("mensaje","tipo", doc));

return false;
}else if(estado.equals("RECIBIDA")){
System.out.println("RECIBIDA");
return true;
}

Para nuestro próximo tutorial, veremos como solicitar la autorización de nuestros comprobantes Consumo
de Web Services SRI - Envío y Recepción de Autorización, cualquier duda o sugerencia será bien recibida.

• Consumo de Web Services SRI - Envío y Recepción de Autorización

< Anterior

• SRI Firma Digital XadES-BES en Java con extensión .net, C#(Corrección)

Siguiente >

A usted también podría gustarle:


Detalles

Categoría: SRI - Tutorial

2 meses 3 semanas atras

Presentación Facturas en La Web usando Vaadin (Framework Java)


Detalles

Categoría: SRI - Tutorial

3 meses 1 semana atras

Consumo de Web Services SRI - Envío de Comprobantes .net ( C# )


Detalles

Categoría: SRI - Tutorial

4 meses 3 semanas atras

Consumo de Web Services SRI - Envío y Recepción de Autorización


Detalles

Categoría: SRI - Tutorial

5 meses 3 dias atras

SRI Firma Digital XadES-BES en Java con extensión .net, C#(Corrección)


Powered by T3 Framework

Close