private void btnActivar_Click(object sender, EventArgs e) { string fileCer = txtCer.Text; string fileKey = txtKey.Text; string keyPass = txtPass.Text; Cursor.Current = Cursors.WaitCursor; WSConecFM.Resultados r_wsconect = new WSConecFM.Resultados(); /* CREAR LA CONFIGURACION DE CONEXION CON EL SERVICIO SOAP * * Los parametros configurables son: * * 1.- string UserID; Nombre de usuario que se utiliza para la conexion con SOAP * * 2.- string UserPass; Contraseña del usuario para conectarse a SOAP * * 3.- string emisorRFC; RFC del contribuyente * * 4.- string archivoKey; archivo llave * * 5.- string strCer; archivo de certificado * * 6.- string clave; contraseña del archivo llave del certificado * * 7.- string urlActivarCancelacion; URL de la conexion con SOAP * La configuracion inicial es para el ambiente de pruebas */ activarCancelacion activarC = new activarCancelacion(); /* * Si desea cambiar alguna configuracion realizarla solo realizar lo siguiente * activarC.UserID = "Miusuario"; Por poner un ejemplo */ activarC.archivoCer = fileCer; activarC.archivoKey = fileKey; activarC.clave = keyPass; ActivarCancelado activation = new ActivarCancelado(); r_wsconect = activation.Activacion(activarC); Cursor.Current = Cursors.Default; MessageBox.Show(r_wsconect.message); Close(); }
/// <summary> /// Metodo para generar el comprobante mediante un Layout /// </summary> private void cmdTimbrarL_Click(object sender, EventArgs e) { /* * * Puedes encontrar más ejemplos y documentación sobre estos archivos aquí. (Factura, Nota de Crédito, Recibo de Nómina y más...) * * Link: https://github.com/facturacionmoderna/Comprobantes * * Nota: Si deseas información adicional contactanos en www.facturacionmoderna.com */ Cursor.Current = Cursors.WaitCursor; string layoutFile = txtLayout.Text; string currentPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName; string path = currentPath + "\\resultados"; WSConecFM.Resultados r_wsconect = new WSConecFM.Resultados(); // Crear instancia, para los para metros enviados a requestTimbradoCFDI requestTimbrarCFDI reqt = new requestTimbrarCFDI(); reqt.proxy_url = "http://207.91.10.234"; reqt.proxy_port = 8080; reqt.proxy_user = "******"; reqt.proxy_pass = "******"; Timbrado timbra = new Timbrado(); r_wsconect = timbra.Timbrar(layoutFile, reqt); if (!r_wsconect.status) { MessageBox.Show(r_wsconect.message); Environment.Exit(-1); } byte[] byteXML = System.Convert.FromBase64String(r_wsconect.xmlBase64); System.IO.FileStream swxml = new System.IO.FileStream((path + ("\\" + (r_wsconect.uuid + ".xml"))), System.IO.FileMode.Create); swxml.Write(byteXML, 0, byteXML.Length); swxml.Close(); if (reqt.generarCBB) { byte[] byteCBB = System.Convert.FromBase64String(r_wsconect.cbbBase64); System.IO.FileStream swcbb = new System.IO.FileStream((path + ("\\" + (r_wsconect.uuid + ".png"))), System.IO.FileMode.Create); swcbb.Write(byteCBB, 0, byteCBB.Length); swcbb.Close(); } if (reqt.generarPDF) { byte[] bytePDF = System.Convert.FromBase64String(r_wsconect.pdfBase64); System.IO.FileStream swpdf = new System.IO.FileStream((path + ("\\" + (r_wsconect.uuid + ".pdf"))), System.IO.FileMode.Create); swpdf.Write(bytePDF, 0, bytePDF.Length); swpdf.Close(); } if (reqt.generarTXT) { byte[] byteTXT = System.Convert.FromBase64String(r_wsconect.txtBase64); System.IO.FileStream swtxt = new System.IO.FileStream((path + ("\\" + (r_wsconect.uuid + ".txt"))), System.IO.FileMode.Create); swtxt.Write(byteTXT, 0, byteTXT.Length); swtxt.Close(); } MessageBox.Show("Comprobante guardado en " + path + "\\"); Cursor.Current = Cursors.Default; Close(); }
/// <summary> /// Metodo para cancelar un comprobante por medio de su UUID /// </summary> private void cmdCancelarUUID_Click(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor; string uuid = txtUUID.Text; WSConecFM.Resultados r_wsconect = new WSConecFM.Resultados(); requestCancelarCFDI reqc = new requestCancelarCFDI(); Cancelado conex = new Cancelado(); r_wsconect = conex.Cancelar(reqc, uuid); MessageBox.Show(r_wsconect.message); Cursor.Current = Cursors.Default; Close(); }
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; } }
public Resultados Activacion(WSConecFM.activarCancelacion activarCancelacion) { Resultados result = new Resultados(); string cer = activarCancelacion.archivoCer; string key = activarCancelacion.archivoKey; string clv = activarCancelacion.clave; try { if (File.Exists(cer)) { X509Certificate2 cert = new X509Certificate2(cer); cer = Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks); cer = cer.Replace("\n", ""); } else // Codificar a base 64 el contenido del certificado cer = Convert.ToBase64String(Encoding.UTF8.GetBytes(cer)); // Agregar el certificado codificado en base64 a la peticion SOAP activarCancelacion.archivoCer = cer; if (File.Exists(key)) { byte[] llavePrivadaBytes = System.IO.File.ReadAllBytes(@key); key = Convert.ToBase64String(llavePrivadaBytes); } else // Codificar a base 64 el contenido del archivo key key = Convert.ToBase64String(Encoding.UTF8.GetBytes(key)); // Agregar el certificado codificado en base64 a la peticion SOAP activarCancelacion.archivoKey = key; // Conexion con el WS de Facturacion Moderna BasicHttpBinding binding = new BasicHttpBinding(); setBinding(binding); // Direccion del servicio SOAP de Prueba EndpointAddress endpoint = new EndpointAddress(activarCancelacion.urlActivarCancelacion); // Crear instancia al servisio SOAP de cancelado WSLayoutFacturacionModerna.Timbrado_ManagerPort WSFModerna = new WSLayoutFacturacionModerna.Timbrado_ManagerPortClient(binding, endpoint); // Ejecutar servicio de Cancelado Object response = WSFModerna.activarCancelacion(activarCancelacion); if (response != 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[])response; 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); } } XmlElement xmlElementMsg = (XmlElement)xmlDoc.GetElementsByTagName("mensaje").Item(0); XmlElement xmlElementCode = (XmlElement)xmlDoc.GetElementsByTagName("codigo").Item(0); result.message = xmlElementMsg.InnerText; result.code = xmlElementCode.InnerText; result.status = true; return result; } else { result.code = "C00N"; result.message = "El servicio de Cancelado 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; } }
public Resultados Cancelar(WSConecFM.requestCancelarCFDI RequestCancelarCFDI, string uuid) { Resultados result = new Resultados(); try { RequestCancelarCFDI.uuid = uuid; // set this before any web requests or WCF calls if (RequestCancelarCFDI.proxy_url != "") { WebRequest.DefaultWebProxy = new WebProxy(new Uri(RequestCancelarCFDI.proxy_url + ":" + RequestCancelarCFDI.proxy_port)) { Credentials = new NetworkCredential(RequestCancelarCFDI.proxy_user, RequestCancelarCFDI.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(RequestCancelarCFDI.urlCancelado); // Crear instancia al servisio SOAP de cancelado WSLayoutFacturacionModerna.Timbrado_ManagerPort WSFModerna = new WSLayoutFacturacionModerna.Timbrado_ManagerPortClient(binding, endpoint); // Ejecutar servicio de Cancelado Object response = WSFModerna.requestCancelarCFDI(RequestCancelarCFDI); if (response != 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[])response; 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); } } XmlElement xmlElementMsg = (XmlElement)xmlDoc.GetElementsByTagName("Message").Item(0); result.message = xmlElementMsg.InnerText; result.code = "C000"; result.status = true; return result; } else { result.code = "C00N"; result.message = "El servicio de Cancelado 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; } }
/// <summary> /// Metodo para generar el comprobante fiscal /// </summary> private void cmdTimbraXML_Click(object sender, EventArgs e) { /* * * Puedes encontrar más ejemplos y documentación sobre estos archivos aquí. (Factura, Nota de Crédito, Recibo de Nómina y más...) * * Link: https://github.com/facturacionmoderna/Comprobantes * * Nota: Si deseas información adicional contactanos en www.facturacionmoderna.com */ // Especificación de rutas especificas string currentPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName; string keyfile = currentPath + "\\utilerias\\certificados\\20001000000200000278.key"; string certfile = currentPath + "\\utilerias\\certificados\\20001000000200000278.cer"; string xsltPath; if (checkBox1.Checked) xsltPath = currentPath + "\\utilerias\\xslt_retenciones\\retenciones.xslt"; else xsltPath = currentPath + "\\utilerias\\xslt3_2\\cadenaoriginal_3_2.xslt"; string password = "******"; string xmlfile = txtXML.Text; string resultPath = currentPath + "\\resultados"; Cursor.Current = Cursors.WaitCursor; if (!System.IO.File.Exists(xmlfile)) { MessageBox.Show("El archivo "+ xmlfile + " No existe"); Environment.Exit(-1); } if (!System.IO.File.Exists(keyfile)) { MessageBox.Show("El archivo " + keyfile + " No existe"); Environment.Exit(-1); } if (!System.IO.File.Exists(certfile)) { MessageBox.Show("El archivo " + certfile + " No existe"); Environment.Exit(-1); } /* Crear instancia al objeto comprobante */ Comprobante.Utilidades obj = new Comprobante.Utilidades(); /* OBTENER LA INFORMACION DEL CERTIFICADO * * Los parametros enviados son: * * 1.- Ruta del certificado */ string cert_b64 = ""; string cert_No = ""; if (obj.getInfoCertificate(certfile)) { cert_b64 = obj.getCertificate(); cert_No = obj.getCertificateNumber(); } else { MessageBox.Show(obj.getMessage()); Environment.Exit(-1); } /* AGREGAR INFORMACION DEL CERTIFICADO AL XML ANTES DE GENERAR LA CADENA ORIGINA * * Los parametros enviados son: * * 1.- Xml (Puede ser una cadena o una ruta) * * 2.- Certificado codificado en base 64 * * 3.- Numero de certificado * Retorna el XML Modificado */ string newXml = obj.addDigitalStamp(xmlfile, cert_b64, cert_No); if (newXml.Equals("")) { MessageBox.Show(obj.getMessage()); Environment.Exit(-1); } xmlfile = newXml; /* GENERAR CADENA ORIGINAL * * Los paramteros enviado son: * * 1.- xml (Puede ser una cadena o una ruta) * * 2.- xslt (Ruta del archivo xslt, con el cual se construye la cadena original) * * Retorna la cadena original */ string cadenaO = obj.createOriginalChain(xmlfile, xsltPath); if (cadenaO.Equals("")) { MessageBox.Show(obj.getMessage()); Environment.Exit(-1); } /* GENERAR EL SELLO DEL COMPROBANTE * * Los parametros enviado son: * * 1.- archivo de llave privada (.key) * * 2.- Contraseña del archivo de llave privada * * 3.- Cadena Original (Puede ser una cadena o una ruta) * Retorna el sello en r_comprobante.message */ string sello = obj.createDigitalStamp(keyfile, password, cadenaO); if (sello.Equals("")) { MessageBox.Show(obj.getMessage()); Environment.Exit(-1); } /* AGREGAR LA INFORMACION DEL SELLO AL XML * * Los parametros enviados son: * * 1.- Xml (Puede ser una cadena o una ruta) * * 2.- Sello del comprobante * Retorna el XML Modificado */ newXml = obj.addDigitalStamp(xmlfile, sello); if (newXml.Equals("")) { MessageBox.Show(obj.getMessage()); Environment.Exit(-1); } /* CREAR LA CONFIGURACION DE CONEXION CON EL SERVICIO SOAP * * Los parametros configurables son: * * 1.- string UserID; Nombre de usuario que se utiliza para la conexion con SOAP * * 2.- string UserPass; Contraseña del usuario para conectarse a SOAP * * 3.- string emisorRFC; RFC del contribuyente * * 4.- Boolean generarCBB; Indica si se desea generar el CBB * * 5.- Boolean generarTXT; Indica si se desea generar el TXT * * 6.- Boolean generarPDF; Indica si se desea generar el PDF * * 7.- string urlTimbrado; URL de la conexion con SOAP * La configuracion inicial es para el ambiente de pruebas */ WSConecFM.Resultados r_wsconect = new WSConecFM.Resultados(); requestTimbrarCFDI reqt = new requestTimbrarCFDI(); /* * Si desea cambiar alguna configuracion, solo realizar lo siguiente * reqt.generarPDF = true; Por poner un ejemplo */ /* TIMBRAR XML * * Los parametros enviados son: * * 1.- XML; (Acepta una ruta o una cadena) * * 2.- Objeto con las configuraciones de conexion con SOAP * Retorna un objeto con los siguientes valores codificado en base 64: * * 1.- xml en base 64 * * 2.- pdf en base 64 * * 3.- png en base 64 * * 4.- txt en base 64 * Los valores de retorno van a depender de la configuracion enviada a la función */ Timbrado timbra = new Timbrado(); r_wsconect = timbra.Timbrar(newXml, reqt); if (!r_wsconect.status) { MessageBox.Show(r_wsconect.message); Environment.Exit(-1); } byte[] byteXML = System.Convert.FromBase64String(r_wsconect.xmlBase64); System.IO.FileStream swxml = new System.IO.FileStream((resultPath + ("\\" + (r_wsconect.uuid + ".xml"))), System.IO.FileMode.Create); swxml.Write(byteXML, 0, byteXML.Length); swxml.Close(); if (reqt.generarCBB) { byte[] byteCBB = System.Convert.FromBase64String(r_wsconect.cbbBase64); System.IO.FileStream swcbb = new System.IO.FileStream((resultPath + ("\\" + (r_wsconect.uuid + ".png"))), System.IO.FileMode.Create); swcbb.Write(byteCBB, 0, byteCBB.Length); swcbb.Close(); } if (reqt.generarPDF) { byte[] bytePDF = System.Convert.FromBase64String(r_wsconect.pdfBase64); System.IO.FileStream swpdf = new System.IO.FileStream((resultPath + ("\\" + (r_wsconect.uuid + ".pdf"))), System.IO.FileMode.Create); swpdf.Write(bytePDF, 0, bytePDF.Length); swpdf.Close(); } if (reqt.generarTXT) { byte[] byteTXT = System.Convert.FromBase64String(r_wsconect.txtBase64); System.IO.FileStream swtxt = new System.IO.FileStream((resultPath + ("\\" + (r_wsconect.uuid + ".txt"))), System.IO.FileMode.Create); swtxt.Write(byteTXT, 0, byteTXT.Length); swtxt.Close(); } MessageBox.Show("Comprobante guardado en "+ resultPath + "\\"); Cursor.Current = Cursors.Default; Close(); }