public FirmadoResponse Post([FromBody] FirmadoRequest request) { var response = new FirmadoResponse(); try { var serializador = new Serializador { RutaCertificadoDigital = request.CertificadoDigital, PasswordCertificado = request.PasswordCertificado, TipoDocumento = request.UnSoloNodoExtension ? 0 : 1 }; response.TramaXmlFirmado = serializador.FirmarXml(request.TramaXmlSinFirma); response.ResumenFirma = serializador.DigestValue; response.ValorFirma = serializador.ValorFirma; response.Exito = true; } catch (Exception ex) { response.MensajeError = ex.Message; response.Pila = ex.StackTrace; response.Exito = false; } return(response); }
private void btnGen_Click(object sender, EventArgs e) { try { string codigoTipoDoc; switch (cboTipoDoc.SelectedIndex) { case 0: codigoTipoDoc = "01"; break; case 1: codigoTipoDoc = "03"; break; case 2: codigoTipoDoc = "07"; break; case 3: codigoTipoDoc = "08"; break; case 4: codigoTipoDoc = "20"; break; case 5: codigoTipoDoc = "40"; break; default: codigoTipoDoc = "01"; break; } // Una vez validado el XML seleccionado procedemos con obtener el Certificado. var serializar = new Serializador { RutaCertificadoDigital = Convert.ToBase64String(File.ReadAllBytes(txtRutaCertificado.Text)), PasswordCertificado = txtPassCertificado.Text, TipoDocumento = rbRetenciones.Checked ? 0 : 1 }; using (var conexion = new ConexionSunat(txtNroRuc.Text, txtUsuarioSol.Text, txtClaveSol.Text, rbRetenciones.Checked ? "ServicioSunatRetenciones" : string.Empty)) { var byteArray = File.ReadAllBytes(txtSource.Text); Cursor = Cursors.WaitCursor; // Firmamos el XML. var tramaFirmado = serializar.FirmarXml(Convert.ToBase64String(byteArray)); // Le damos un nuevo nombre al archivo var nombreArchivo = $"{txtNroRuc.Text}-{codigoTipoDoc}-{txtSerieCorrelativo.Text}"; // Escribimos el archivo XML ya firmado en una nueva ubicación. using (var fs = File.Create($"{nombreArchivo}.xml")) { var byteFirmado = Convert.FromBase64String(tramaFirmado); fs.Write(byteFirmado, 0, byteFirmado.Length); } // Ahora lo empaquetamos en un ZIP. var tramaZip = serializar.GenerarZip(tramaFirmado, nombreArchivo); var resultado = conexion.EnviarDocumento(tramaZip, $"{nombreArchivo}.zip"); if (resultado.Item2) { var returnByte = Convert.FromBase64String(resultado.Item1); var rutaArchivo = $"{Directory.GetCurrentDirectory()}\\R-{nombreArchivo}.zip"; 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))) { // 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($"Respuesta de SUNAT a las {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; } } catch (FaultException exSer) { txtResult.Text = exSer.ToString(); } catch (Exception ex) { txtResult.Text = ex.Message; } finally { Cursor = Cursors.Default; } }
private void btnGen_Click(object sender, EventArgs e) { try { string codigoTipoDoc; switch (cboTipoDoc.SelectedIndex) { case 0: codigoTipoDoc = "01"; break; case 1: codigoTipoDoc = "03"; break; case 2: codigoTipoDoc = "07"; break; case 3: codigoTipoDoc = "08"; break; case 4: codigoTipoDoc = "20"; break; case 5: codigoTipoDoc = "40"; break; default: codigoTipoDoc = "01"; break; } // Una vez validado el XML seleccionado procedemos con obtener el Certificado. var serializar = new Serializador { RutaCertificadoDigital = Convert.ToBase64String(File.ReadAllBytes(txtRutaCertificado.Text)), PasswordCertificado = txtPassCertificado.Text, TipoDocumento = rbRetenciones.Checked ? 0 : 1 }; using (var conexion = new ConexionSunat(txtNroRuc.Text, txtUsuarioSol.Text, txtClaveSol.Text, rbRetenciones.Checked ? "ServicioSunatRetenciones" : string.Empty)) { var byteArray = File.ReadAllBytes(txtSource.Text); Cursor = Cursors.WaitCursor; // Firmamos el XML. var tramaFirmado = serializar.FirmarXml(Convert.ToBase64String(byteArray)); // Le damos un nuevo nombre al archivo var nombreArchivo = $"{txtNroRuc.Text}-{codigoTipoDoc}-{txtSerieCorrelativo.Text}"; // Escribimos el archivo XML ya firmado en una nueva ubicación. using (var fs = File.Create($"{nombreArchivo}.xml")) { var byteFirmado = Convert.FromBase64String(tramaFirmado); fs.Write(byteFirmado, 0, byteFirmado.Length); } // Ahora lo empaquetamos en un ZIP. var tramaZip = serializar.GenerarZip(tramaFirmado, nombreArchivo); var resultado = conexion.EnviarDocumento(tramaZip, $"{nombreArchivo}.zip"); if (resultado.Item2) { var returnByte = Convert.FromBase64String(resultado.Item1); var rutaArchivo = $"{Directory.GetCurrentDirectory()}\\R-{nombreArchivo}.zip"; 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))) { // Nos aseguramos de que el ZIP contiene al menos un elemento. if (streamZip.Entries.Any()) { 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($"Respuesta de SUNAT a las {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; } } } catch (FaultException exSer) { txtResult.Text = exSer.ToString(); } catch (Exception ex) { txtResult.Text = ex.Message; } finally { Cursor = Cursors.Default; } }
private void btnGen_Click(object sender, EventArgs e) { try { string codigoTipoDoc; string letraTipoDoc; switch (cboTipoDoc.SelectedIndex) { case 0: letraTipoDoc = "F"; codigoTipoDoc = "01"; break; case 1: letraTipoDoc = "B"; codigoTipoDoc = "03"; break; case 2: letraTipoDoc = "F"; codigoTipoDoc = "07"; break; case 3: letraTipoDoc = "F"; codigoTipoDoc = "08"; break; case 4: letraTipoDoc = "R"; codigoTipoDoc = "20"; break; case 5: letraTipoDoc = "P"; codigoTipoDoc = "40"; break; default: letraTipoDoc = "F"; codigoTipoDoc = "01"; break; } // Una vez validado el XML seleccionado procedemos con obtener el Certificado. var serializar = new Serializador { RutaCertificadoDigital = Convert.ToBase64String(File.ReadAllBytes(txtRutaCertificado.Text)), PasswordCertificado = txtPassCertificado.Text, TipoDocumento = rbRetenciones.Checked ? 0 : 1 }; using (var conexion = new ConexionSunat(txtNroRuc.Text, txtUsuarioSol.Text, txtClaveSol.Text, rbRetenciones.Checked ? "ServicioSunatRetenciones" : string.Empty)) { //var archivoOriginal = Path.GetFileName(txtSource.Text); var byteArray = File.ReadAllBytes(txtSource.Text); Cursor = Cursors.WaitCursor; // Firmamos el XML. var tramaFirmado = serializar.FirmarXml(Convert.ToBase64String(byteArray)); // Le damos un nuevo nombre al archivo var nombreArchivo = $"{txtNroRuc.Text}-{codigoTipoDoc}-{letraTipoDoc}001-001"; // Ahora lo empaquetamos en un ZIP. var tramaZip = serializar.GenerarZip(tramaFirmado, nombreArchivo); var resultado = conexion.EnviarDocumento(tramaZip, $"{nombreArchivo}.zip"); if (resultado.Item2) { var returnByte = Convert.FromBase64String(resultado.Item1); var rutaArchivo = $"{Directory.GetCurrentDirectory()}R.{nombreArchivo}.zip"; var fs = new FileStream(rutaArchivo, FileMode.Create); fs.Write(returnByte, 0, returnByte.Length); fs.Close(); txtResult.Text = "Proceso enviado a SUNAT correctamente!"; Process.Start(rutaArchivo); } else { txtResult.Text = resultado.Item1; } } } catch (System.ServiceModel.FaultException exSer) { txtResult.Text = exSer.ToString(); } catch (Exception ex) { txtResult.Text = ex.Message; } finally { Cursor = Cursors.Default; } }