Creación de CFDI 3.2

Para quienes programan Visual Basic aqui esta la solucion
[[ FORO CERRADO DEBIDO A QUE YA LA INFORMACION YA NO ES VIGENTE ]]
ranfepv
Mensajes: 11
Registrado: Mié Jul 10, 2013 8:20 pm

Re: Creación de CFDI 3.2

Mensajepor ranfepv » Mié Jul 10, 2013 8:32 pm

Primero que nada una disculpa por reabrir el tema pero me urge una ayuda, gracias a este foro encontre lo que necesitaba
el detalle es que todo esta en VB y me tome la libertad de convertirlo a C#. El detalle es que tengo dos grandes problemas los cuales coloque en el codigo de abajo.
No se que debo de cambiar, ayuda!!!!

Código: Seleccionar todo


        private string ObtenerSelloDigital(string cadenaOriginal, string rutaLlavePrivada, string password)
        {
            SecureString passwordSeguro = new SecureString();
            passwordSeguro.Clear();
            foreach (char c in password.ToCharArray())
            {
                passwordSeguro.AppendChar(c);
            }

           
            Byte[] llavePrivadaBytes = File.ReadAllBytes(rutaLlavePrivada);

            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
           
            rsa = opensslkey.DecodeEncryptedPrivateKeyInfo(llavePrivadaBytes,passwordSeguro);//No acepta el passwordSeguro solo el primer parametro

            SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();
           
           Byte[] bytesFirmados = rsa.SignData(Encoding.UTF8.GetBytes(cadenaOriginal), hasher);//Genera Excepcion
            string selloDigital = Convert.ToBase64String(bytesFirmados);
            return selloDigital;
        }

ranfepv
Mensajes: 11
Registrado: Mié Jul 10, 2013 8:20 pm

Re: Creación de CFDI 3.2

Mensajepor ranfepv » Jue Jul 11, 2013 8:31 pm

AlgusDark escribió:Buenos días,
he estado trabajando con ésto de la facturación electrónica. Vengo a compartir los códigos que he visto en el foro y de otro foro, para llegar a obtener nuestro XML CFDI V3.2

En mi XML sólo me falta saber cómo llenar el campo:

SELLO (Al final digo cómo sacarlo, si mis calculos son correctos es el SHA-1 Pasado a Base64 de la cadena original. Sólo me falta la forma de actualizar el campo que cree en XML sin tener que crear otro)

Ya lo único que me falta son esos dos campos para poder mandarlo al validador de SAT
https://www.consulta.sat.gob.mx/sicofi_ ... 0cfdi.html

Si tienen dudas con el código o cómo implementar opensslkey.cs, pregúntenme y con gusto les contesto. De igual manera si les urge mucho, simplemente deben de guardar el opensslkey como DLL para ser referenciado en VB.

El siguiente método es un método que saqué de éste foro:

