//----------------------------------
        public ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital GeneraTimbreFiscalDigitalRetencionesCadenas(string strRfc, string noCertificado, string selloCfd, XElement entrada, Guid uuid)
        {
            ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital result;
            try
            {
                ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital timbreFiscalDigital = new ServicioLocal.Business.TimbreRetenciones.TimbreFiscalDigital
                {
                    FechaTimbrado    = Convert.ToDateTime(DateTime.Now.ToString("s")),
                    noCertificadoSAT = noCertificado,
                    selloCFD         = selloCfd,
                    selloSAT         = "@",
                    UUID             = uuid.ToString().ToUpper(),
                    version          = "1.0"
                };
                string timbreXml = this._serializadorTimbres.GetTimbreRenecionesXml(timbreFiscalDigital);
                lock (GeneradorTimbreFiscalDigital.GeneradorCadenas)
                {
                    //timbreFiscalDigital.cadenaOriginal = GeneradorTimbreFiscalDigital.GeneradorCadenas.CadenaOriginal(timbreXml);
                    timbreFiscalDigital.cadenaOriginal = GeneradorTimbreFiscalDigital.GeneradorCadenasRetencion.CadenaOriginal(timbreXml);
                }
                lock (this._sellador)
                {
                    if (ConfigurationManager.AppSettings["FirmaLocal"] == "true")
                    {
                        string certPac = ConfigurationManager.AppSettings["CertPac"];
                        if (this.objCert == null)
                        {
                            this.objCert = OpensslKey.DecodePrivateKey(File.ReadAllBytes(certPac), ConfigurationManager.AppSettings["PassPac"], ".key");
                        }
                        timbreFiscalDigital.selloSAT = this._sellador.GeneraSelloDigitalRetencion(timbreFiscalDigital.cadenaOriginal, this.objCert);
                    }
                    else
                    {
                        timbreFiscalDigital.selloSAT = this._sellador.GeneraSelloDigitalTimbreRetencion(timbreFiscalDigital.cadenaOriginal);
                    }
                    if (timbreFiscalDigital.selloSAT == null || timbreFiscalDigital.selloSAT == "Error")
                    {
                        result = null;
                        return(result);
                    }
                }
                result = timbreFiscalDigital;
            }
            catch (Exception ee)
            {
                NtLinkBusiness.Logger.Error(ee);
                result = null;
            }
            return(result);
        }
