public EnviarDocumentoResponse Post([FromBody] ConsultaTicketRequest request) { var response = new EnviarDocumentoResponse(); try { var conexionSunat = new ConexionSunat(new ConexionSunat.Parametros { Ruc = request.Ruc, UserName = request.UsuarioSol, Password = request.ClaveSol, EndPointUrl = request.EndPointUrl }); var resultado = conexionSunat.ObtenerEstado(request.NroTicket); if (resultado.Item2) { var returnByte = Convert.FromBase64String(resultado.Item1); using (var memRespuesta = new MemoryStream(returnByte)) { using (var zipFile = ZipFile.Read(memRespuesta)) { foreach (var entry in zipFile.Entries) { if (!entry.FileName.EndsWith(".xml")) { continue; } using (var ms = new MemoryStream()) { entry.Extract(ms); ms.Position = 0; var responseReader = new StreamReader(ms); var responseString = responseReader.ReadToEnd(); try { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(responseString); var xmlnsManager = new XmlNamespaceManager(xmlDoc.NameTable); xmlnsManager.AddNamespace("ar", EspacioNombres.ar); xmlnsManager.AddNamespace("cac", EspacioNombres.cac); xmlnsManager.AddNamespace("cbc", EspacioNombres.cbc); response.CodigoRespuesta = xmlDoc.SelectSingleNode(EspacioNombres.nodoResponseCode, xmlnsManager)?.InnerText; response.MensajeRespuesta = xmlDoc.SelectSingleNode(EspacioNombres.nodoDescription, xmlnsManager)?.InnerText; response.TramaZipCdr = resultado.Item1; response.Exito = true; } catch (Exception ex) { response.MensajeError = ex.Message; response.Pila = ex.StackTrace; response.Exito = false; } } } } } } else { response.Exito = true; response.MensajeRespuesta = resultado.Item1; } } catch (Exception ex) { response.MensajeError = ex.Message; response.Pila = ex.StackTrace; response.Exito = false; } return(response); }
private void btnGetStatus_Click(object sender, EventArgs e) { try { using (var frm = new FrmTicket()) { if (frm.ShowDialog() != DialogResult.OK) { return; } if (string.IsNullOrEmpty(frm.txtNroTicket.Text)) { return; } using (var conexion = new ConexionSunat(txtNroRuc.Text, txtUsuarioSol.Text, txtClaveSol.Text, rbRetenciones.Checked ? "ServicioSunatRetenciones" : string.Empty)) { var resultado = conexion.ObtenerEstado(frm.txtNroTicket.Text); if (resultado.Item2) { var returnByte = Convert.FromBase64String(resultado.Item1); var rutaArchivo = string.Format("{0}\\R-{1}.zip", Directory.GetCurrentDirectory(), frm.txtNroTicket.Text); var fs = new FileStream(rutaArchivo, FileMode.Create, FileAccess.Write); fs.Write(returnByte, 0, returnByte.Length); fs.Close(); var sb = new StringBuilder(); // Añadimos la respuesta del Servicio. sb.AppendLine(Resources.procesoCorrecto); // Extraemos el XML contenido en el archivo de respuesta como un XML. var rutaArchivoXmlRespuesta = rutaArchivo.Replace(".zip", ".xml"); // Procedemos a desempaquetar el archivo y leer el contenido de la respuesta SUNAT. using (var streamZip = ZipFile.Read(File.Open(rutaArchivo, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))) { // Nos aseguramos de que el ZIP contiene al menos un elemento. if (streamZip.Entries.Any()) { if (rbRetenciones.Checked) { streamZip.Entries.Last() .Extract(".", ExtractExistingFileAction.OverwriteSilently); } else { streamZip.Entries.First() .Extract(".", ExtractExistingFileAction.OverwriteSilently); } } } // Como ya lo tenemos extraido, leemos el contenido de dicho archivo. var xDoc = XDocument.Parse(File.ReadAllText(rutaArchivoXmlRespuesta)); var respuesta = xDoc.Descendants(XName.Get("DocumentResponse", EspacioNombres.cac)) .Descendants(XName.Get("Response", EspacioNombres.cac)) .Descendants().ToList(); if (respuesta.Any()) { // La respuesta se compone de 3 valores // cbc:ReferenceID // cbc:ResponseCode // cbc:Description // Obtendremos unicamente la Descripción (la última). sb.AppendLine(string.Format("Respuesta de SUNAT a las {0}", DateTime.Now)); sb.AppendLine(((XText)respuesta.Nodes().Last()).Value); } txtResult.Text = sb.ToString(); sb.Length = 0; // Limpiamos memoria del StringBuilder. } else { txtResult.Text = resultado.Item1; } } Hablar(); } } catch (Exception ex) { txtResult.Text = ex.Message; } }