Código: Seleccionar todo

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim CERT_SIS As String = "C:\Certificado.cer"
        Dim CerNo As String
        Dim CerSAT As System.Security.Cryptography.X509Certificates.X509Certificate
        CerSAT = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile(CERT_SIS)
        CerNo = StrReverse(System.Text.Encoding.ASCII.GetString(CerSAT.GetSerialNumber))

        Using ArchivoXML As XmlWriter = XmlWriter.Create("CFDIdePrueba.XML")
            Dim Prefijo As String = "cfdi", EspacioDeNombre As String = "http://www.sat.gob.mx/cfd/3"

            With ArchivoXML
                .WriteStartElement(prefix:=Prefijo, localName:="Comprobante", ns:=EspacioDeNombre)

                .WriteAttributeString(prefix:="xsi", localName:="schemaLocation", ns:="http://www.w3.org/2001/XMLSchema-instance", value:="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd")
                .WriteAttributeString("version", "3.2")
                '.WriteAttributeString("folio", "000001")
                .WriteAttributeString("fecha", DateAndTime.Now.ToString("s"))
                .WriteAttributeString("sello", "Sello Digital Aquí")
                .WriteAttributeString("formaDePago", "PAGO EN UNA SOLA EXHIBICION")
                .WriteAttributeString("noCertificado", CerNo)
                .WriteAttributeString("certificado", Convert.ToBase64String(CerSAT.GetRawCertData)) 'Ver Tema "Extracción del Número de Certificado del SAT en Visual Basic".
                .WriteAttributeString("condicionesDePago", "CONTADO/CRÉDITO")
                .WriteAttributeString("subTotal", "488.50")
                '.WriteAttributeString("descuento", "0.00")
                .WriteAttributeString("total", "488.50")
                .WriteAttributeString("tipoDeComprobante", "ingreso")
                .WriteAttributeString("metodoDePago", "Efectivo")
                .WriteAttributeString("LugarExpedicion", "Lázaro Cárdenas, Michoacán")


                'Emisor -----------------------------------
                '.WriteStartElement("Emisor")
                .WriteStartElement(prefix:=Prefijo, localName:="Emisor", ns:=EspacioDeNombre)
                .WriteAttributeString("rfc", "XAXX010101")
                .WriteAttributeString("nombre", "COMPAÑIA DE PRUEBA")

                'DomicilioFiscal ---
                '.WriteStartElement("DomicilioFiscal")
                .WriteStartElement(prefix:=Prefijo, localName:="DomicilioFiscal", ns:=EspacioDeNombre)
                .WriteAttributeString("calle", "Domicilio Prueba")
                '.WriteAttributeString("colonia", "Domicilio Prueba")
                .WriteAttributeString("municipio", "Domicilio Prueba")
                .WriteAttributeString("estado", "Domicilio Prueba")
                .WriteAttributeString("pais", "MEXICO")
                .WriteAttributeString("codigoPostal", "99000")
                .WriteEndElement()

                'RegimenFiscal -----------------------------------
                '.WriteStartElement("RegimenFiscal")
                .WriteStartElement(prefix:=Prefijo, localName:="RegimenFiscal", ns:=EspacioDeNombre)
                .WriteAttributeString("Regimen", "simplificado")
                .WriteEndElement()

                '---
                .WriteEndElement()
                '------------------------------------------ Emisor

                'Receptor ---------------------------------
                '.WriteStartElement("Receptor")
                .WriteStartElement(prefix:=Prefijo, localName:="Receptor", ns:=EspacioDeNombre)
                .WriteAttributeString("rfc", "XAXX010101")
                .WriteAttributeString("nombre", "COMPAÑIA DE PRUEBA")

                'Domicilio ---
                '.WriteStartElement("Domicilio")
                .WriteStartElement(prefix:=Prefijo, localName:="DomicilioFiscal", ns:=EspacioDeNombre)
                .WriteAttributeString("calle", "Domicilio Prueba")
                .WriteAttributeString("colonia", "Domicilio Prueba")
                .WriteAttributeString("municipio", "Domicilio Prueba")
                .WriteAttributeString("estado", "Domicilio Prueba")
                .WriteAttributeString("pais", "MEXICO")
                .WriteAttributeString("codigoPostal", "99000")
                .WriteEndElement()
                '---
                .WriteEndElement()
                '------------------------------------------ Receptor

                'Partidas ---------------------------------
                '.WriteStartElement("Conceptos")
                .WriteStartElement(prefix:=Prefijo, localName:="Conceptos", ns:=EspacioDeNombre)

                'Partida 1 ---
                '.WriteStartElement("Concepto")
                .WriteStartElement(prefix:=Prefijo, localName:="Concepto", ns:=EspacioDeNombre)
                .WriteAttributeString("cantidad", "1")
                .WriteAttributeString("unidad", "PIEZA")
                '.WriteAttributeString("noIdentificacion", "Código 123")
                .WriteAttributeString("descripcion", "ARTÍCULO DE PRUEBA 1")
                .WriteAttributeString("valorUnitario", "123.45")
                .WriteAttributeString("importe", "123.45")
                'Aquí va la información de aduanas.
                .WriteEndElement()
                '---

                'Partida 2 ---
                '.WriteStartElement("Concepto")
                .WriteStartElement(prefix:=Prefijo, localName:="Concepto", ns:=EspacioDeNombre)
                .WriteAttributeString("cantidad", "1")
                .WriteAttributeString("unidad", "PIEZA")
                .WriteAttributeString("noIdentificacion", "Código 987")
                .WriteAttributeString("descripcion", "ARTÍCULO DE PRUEBA 2")
                .WriteAttributeString("valorUnitario", "99.55")
                .WriteAttributeString("importe", "99.55")
                'Aquí va la información de aduanas.
                .WriteEndElement()
                '---
                .WriteEndElement()
                '------------------------------------------ Partidas

                'Impuestos --------------------------------
                '.WriteStartElement("Impuestos")
                .WriteStartElement(prefix:=Prefijo, localName:="Impuestos", ns:=EspacioDeNombre)
                '.WriteAttributeString("totalImpuestosRetenidos", "9.55")

                'Retenciones ---
                '.WriteStartElement("Retenciones")
                .WriteStartElement(prefix:=Prefijo, localName:="Retenciones", ns:=EspacioDeNombre)

                'Retencion -
                '.WriteStartElement("Retencion")
                .WriteStartElement(prefix:=Prefijo, localName:="Retencion", ns:=EspacioDeNombre)
                .WriteAttributeString("impuesto", "IVA")
                .WriteAttributeString("importe", "9.55")
                .WriteEndElement()
                '- Retencion

                .WriteEndElement()
                '--- Retenciones

                'Traslados ---
                '.WriteStartElement("Traslados")
                .WriteStartElement(prefix:=Prefijo, localName:="Traslados", ns:=EspacioDeNombre)

                'Traslado -
                '.WriteStartElement("Traslado")
                .WriteStartElement(prefix:=Prefijo, localName:="Traslado", ns:=EspacioDeNombre)
                .WriteAttributeString("impuesto", "IVA")
                .WriteAttributeString("tasa", "16.00")
                .WriteAttributeString("importe", "9.55")
                .WriteEndElement()
                '- Traslado

                .WriteEndElement()
                '--- Traslados

                .WriteEndElement()
                '------------------------------------------ Impuestos
                .WriteEndDocument()

                .Flush() 'Graba datos.
                .Close()
            End With
        End Using
    End Sub


