Buscar en este blog

Mostrando entradas con la etiqueta request. Mostrar todas las entradas
Mostrando entradas con la etiqueta request. Mostrar todas las entradas

miércoles, 22 de mayo de 2013

Cómo enviar un Documento Electronico al SII

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.