Servicio Web para el Timbrado y Cancelación (TimbraSí) Conección con aplicaciónes.net FacturaSí 2011 S.A. de C.V., Todos los derechos reservados
Configuración general del web service Para poder configurar el servicio web dentro de nuestra aplicación, se necesita hacer referencia al webservice, a continuación se muestran un ejemplo de cómo lograrlo en Visual Studio 2010. Paso 1.- Dar click en nuevo proyecto
Paso 2.- Seleccionar el tipo de lenguaje, ya sea Visual Basic o C#, y una plantilla de aplicacion web, en este caso Aplicacion web ASP.NET. Paso 3.- En el explorador de soluciones hacer click derecho en el nombre de la solución, en este caso WebAplications nos desplazamos por el menú hasta Agregar referencia web.
Paso 4.- Se despliega la siguiente ventana y se introduce la dirección URL del servicio web, posteriormente se da click en la flecha verde.
Paso 5.- Se aceptan las advertencias de seguridad. Paso 6.- Por último se define el nombre del servicio web y se da clic en Agregar referencia web.
Paso 7.- Para verificar que el servicio se agregó satisfactoriamente, en el explorador de soluciones debe aparecer un nuevo elemento en la carpeta Web Reference. En este caso el servicio web se llama WebReference. Implementación del cliente La implementación depende del tipo de lenguaje que se utilizará para configurar el cliente, en este ejemplo utilizamos C#, con el siguiente código: usingsystem; usingsystem.collections.generic; usingsystem.linq; usingsystem.web; usingsystem.web.ui; usingsystem.web.ui.webcontrols; usingfacturasiweb.webreference; usingsystem.net.security; usingsystem.net; usingsystem.security.cryptography.x509certificates; namespacefacturasiweb {
publicpartialclass_default: System.Web.UI.Page { publicstaticboolvalidateservercertificate(objectsender, System.Security.Cryptography.X509Certificates.X509Certificatecertificate, X509Chainchain, SslPolicyErrorssslPolicyErrors); { returntrue; } protectedvoidpage_load(objectsender, EventArgse) { Timbradot1=newTimbrado(); StringinputFileName= C:\\ruta\\cfdPrueba.xml"; Stringbase64String; System.IO.FileStreaminFile; byte[] binarydata; StringoutputData=""; infile=newsystem.io.filestream(inputfilename, System.IO.FileMode.Open, System.IO.FileAccess.Read); binarydata=newbyte[infile.length]; longbytesread=infile.read(binarydata, 0,(int)inFile.Length); infile.close(); base64string=system.convert.tobase64string(binarydata, 0, binarydata.length); ServicePointManager.ServerCertificateValidationCallback=new RemoteCertificateValidationCallback(ValidateServerCertificate); outputdata=t1.timbradocfd("usuario","password", base64string, "contraseñacsd"); Console.Write(outputData); } } } En el ejemplo presentado se especifican el acceso a librerías y a los métodos del web service empleando la palabra clave using que hacen referencia al web service y otras necesarias de.net
Dentro de la funcionalidad del código se realizan los siguiente procesos: 1.- verificar los certificados SSL 2.- Se recibe y encripta el XML 3.- Se llama al método timbradocfd del objeto Timbrado, al cual se le envían los parámetros necesarios (explicados posteriormente en la documentación). En VB el código se quedaría de la siguiente manera: ImportsSystem ImportsSystem.Collections.Generic ImportsSystem.Linq ImportsSystem.Web ImportsSystem.Web.UI ImportsSystem.Web.UI.WebControls Importsfacturasiweb.WebReference ImportsSystem.Net.Security ImportsSystem.Net ImportsSystem.Security.Cryptography.X509Certificates Namespacefacturasiweb PublicPartialClass_Default ' TODO:*** ComprobarsiesInheritsoImplements*** InheritsSystem.Web.UI.Page
PublicSharedBooleanValidateServerCertificate(Objectsender, System.Security.Cryptography.X509Certificates.X509Certificatecertificate, X509Chain chain, SslPolicyErrorssslPolicyErrors) Returntrue EndClass ProtectedSubPage_Load(senderAsObject, easeventargs) Dimt1AsNewTimbrado() DiminputFileNameAsString= C:\ruta\cfdPrueba.xml"; Stringbase64String; System.IO.FileStreaminFile; byte[] binarydata; StringoutputData=""; infile=newsystem.io.filestream(inputfilename, System.IO.FileMode.Open, System.IO.FileAccess.Read); binarydata=newbyte[infile.length]; longbytesread=infile.read(binarydata, 0,(int)inFile.Length); infile.close(); base64string=system.convert.tobase64string(binarydata, 0, binarydata.length); ServicePointManager.ServerCertificateValidationCallback=new RemoteCertificateValidationCallback(ValidateServerCertificate); outputdata=t1.timbradocfd("usuario","password", base64string, "contraseñacsd") Console.Write(outputData) EndSub Endnamespace
Métodos del web service Métodos de timbrado timbrar Parámetros: usuario: Nombre de usuario del servicio. password: Contraseña del usuario del servicio. cfdi: El comprobante cfdi v3.2 en Base64. Respuesta: return: El comprobante cfdi v3.2 timbrado en Base64. Excepciones: LoginException Excepción recibida cuando se ha proporcionado un usuario y/o contraseña incorrectos. UserException SyntaxException Excepción recibida cuando el usuario ya no puede timbrar o cancelar debido a que no está activo, sus facturas terminaron o su plan culminó. Errores de sintaxis, ocurre cuando el XML no está en el formato adecuado, CFDI v3.2. StampException Excepción lanzada cuando el PAC detecta una inconsistencia en el CFDI al solicitar el timbrado. InternalException Error Interno del Sistema (contactar a soporte en caso de recibir este tipo de error).
timbrarcfd Parámetros: usuario: Nombre de usuario del servicio. password: Contraseña del usuario del servicio. cfd: El comprobante cfd v2.2 en Base64. passkey: Contraseña del.key del CSD. Respuesta: return: El comprobante cfdi v3.2 timbrado en Base64. Excepciones: LoginException Excepción recibida cuando se ha proporcionado un usuario y/o contraseña incorrectos. UserException SyntaxException Excepción recibida cuando el usuario ya no puede timbrar o cancelar debido a que no está activo, sus facturas terminaron, su plan culminó o no es usuario CFD. Errores de sintaxis, ocurre cuando el XML no está en el formato adecuado. StampException Excepción lanzada cuando el PAC detecta una inconsistencia en el CFDI al momento de solicitar el timbrado. También ocurre cuando existe un error al firmar el CFDI con el CSD. InternalException Error Interno del Sistema (contacte a soporte en caso de recibir este tipo de error).
timbrartxt Parámetros: usuario: Nombre de usuario del servicio. password: Contraseña del usuario del servicio. txt: El comprobante txt en Base64 (véase el documento: estructura de comprobante en Pipes). passkey: Contraseña del.key del CSD. Respuesta: return: El comprobante cfdi v3.2 timbrado en Base64. Excepciones: LoginException Excepción recibida cuando se ha proporcionado un usuario y/o contraseña incorrectos. UserException SyntaxException Excepción recibida cuando el usuario ya no puede timbrar o cancelar debido a que no está activo, sus facturas terminaron, su plan culminó o no es usuario TXT. Errores de sintaxis, ocurre cuando el TXT no está en el formato adecuado. StampException Excepción lanzada cuando el PAC detecta una inconsistencia en el CFDI al momento de solicitar el timbrado. También ocurre cuando existe un error al firmar el CFDI con el CSD. InternalException Error Interno del Sistema (contacte a soporte en caso de recibir este tipo de error).
Métodos de Consulta consultacfdi Parámetros: usuario: Nombre de usuario del servicio. password: Contraseña del usuario del servicio. uuid: El UUID del comprobante cuyo XML se desea obtener. Respuesta: return: El CFDI v3.2 en Base64 con el UUID solicitado. Excepciones: LoginException Excepción recibida cuando se ha proporcionado un usuario y/o contraseña incorrectos. UserException CFDIException InternalException Excepción recibida cuando el usuario ya no puede timbrar o cancelar debido a que no está activo, sus facturas terminaron, su plan culminó o no tiene autorización para consultar ese UUID. Errores arrojado cuando no es posible consultar el CFDI. Error Interno del Sistema (contacte a soporte en caso de recibir este tipo de error).
consultacfdiporfolio Parámetros: usuario: Nombre de usuario del servicio. password: Contraseña del usuario del servicio. rfc: El RFC del emisor del comprobante. folio: El folio del comprobante. serie: La serie del comprobante (opcional). Respuesta: return: El CFDI v3.2 en Base64 con el número de folio solicitado. Excepciones: LoginException Excepción recibida cuando se ha proporcionado un usuario y/o contraseña incorrectos. UserException CFDIException InternalException Excepción recibida cuando el usuario ya no puede timbrar o cancelar debido a que no está activo, sus facturas terminaron, su plan culminó o no tiene autorización para consultar ese UUID. Errores arrojado cuando no es posible consultar el CFDI. Error Interno del Sistema (contacte a soporte en caso de recibir este tipo de error).
consultainfocfdis Parámetros: usuario: Nombre de usuario del servicio. password: Contraseña del usuario del servicio. rfc: El RFC del emisor de los comprobantes. desde: Fecha en la que inicia la búsqueda.. hasta: Fecha en la que termina la búsqueda. Respuesta: return: Listado de datos de los comprobantes correspondientes. La lista incluye los datos de: UUID, serie, folio y fecha de Timbrado Excepciones: LoginException Excepción recibida cuando se ha proporcionado un usuario y/o contraseña incorrectos. UserException CFDIException InternalException Excepción recibida cuando el usuario ya no puede timbrar o cancelar debido a que no está activo, sus facturas terminaron, su plan culminó o no tiene autorización para consultar ese UUID. Errores arrojado cuando no es posible consultar el CFDI. Error Interno del Sistema (contacte a soporte en caso de recibir este tipo de error).
Método de cancelación cancela Parámetros: usuario: Nombre de usuario del servicio. password: Contraseña del usuario del servicio. rfc: El RFC del emisor. uuids: Lista de UUIDs que se desean cancelar. cer: Certificado X.509 del CSD del cliente en formato Base64. Debe coincidir con el parámetro "key", es decir, debe ser la llave pública. key: Llave privada en formato Base64 del CSD del cliente, debe coincidir con el certificado especificado en el parámetro "cer". passkey: Password para la llave privada. Respuesta: return: return: una cadena con la siguiente respuesta: Fecha: FECHA Sello digital SAT: SELLO <estatusuuid -UUID: UUID descripcion >* Excepciones: LoginException Excepción recibida cuando se ha proporcionado un usuario y/o contraseña incorrectos. UserException CancelException Excepción recibida cuando el usuario ya no puede timbrar o cancelar debido a que no está activo, sus facturas terminaron, su plan culminó. Excepción lanzada por el PAC en caso de que el SAT arroje otro código de estado diferente a una cancelación correcta. InternalException Error Interno del Sistema (contacte a soporte en caso de recibir este tipo de error).
Mensajes de excepciones StampException: "Error en proceso de timbrado." + mensaje del PAC Mensajes enviados por el PAC en el proceso de timbrado: "302 - El sello no coincide con la cadena original del cfdi. Cadena original comparada: CadOR Número de Certificado: NoCert Sello: SELLO. "303 - El Número de Certificado especificado no coincide con el número de certificado contenido en el archivo." "303 - El Certificado contenido en la factura no corresponde al RFC del emisor de acuerdo a la lista LCO del SAT." "304 - El Certificado proporcionado ha expirado. Certificado válido desde FECHA hasta FECHA" "304 - El Certificado no es válido aún. Certificado válido desde FECHA hasta FECHA "304 - El certificado proporcionado ha caducado." "304 - El certificado proporcionado fue revocado por el SAT." "305 - La fecha de la factura no se encuentra dentro del rango de fechas válido para el CSD proporcionado." "306 - El certificado proporcionado corresponde a una FIEL. Debe utilizar un CSD para poder emitir una factura." "306 - El certificado proporcionado no corresponde a una FIEL o un CSD." "307 - La factura ya ha sido previamente timbrada. UUID: UUID Fecha Timbrado: FechaTimbrado sello_cfd: SelloCFD sello_sat: SelloSAT certificado_sat: NoCertificadoSAT "308 - El Certificado especificado no ha sido expedido por el SAT." "El certificado proporcionado no corresponde a una FIEL. Debe utilizar una FIEL para poder firmar un manifiesto." "401 - La factura debe tener menos de 72 horas de haberse creado." "401 - La factura tiene una fecha de creación posterior a la fecha actual del servidor. Fecha en el servidor: FECHA Fecha de creación de cfdi: FECHA" "402 - El RFC del emisor no existe en la lista LCO del SAT." "403 - La fecha de creación del cfdi debe ser mayor o igual al 01 de Enero de 2011" Para usuarios txt o cfd: El usuario no tiene su csd almacenado, debe agregar su csd para poder usar el traductor
CancelException: "Error en proceso de cancelación. STATUS - UUID UUID + mensaje del PAC. Mensajes enviados por el PAC en el proceso de cancelación: " previamente cancelado. " " No corresponde el RFC del emisor y de quien solicita la cancelación. " " no existe. " " incidencia no identificada" LoginException: "El usuario y/o contraseña son incorrectos." UserExcepcion: "El usuario no se encuentra en estado activo." "El usuario llegó al límite permitido de facturas." "El plan para el usuario especificado ha finalizado. Para continuar debe renovar su plan." SintaxisException: "Error de sintáxis: + mensaje InternalException: "Ha ocurrido un error interno, por favor, comuníquese con soporte."
Servicio de Pruebas: https://107.23.45.180:8181/facturasistampservice/timbrado?wsdl NOTA: Para poder timbrar en el servicio de pruebas se necesita un Usuario de pruebas, así como un CSD de pruebas que se entrega junto con este documento. usuario: pruebas passphrase: Bpbz0iUVVFUkVUQVJPIgogICAgICAgCSAgIGNvbG9uaWE RFC: CAMN8004301K0 (Las facturas deberán ser emitidas por este RFC) Servicio Productivo: https://timbrasi.com:8181/facturasistampservice/timbrado?wsdl