El siguiente es una función para obtener la cadena Original del XML (también de éste foro):

Código: Seleccionar todo

Public Shared Function GetCadenaOriginal(ByVal xmlDoc As String, ByVal fileXSLT As String) As String
        Dim strCadenaOriginal As String
        Dim newFile = Path.GetTempFileName()

        Dim Xsl = New Xml.Xsl.XslCompiledTransform()
        Xsl.Load(fileXSLT)
        Xsl.Transform(xmlDoc, newFile)
        Xsl = Nothing

        Dim sr = New IO.StreamReader(newFile)
        strCadenaOriginal = sr.ReadToEnd
        sr.Close()

        'Eliminamos el archivo Temporal
        System.IO.File.Delete(newFile)

        fileXSLT = Nothing
        newFile = Nothing
        Xsl = Nothing
        sr.Dispose()

        Return strCadenaOriginal
    End Function


El siguiente es una función para Obtener el Sello Digital con OpenSSLKey.cs :

Código: Seleccionar todo

Public Shared Function ObtenerSelloDigital(cadenaOriginal As String, rutaLlavePrivada As String, password As String) As String
        Dim passwordSeguro As New SecureString()
        passwordSeguro.Clear()
        For Each c As Char In password.ToCharArray()
            passwordSeguro.AppendChar(c)
        Next
        Dim llavePrivadaBytes As Byte() = System.IO.File.ReadAllBytes(rutaLlavePrivada)
        Dim rsa As RSACryptoServiceProvider = opensslkey.DecodeEncryptedPrivateKeyInfo(llavePrivadaBytes, passwordSeguro)
        Dim hasher As New SHA1CryptoServiceProvider()
        Dim bytesFirmados As Byte() = rsa.SignData(System.Text.Encoding.UTF8.GetBytes(cadenaOriginal), hasher)
        Dim selloDigital As String = Convert.ToBase64String(bytesFirmados)
        Return selloDigital

    End Function


