public Resultados Timbrar(string layout, WSConecFM.requestTimbrarCFDI RequestTimbrarCFDI) { Resultados result = new Resultados(); try { if (File.Exists(layout)) { StreamReader objReader = new StreamReader(layout, Encoding.UTF8); layout = objReader.ReadToEnd(); objReader.Close(); } // Codificar a base 64 el layout layout = Convert.ToBase64String(Encoding.UTF8.GetBytes(layout)); // Agregar el XML codificado en base64 a la peticion SOAP RequestTimbrarCFDI.text2CFDI = layout; // indicar que no deseamos esperar confirmación del server, sino que debe enviar los datos al mismo tiempo que se realiza la solicitud. System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidarCertificado); // set this before any web requests or WCF calls if (RequestTimbrarCFDI.proxy_url != "") { WebRequest.DefaultWebProxy = new WebProxy(new Uri(RequestTimbrarCFDI.proxy_url + ":" + RequestTimbrarCFDI.proxy_port)) { Credentials = new NetworkCredential(RequestTimbrarCFDI.proxy_user, RequestTimbrarCFDI.proxy_pass), }; } // Conexion con el WS de Facturacion Moderna BasicHttpBinding binding = new BasicHttpBinding(); setBinding(binding); // Direccion del servicio SOAP de Prueba EndpointAddress endpoint = new EndpointAddress(RequestTimbrarCFDI.urlTimbrado); // Crear instancia al servisio SOAP de Timbrado WSLayoutFacturacionModerna.Timbrado_ManagerPort WSFModerna = new WSLayoutFacturacionModerna.Timbrado_ManagerPortClient(binding, endpoint); // Ejecutar servicio de Timbrado Object objResponse = WSFModerna.requestTimbrarCFDI(RequestTimbrarCFDI); if (objResponse != null) { XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration xmlDeclaration; XmlElement xmlElementBody; xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "uft-8", "no"); xmlElementBody = xmlDoc.CreateElement("Container"); xmlDoc.InsertBefore(xmlElementBody, xmlDoc.DocumentElement); XmlElement xmlParentNode; xmlParentNode = xmlDoc.CreateElement("responseSoap"); xmlDoc.DocumentElement.PrependChild(xmlParentNode); XmlNode[] nodosXmlResponse = (XmlNode[])objResponse; foreach (XmlNode nodo in nodosXmlResponse) { if (nodo.InnerText.Length >= 1) { XmlElement xmlElemetResponse; xmlElemetResponse = xmlDoc.CreateElement(nodo.Name.ToString()); XmlText xmlTextNode; xmlTextNode = xmlDoc.CreateTextNode(nodo.InnerText.ToString()); xmlParentNode.AppendChild(xmlElemetResponse); xmlElemetResponse.AppendChild(xmlTextNode); } } //-->>Accedemos a los nodos de la respuesta del xml para obenter los valores retornados en base64 (xml, pdf, cbb, txt) XmlElement xmlElementCFDI; //-->>Xml certificado (CFDI) xmlElementCFDI = (XmlElement)xmlDoc.GetElementsByTagName("xml").Item(0); // Obtener UUID del Comprobante XmlDocument cfdiXML = new XmlDocument(); byte[] binary = Convert.FromBase64String(xmlElementCFDI.InnerText); String strOriginal = System.Text.Encoding.UTF8.GetString(binary); cfdiXML.LoadXml(strOriginal); XmlElement xmlElementTimbre; xmlElementTimbre = (XmlElement)cfdiXML.GetElementsByTagName("tfd:TimbreFiscalDigital").Item(0); result.uuid = xmlElementTimbre.GetAttribute("UUID"); result.xmlBase64 = xmlElementCFDI.InnerText; //-->>Representación impresa del CFDI en formato PDF if (RequestTimbrarCFDI.generarPDF) { XmlElement xmlElementPDF = (XmlElement)xmlDoc.GetElementsByTagName("pdf").Item(0); result.pdfBase64 = xmlElementPDF.InnerText; } //-->>Representación impresa del CFDI en formato TXT if (RequestTimbrarCFDI.generarTXT) { XmlElement xmlElementTXT = (XmlElement)xmlDoc.GetElementsByTagName("txt").Item(0); result.txtBase64 = xmlElementTXT.InnerText; } //-->>Representación impresa del CFDI en formato PNG if (RequestTimbrarCFDI.generarCBB) { XmlElement xmlElementCBB = (XmlElement)xmlDoc.GetElementsByTagName("png").Item(0); result.cbbBase64 = xmlElementCBB.InnerText; } result.code = "T000"; result.message = "Comprobante Generado con exito"; result.status = true; return result; } else { result.code = "T00N"; result.message = "El servicio de timbrado respondio con NULL"; result.status = false; return result; } } catch(Exception e) { result.code = "EX-001"; result.message = "Error: " + e.Message; result.status = false; return result; } }