Esempio n. 2
0
        public int CancelarRet(string uuid, string rfc, ref string respuesta, ref string acuse)
        {
            int result;

            try
            {
                Cancelador.Logger.Info("Cancelando comprobante: " + uuid);
                CanceladorRetenciones can = new CanceladorRetenciones();
                IList uuidsCancelar       = new List <string>();
                uuidsCancelar.Add(uuid.ToUpper());
                using (new NtLinkLocalServiceEntities())
                {
                    NtLinkEmpresa nle     = new NtLinkEmpresa();
                    empresa       empresa = nle.GetByRfc(rfc);
                    if (empresa == null)
                    {
                        respuesta = "300 - El usuario con el que se quiere conectar es inválido";
                        acuse     = "";
                        result    = 300;
                    }
                    else
                    {
                        NtLinkTimbrado tim    = new NtLinkTimbrado();
                        TimbreWs33     timbre = tim.ObtenerTimbre(uuid);
                        if (timbre == null)
                        {
                            TimbreWsHistorico timbreHist = tim.ObtenerTimbreHist(uuid);
                            if (timbreHist == null)
                            {
                                string path    = Path.Combine(ConfigurationManager.AppSettings["Resources"], rfc);
                                string pathCer = Path.Combine(path, "Certs", "csd.cer");
                                string pathKey = Path.Combine(path, "Certs", "csd.key");
                                string pass    = empresa.PassKey;
                                if (File.Exists(pathKey + ".pem"))
                                {
                                    pathKey += ".pem";
                                }
                                string ext = Path.GetExtension(pathKey);
                                RSACryptoServiceProvider key2 = OpensslKey.DecodePrivateKey(File.ReadAllBytes(pathKey), pass, ext);
                                string ac2 = can.CancelaCfdi(uuid, key2, rfc, pathCer);
                                if (string.IsNullOrEmpty(ac2))
                                {
                                    acuse     = "No se pudo conectar al servicio de cancelación del SAT";
                                    respuesta = "1205 - No se pudo conectar al servicio de cancelación del SAT";
                                    result    = 1205;
                                    return(result);
                                }
                                acuse = ac2;
                                AcuseCancelacion acuseCan2 = AcuseCancelacion.Parse(ac2);
                                if (acuseCan2.Status == null)
                                {
                                    Cancelador.Logger.Error(acuse);
                                    respuesta = "1300 - XML mal formado";
                                    result    = 1300;
                                    return(result);
                                }
                                if (acuseCan2.Status != "1201" && acuseCan2.Status != "1202")
                                {
                                    Cancelador.Logger.Error(acuse);
                                    respuesta = acuseCan2.Status;
                                    throw new FaultException(respuesta);
                                }
                                Cancelador.Logger.Info(acuse);
                                string directorio = Path.Combine(ConfigurationManager.AppSettings["RutaTimbrado"], rfc, acuseCan2.FechaCancelacion);
                                if (!Directory.Exists(directorio))
                                {
                                    Directory.CreateDirectory(directorio);
                                }
                                string fileName = Path.Combine(directorio, "Cancelacion_" + uuid.ToString() + ".xml");
                                File.WriteAllText(fileName, acuse, Encoding.UTF8);
                                respuesta = acuseCan2.Status + " - " + Constantes.ErroresValidacion[int.Parse(acuseCan2.Status)];
                                result    = Convert.ToInt32(acuseCan2.Status);
                                return(result);
                            }
                            else
                            {
                                timbre                  = new TimbreWs33();
                                timbre.RfcEmisor        = timbreHist.RfcEmisor;
                                timbre.RfcReceptor      = timbreHist.RfcReceptor;
                                timbre.AcuseCancelacion = timbreHist.AcuseCancelacion;
                                timbre.IdTimbre         = timbreHist.IdTimbre;
                                timbre.Uuid             = timbreHist.Uuid;
                                timbre.StrError         = "Hist";
                            }
                        }
                        if (timbre.RfcEmisor != rfc)
                        {
                            respuesta = "203 - UUID No corresponde el RFC del emisor y de quien solicita la cancelación.";
                            acuse     = "";
                            result    = 203;
                        }
                        else if (timbre.AcuseCancelacion != null)
                        {
                            respuesta = "202 - UUID Previamente cancelado";
                            acuse     = timbre.AcuseCancelacion;
                            result    = 202;
                        }
                        else
                        {
                            string path    = Path.Combine(ConfigurationManager.AppSettings["Resources"], rfc);
                            string pathCer = Path.Combine(path, "Certs", "csd.cer");
                            string pathKey = Path.Combine(path, "Certs", "csd.key");
                            string pass    = empresa.PassKey;
                            if (File.Exists(pathKey + ".pem"))
                            {
                                pathKey += ".pem";
                            }
                            string ext = Path.GetExtension(pathKey);
                            RSACryptoServiceProvider key3 = OpensslKey.DecodePrivateKey(File.ReadAllBytes(pathKey), pass, ext);
                            string ac3 = can.CancelaCfdi(uuid, key3, rfc, pathCer);
                            if (string.IsNullOrEmpty(ac3))
                            {
                                acuse     = "No se pudo conectar al servicio de cancelación del SAT";
                                respuesta = "1205 - No se pudo conectar al servicio de cancelación del SAT";
                                result    = 1205;
                            }
                            else
                            {
                                acuse = ac3;
                                AcuseCancelacion acuseCan3 = AcuseCancelacion.Parse(ac3);
                                if (acuseCan3.Status == null)
                                {
                                    Cancelador.Logger.Error(acuse);
                                    respuesta = "1300 - XML mal formado";
                                    result    = 1300;
                                }
                                else
                                {
                                    if (acuseCan3.Status != "1201" && acuseCan3.Status != "1202")
                                    {
                                        Cancelador.Logger.Error(acuse);
                                        respuesta = acuseCan3.Status;
                                        throw new FaultException(respuesta);
                                    }
                                    Cancelador.Logger.Info(acuse);
                                    timbre.Status = new int?(2);
                                    string directorio = Path.Combine(ConfigurationManager.AppSettings["RutaTimbrado"], timbre.RfcEmisor, timbre.FechaFactura.ToString("yyyyMMdd"));
                                    if (!Directory.Exists(directorio))
                                    {
                                        Directory.CreateDirectory(directorio);
                                    }
                                    string fileName = Path.Combine(directorio, "Cancelacion_" + timbre.Uuid.ToString() + ".xml");
                                    File.WriteAllText(fileName, acuse, Encoding.UTF8);
                                    tim.GuardarTimbre(timbre);
                                    respuesta = acuseCan3.Status + " - " + Constantes.ErroresValidacion[int.Parse(acuseCan3.Status)];
                                    result    = Convert.ToInt32(acuseCan3.Status);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Cancelador.Logger.Error("(cancelar) Error: " + ex.Message + ((ex.InnerException == null) ? "" : ("\nExcepción Interna:" + ex.InnerException.Message)));
                throw;
            }
            return(result);
        }
        public string CancelarBloqueCfdi(string directorioLog, string directorioAcuse, Encabezado encLMetadata, string strPPrivada, string pass, string strCertificado, ref SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.Acuse cAcuse)
        {
            string result;

            try
            {
                AccesoServicios.Logger.Info("Privada: " + strPPrivada);
                AccesoServicios.Logger.Info("Certificado: " + strCertificado);
                AccesoServicios.Logger.Info("rfc:" + encLMetadata.RfcEmisor);
                AccesoServicios.Logger.Info("fecha:" + encLMetadata.Fecha);
                AccesoServicios.Logger.Info("uuid:" + encLMetadata.LisMListaFolios[0].ToString());
                string strPXmlFirmado = "";
                if (File.Exists(strPPrivada + ".pem"))
                {
                    strPPrivada += ".pem";
                }
                string ext = Path.GetExtension(strPPrivada);
                AccesoServicios.SignXmlFile(this.ArmarXmlPreFirma(encLMetadata), ref strPXmlFirmado, OpensslKey.DecodePrivateKey(File.ReadAllBytes(strPPrivada), pass, ext));
                AccesoServicios.Logger.Info(strPXmlFirmado);
                SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.SignatureType a         = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.SignatureType();
                SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.ReferenceType reference = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.ReferenceType
                {
                    URI = ""
                };
                XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                a.SignedInfo = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.SignedInfoType
                {
                    Reference = reference
                };
                string hex = strPXmlFirmado.Substring(strPXmlFirmado.IndexOf("<DigestValue>") + 13, strPXmlFirmado.IndexOf("</DigestValue>") - strPXmlFirmado.IndexOf("<DigestValue>") - 13);
                a.SignedInfo.Reference.DigestValue  = Convert.FromBase64String(hex);
                a.SignedInfo.Reference.DigestMethod = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.DigestMethodType
                {
                    Algorithm = "http://www.w3.org/2000/09/xmldsig#sha1"
                };
                a.SignedInfo.Reference.Transforms = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.TransformType[]
                {
                    new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.TransformType()
                };
                a.SignedInfo.Reference.Transforms[0].Algorithm = "http://www.w3.org/2000/09/xmldsig#enveloped-signature";
                a.SignedInfo.CanonicalizationMethod            = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.CanonicalizationMethodType
                {
                    Algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
                };
                a.SignedInfo.SignatureMethod = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.SignatureMethodType
                {
                    Algorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
                };
                a.SignatureValue = Convert.FromBase64String(strPXmlFirmado.Substring(strPXmlFirmado.IndexOf("<SignatureValue>") + 16, strPXmlFirmado.IndexOf("</SignatureValue>") - strPXmlFirmado.IndexOf("<SignatureValue>") - 16));
                X509Certificate2 x509 = new X509Certificate2(strCertificado);
                a.KeyInfo          = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.KeyInfoType();
                a.KeyInfo.X509Data = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.X509DataType();
                a.KeyInfo.X509Data.X509IssuerSerial = new SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.X509IssuerSerialType();
                a.KeyInfo.X509Data.X509IssuerSerial.X509IssuerName   = x509.IssuerName.Name.ToString();
                a.KeyInfo.X509Data.X509IssuerSerial.X509SerialNumber = x509.SerialNumber;
                a.KeyInfo.X509Data.X509Certificate = File.ReadAllBytes(strCertificado);
                Console.WriteLine("Enviando Cancelación...");
                string      a2 = a.ToString();
                Cancelacion mensajeCancelacion = new Cancelacion
                {
                    RfcEmisor = encLMetadata.RfcEmisor,
                    Fecha     = Convert.ToDateTime(encLMetadata.Fecha),
                    Signature = a
                };
                mensajeCancelacion.Folios = new CancelacionFolios[encLMetadata.LisMListaFolios.Count];
                for (int i = 0; i < encLMetadata.LisMListaFolios.Count; i++)
                {
                    mensajeCancelacion.Folios[i] = new CancelacionFolios
                    {
                        UUID = encLMetadata.LisMListaFolios[i].ToString()
                    };
                }
                if (mensajeCancelacion.Folios.Count <CancelacionFolios>() > 0)
                {
                    Console.WriteLine("Autenticando...");
                    HttpRequestMessageProperty tokenAutenticacion = this.AutenticaServicio();
                    using (new OperationContextScope(this.ClienteCancelacion.InnerChannel))
                    {
                        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = tokenAutenticacion;
                        Console.WriteLine("Cancelando...");
                        SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.Acuse acuseCancelacion = this.ClienteCancelacion.CancelaCFD(mensajeCancelacion);
                        MemoryStream  acuseStream   = new MemoryStream();
                        XmlSerializer xmlSerializer = new XmlSerializer(typeof(SAT.CFDI.Cliente.Procesamiento.ServicioCancelacionCFDI.Acuse));
                        xmlSerializer.Serialize(acuseStream, acuseCancelacion);
                        acuseStream.Seek(0L, SeekOrigin.Begin);
                        StreamReader acuseReader = new StreamReader(acuseStream);
                        AccesoServicios.Log.Info("Terminando el proceso...");
                        cAcuse = acuseCancelacion;
                        result = acuseReader.ReadToEnd();
                        return(result);
                    }
                }
                result = string.Empty;
                return(result);
            }
            catch (Exception exception)
            {
                AccesoServicios.Log.Error("(CancelarBloqueCfdi) Error al cancelar los CFDI's " + exception.ToString());
            }
            result = "";
            return(result);
        }
        //---------------------------------

        public TimbreFiscalDigital GeneraTimbreFiscalDigitalCadenas(string strRfc, string noCertificado, string selloCfd, XElement entrada, Guid uuid, string RfcProvCertif, string Leyenda)
        {
            try
            {
                var timbreFiscalDigital = new TimbreFiscalDigital();

                if (!string.IsNullOrEmpty(Leyenda))
                {
                    timbreFiscalDigital = new TimbreFiscalDigital
                    {
                        FechaTimbrado    = Convert.ToDateTime(DateTime.Now.ToString("s")),
                        NoCertificadoSAT = noCertificado,
                        SelloCFD         = selloCfd,
                        SelloSAT         = "@",
                        UUID             = uuid.ToString().ToUpper(),
                        Version          = "1.1",
                        RfcProvCertif    = RfcProvCertif,
                        Leyenda          = Leyenda
                    };
                }
                else
                {
                    timbreFiscalDigital = new TimbreFiscalDigital
                    {
                        FechaTimbrado    = Convert.ToDateTime(DateTime.Now.ToString("s")),
                        NoCertificadoSAT = noCertificado,
                        SelloCFD         = selloCfd,
                        SelloSAT         = "@",
                        UUID             = uuid.ToString().ToUpper(),
                        Version          = "1.1",
                        RfcProvCertif    = RfcProvCertif
                    };
                }
                string timbreXml = _serializadorTimbres.GetTimbreXml(timbreFiscalDigital);
                lock (GeneradorCadenas)
                {
                    timbreFiscalDigital.cadenaOriginal = GeneradorCadenas.CadenaOriginal(timbreXml);
                }


                lock (_sellador)
                {
                    if (ConfigurationManager.AppSettings["FirmaLocal"] == "true")
                    {
                        string certPac = ConfigurationManager.AppSettings["CertPac"];
                        if (objCert == null)
                        {
                            objCert = OpensslKey.DecodePrivateKey(File.ReadAllBytes(certPac), ConfigurationManager.AppSettings["PassPac"], ".key");
                        }
                        timbreFiscalDigital.SelloSAT = this._sellador.GeneraSelloDigital(timbreFiscalDigital.cadenaOriginal, objCert);
                        //timbreFiscalDigital.selloSAT = "Inválido, ambiente de pruebas";
                    }
                    else
                    {
                        timbreFiscalDigital.SelloSAT = this._sellador.GeneraSelloDigitalTimbre(timbreFiscalDigital.cadenaOriginal);
                    }
                    if (timbreFiscalDigital.SelloSAT == null || timbreFiscalDigital.SelloSAT == "Error")
                    {
                        return(null);
                    }
                }
                return(timbreFiscalDigital);
            }
            catch (Exception ee)
            {
                Logger.Error(ee);
                return(null);
            }
        }
 public SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.SignatureType Asignature(string strPPrivada, Encabezado encLMetadata, string pass, string strCertificado)
 {
     SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.SignatureType result;
     try
     {
         string strPXmlFirmado = "";
         SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.SignatureType Asig = new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.SignatureType();
         Asig.Id            = "Signature";
         Asig.SignedInfo    = new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.SignedInfoType();
         Asig.SignedInfo.Id = "Signature-SignedInfo";
         Asig.SignedInfo.CanonicalizationMethod           = new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.CanonicalizationMethodType();
         Asig.SignedInfo.CanonicalizationMethod.Algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n20010315";
         Asig.SignedInfo.SignatureMethod           = new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.SignatureMethodType();
         Asig.SignedInfo.SignatureMethod.Algorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1";
         Asig.SignedInfo.Reference     = new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.ReferenceType();
         Asig.SignedInfo.Reference.URI = "#Certificate1";
         List <SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.TransformType> T = new List <SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.TransformType>();
         T.Add(new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.TransformType
         {
             Algorithm = "http://www.w3.org/2000/09/xmldsig#envelopedsignature"
         });
         Asig.SignedInfo.Reference.Transforms             = T.ToArray();
         Asig.SignedInfo.Reference.DigestMethod           = new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.DigestMethodType();
         Asig.SignedInfo.Reference.DigestMethod.Algorithm = "http://www.w3.org/2000/09/xmldsig#sha1";
         if (File.Exists(strPPrivada + ".pem"))
         {
             strPPrivada += ".pem";
         }
         string ext = Path.GetExtension(strPPrivada);
         AccesoServicios.SignXmlFile(this.ArmarXmlPreFirma(encLMetadata), ref strPXmlFirmado, OpensslKey.DecodePrivateKey(File.ReadAllBytes(strPPrivada), pass, ext));
         string hex = strPXmlFirmado.Substring(strPXmlFirmado.IndexOf("<DigestValue>") + 13, strPXmlFirmado.IndexOf("</DigestValue>") - strPXmlFirmado.IndexOf("<DigestValue>") - 13);
         Asig.SignedInfo.Reference.DigestValue = Convert.FromBase64String(hex);
         Asig.SignatureValue = Convert.FromBase64String(strPXmlFirmado.Substring(strPXmlFirmado.IndexOf("<SignatureValue>") + 16, strPXmlFirmado.IndexOf("</SignatureValue>") - strPXmlFirmado.IndexOf("<SignatureValue>") - 16));
         X509Certificate2 x509 = new X509Certificate2(strCertificado);
         Asig.KeyInfo          = new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.KeyInfoType();
         Asig.KeyInfo.X509Data = new SAT.CFDI.Cliente.Procesamiento.ServicioRelacionados.X509DataType();
         Asig.KeyInfo.X509Data.X509Certificate = File.ReadAllBytes(strCertificado);
         Asig.KeyInfo.Id = "Certificate1";
         result          = Asig;
     }
     catch (Exception exception)
     {
         AccesoServicios.Log.Error("(Asignature) Error al generar la firma de los CFDI's " + exception.ToString());
         result = null;
     }
     return(result);
 }