La cadena Original es:
||3.2|2012-09-14T00:45:44|ingreso|PAGO EN UNA SOLA EXHIBICION|CONTADO/CRÉDITO|488.50|488.50|Efectivo|Lázaro Cárdenas, Michoacán|XAXX010101|COMPAÑIA DE PRUEBA|Domicilio Prueba|Domicilio Prueba|Domicilio Prueba|MEXICO|99000|simplificado|XAXX010101|COMPAÑIA DE PRUEBA|1|PIEZA|ARTÍCULO DE PRUEBA 1|123.45|123.45|1|PIEZA|Código 987|ARTÍCULO DE PRUEBA 2|99.55|99.55|IVA|9.55|IVA|16.00|9.55||


Y el selloDigital (SHA-1) es:
SIZiKCIS2MSkB20b1mwqCj02lUZr8iB1Sgqb0D9l30l2FwASwdxR44BCH/nE1BS74pD1dVA5BGpRiXUAwSwtFCUEq6Cu4xdKgJPAxxCXvav5tNl2Sn6XBVnXqMgOyZuCLZQj+BPYLYMMb7stce2+PaHkNHkhqaFHBRYDwuJvV8s=



Amigo necesito ayuda con esta parte, el validador del SAT me marca error en el Sello, justamente en el siguiente codigo me manda error debido a los parametros

Código: Seleccionar todo

 Dim llavePrivadaBytes As Byte() = System.IO.File.ReadAllBytes(rutaLlavePrivada)
        Dim rsa As RSACryptoServiceProvider = opensslkey.DecodeEncryptedPrivateKeyInfo(llavePrivadaBytes, passwordSeguro)
        Dim hasher As New SHA1CryptoServiceProvider()
        Dim bytesFirmados As Byte() = rsa.SignData(System.Text.Encoding.UTF8.GetBytes(cadenaOriginal), hasher)
        Dim selloDigital As String = Convert.ToBase64String(bytesFirmados)


Llave privada es el archivo .key?
y
opensslkey.DecodeEncryptedPrivateKeyInfo($param)

solo acepta un parametro!!!!

jasistemas
Mensajes: 158
Registrado: Mié Ene 11, 2012 3:08 pm
Contactar:

Re: Creación de CFDI 3.2

Mensajepor jasistemas » Lun Jul 22, 2013 6:27 pm

Pues si "rutaLlavePrivada" es algo como "C:\certificados\millaveprivada.key", solo asegurate que sea de CSD.

Las variables cadenaOriginal y "password" del .key pueden bien ser variables globales por lo que no necesariamente pasan por parametros hacia la rutina

julioc_hddz
Mensajes: 1
Registrado: Mar Nov 12, 2013 12:15 pm

Re: Creación de CFDI 3.2

Mensajepor julioc_hddz » Mar Nov 12, 2013 12:43 pm

omh escribió:Hola a todos compañeros

nada mas para comentar 2 cosas acerca de esta libreria, a ver si me pueden ayudar.

1.- en la linea 294 hay un comentario en el metodo DecodeEncryptedPrivateKeyInfo que dice asi "// probably a bad pswd entered" :shock: el cual no indica que hay algo raro o que no se implemento correctamente, me ha pasado alrededor de 5 veces aprox que la momento de ejecutar dicho metodo llega hasta esa linea y regresa nada, tal como si se hubieran equivocado en introducir la clave pero no es asi por que ya he corroborado en el validacfd de Dado y el .key y el password estan correctos, alguien a tenido este problema? lo pudo solucionar?

