Cómo enviar un DTE o Libro Compra Venta ( IECV ) al SII
Bueno ahora expongo codigo para realizar el envío de un documento electrónico al SII.
Antecedentes necesarios:
Nota: Documento = DTE, IECV, Etc
- Rut del emisor del documento.
- Rut de la empresa que genera el documento.
- Nombre del documento a enviar.
- FullPath del archivo a procesar.
- Token del SII en el ambiente que corresponde.
Librerias necesarias:
using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Diagnostics; using System.Security.Permissions; using System.Net;
Secuencia de preparacion del documento electrónico a enviar al SII
#region PREPARACION //// //// Prepare los paramentros para utilizarlos //// en el envio del documento. rutEmisor = rutEmisor.Replace("-", string.Empty); rutEmpresa = rutEmpresa.Replace("-", string.Empty); //// //// Recupere el cuerpo y digito verificador de los //// rut involucrados. string pRutEmisor = rutEmisor.Substring(0, (rutEmisor.Length - 1)); string pDigEmisor = rutEmisor.Substring(rutEmisor.Length - 1); string pRutEmpresa = rutEmpresa.Substring(0, (rutEmpresa.Length - 1)); string pDigEmpresa = rutEmpresa.Substring(rutEmpresa.Length - 1); //// //// Cree el header del request a enviar al SII //// segun la información solicitada del SII secuencia.Append("--7d23e2a11301c4\r\n"); secuencia.Append("Content-Disposition: form-data; name=\"rutSender\"\r\n"); secuencia.Append("\r\n"); secuencia.Append(pRutEmisor + "\r\n"); secuencia.Append("--7d23e2a11301c4\r\n"); secuencia.Append("Content-Disposition: form-data; name=\"dvSender\"\r\n"); secuencia.Append("\r\n"); secuencia.Append(pDigEmisor + "\r\n"); secuencia.Append("--7d23e2a11301c4\r\n"); secuencia.Append("Content-Disposition: form-data; name=\"rutCompany\"\r\n"); secuencia.Append("\r\n"); secuencia.Append(pRutEmpresa + "\r\n"); secuencia.Append("--7d23e2a11301c4\r\n"); secuencia.Append("Content-Disposition: form-data; name=\"dvCompany\"\r\n"); secuencia.Append("\r\n"); secuencia.Append(pDigEmpresa + "\r\n"); secuencia.Append("--7d23e2a11301c4\r\n"); secuencia.Append("Content-Disposition: form-data; name=\"archivo\"; filename=\"" + nombreArchivo + "\"\r\n"); secuencia.Append("Content-Type: text/xml\r\n"); secuencia.Append("\r\n"); //// //// Lea el documento xml que se va a enviar al SII XDocument xdocument = XDocument.Load(uri, LoadOptions.PreserveWhitespace); //// //// Cargue el documento en el objeto secuencia secuencia.Append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\r"); secuencia.Append(xdocument.ToString(SaveOptions.DisableFormatting)); secuencia.Append("\r\n"); #endregion
Ahora es necesario configurar el Request que sera enviado al SII
//// //// Aqui se configura el request que hace la solicitud al SII #region CONFIGURACION DE REQUEST //// //// Defina que ambiente utilizar. //// Certificacion "https://maullin.sii.cl/cgi_dte/UPL/DTEUpload"; string pUrl = "https://maullin.sii.cl/cgi_dte/UPL/DTEUpload"; //// //// Cree los parametros del header. //// Token debe ser el valor asignado por el SII string pMethod = "POST"; string pAccept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,application/vnd.ms-powerpoint, application/ms-excel,application/msword, */*"; string pReferer = "www.hefestosDte.cl"; string pToken = "TOKEN={0}"; //// //// Cree un nuevo request para iniciar el proceso HttpWebRequest request = (HttpWebRequest)WebRequest.Create(pUrl); request.Method = pMethod; request.Accept = pAccept; request.Referer = pReferer; //// //// Agregar el content-type request.ContentType = "multipart/form-data: boundary=7d23e2a11301c4"; request.ContentLength = secuencia.Length; //// //// Defina manualmente los headers del request request.Headers.Add("Accept-Language", "es-cl"); request.Headers.Add("Accept-Encoding", "gzip, deflate"); request.Headers.Add("Cache-Control", "no-cache"); request.Headers.Add("Cookie", string.Format(pToken, token)); //// //// Defina el user agent request.UserAgent = "Mozilla/4.0 (compatible; PROG 1.0; Windows NT 5.0; YComp 5.0.2.4)"; request.KeepAlive = true; #endregion //// //// Escritura del request #region ESCRIBE LA DATA NECESARIA //// //// Recupere el streamwriter para escribir la secuencia try { using (StreamWriter sw = new StreamWriter(request.GetRequestStream())) { sw.Write(secuencia.ToString()); } } catch (Exception ex) { //// //// Error en el metodo //// Error del formato del envio } #endregion
Ahora puede realizar el envío al SII utilizando esta rutina
//// //// Enviar libro/dte y solicitar la respuesta del SII #region ENVIA Y SOLICITA RESPUESTA try { //// //// Defina donde depositar el resultado string respuestaSii = string.Empty; //// //// Recupere la respuesta del sii using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (StreamReader sr = new StreamReader(response.GetResponseStream())) { respuestaSii = sr.ReadToEnd().Trim(); } } //// //// Hay respuesta? if (string.IsNullOrEmpty(respuestaSii)) throw new ArgumentNullException("Respuesta del SII es null"); //// //// Interprete la respuesta del SII. //// respuestaSii contiene la respuesta del SII acerca del envio en formato XML } catch (Exception ex) { //// //// Error en el metodo //// No fue posible enviar o recepcionar la respuesta del SII } #endregion
Bueno sé que el ejemplo es muy simpe pero sé que les servirá, pronto agregaré los comentarios para hacerlo mas comprensible.