Apr JUL
Aug
09
4 captures
2014 2015 2016
22 Feb 2015 - 9 Jul 2015
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 servi ces, 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 mis mo.
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("UTF8")); 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:
hola
En este caso el root es y el nodo a obtener es nos devolverá como String: hola, e sa 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 e n nuestra empresa no es directa si no a través de un servidor Proxy. Esta función debe de ser tomada mu y 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 , está es la forma como el software SoapUI, lo hace
public String formatSendPost(String bytesEncodeBase64){ String xml = ""+ ""+ ""+ ""+ ""+bytesEncodeBase64+""+ ""+ ""+ ""; 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-electronicosws/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