2.-usando esta misma librearia tiene un comportamiento raro en ambiente web (asp.net) me ha pasado que DecodeEncryptedPrivateKey regresa nada pero moviendo ala configuracion de iis se corrije. tambien me ha pasado que que con ciertos .keys tambien regresa nada pero solo pasa en el ambiente web por que en desktop no tengo ese problema con dicho .key.

si alguien ha tenido estos detalles por favor comente.

Saludos.


Saludos.


Amigo,

tengo la misma problemática que reportas. En este caso, estoy en una aplicación para windows y sólo con un certificado me indica que el password es incorrecto. Sin embargo al validarlo por OPENSSL me indica correcto. Pudiste solucionarlo??

Gracias.

alopezr40
Mensajes: 4
Registrado: Vie May 16, 2014 4:27 pm

Re: Creación de CFDI 3.2

Mensajepor alopezr40 » Sab May 17, 2014 12:44 pm

Tengo el mismo Problema que reportan, trabajo con Windows .NET C# Desktop, con ciertos .Keys me regresa null, con muchos otros todo bien, en la funcion: DecodeEncryptedPrivateKeyInfo en la variable seqdes al compararla con OIDdesEDE3CBC no son iguales y manda null, no he podido descifrar que pasa, ayuda por favor!!!, o coticenme no hay problema, ando desesperado!!

Saludos

isacko
Mensajes: 2
Registrado: Vie Ene 16, 2015 3:36 pm

Re: Creación de CFDI 3.2

Mensajepor isacko » Lun Ene 19, 2015 9:24 am

omh escribió:Hola a todos compañeros

nada mas para comentar 2 cosas acerca de esta libreria, a ver si me pueden ayudar.

1.- en la linea 294 hay un comentario en el metodo DecodeEncryptedPrivateKeyInfo que dice asi "// probably a bad pswd entered" :shock: el cual no indica que hay algo raro o que no se implemento correctamente, me ha pasado alrededor de 5 veces aprox que la momento de ejecutar dicho metodo llega hasta esa linea y regresa nada, tal como si se hubieran equivocado en introducir la clave pero no es asi por que ya he corroborado en el validacfd de Dado y el .key y el password estan correctos, alguien a tenido este problema? lo pudo solucionar?

2.-usando esta misma librearia tiene un comportamiento raro en ambiente web (asp.net) me ha pasado que DecodeEncryptedPrivateKey regresa nada pero moviendo ala configuracion de iis se corrije. tambien me ha pasado que que con ciertos .keys tambien regresa nada pero solo pasa en el ambiente web por que en desktop no tengo ese problema con dicho .key.

si alguien ha tenido estos detalles por favor comente.

Saludos.


Saludos.



Buen día,

Llevo un año trabajando con esta libreria y la semana pasada me paso lo que comentas en el punto 2 valido el .cer, el .key y la contraseña en el validacfd y marca correcto pero al hacerlo en esa funcion me devuelve datos incorrectos, alguna idea?

Gracias

isacko
Mensajes: 2
Registrado: Vie Ene 16, 2015 3:36 pm

Re: Creación de CFDI 3.2

Mensajepor isacko » Lun Ene 19, 2015 9:54 am

alopezr40 escribió:Tengo el mismo Problema que reportan, trabajo con Windows .NET C# Desktop, con ciertos .Keys me regresa null, con muchos otros todo bien, en la funcion: DecodeEncryptedPrivateKeyInfo en la variable seqdes al compararla con OIDdesEDE3CBC no son iguales y manda null, no he podido descifrar que pasa, ayuda por favor!!!, o coticenme no hay problema, ando desesperado!!

Saludos



Buen dia, encontraste solucion a tu caso ?

Saludos!

rnegrete2114
Mensajes: 2
Registrado: Lun Nov 09, 2015 1:51 pm

Re: Creación de CFDI 3.2

Mensajepor rnegrete2114 » Lun Nov 09, 2015 2:08 pm

Un favor estaba viendo tu post de la implementaciòn de openSSl en vb Net y no logro hacerlo, todo lo demás me funciona sin problema, podrías apoyarme con la implementación de openssl.

Gracias


Volver a “Visual Basic”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados