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 ]]
AlgusDark
Mensajes: 6
Registrado: Mar Sep 11, 2012 7:56 pm

Creación de CFDI 3.2

Mensajepor AlgusDark » Vie Sep 14, 2012 1:18 am

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=

AlgusDark
Mensajes: 6
Registrado: Mar Sep 11, 2012 7:56 pm

Re: Creación de CFDI 3.2

Mensajepor AlgusDark » Sab Sep 15, 2012 1:49 pm

Una vez que edito el sello a mi XML, me sale lo siguiente con el validador:

Código: Seleccionar todo

Certificado usado   : Aquí el número del Certificado
Certificado reportado   : Aquí el número del Certificado

El sello del CFDI es válido

Cadena original del Complemento de Certificación:
|||

Digestión SHA-1 de cadena original del complemento de certificación expresada en hexadecimal
98c4b7d37a4c63c3f69f7a0f794fb8a9187549ef

Certificado usado   : Aquí el número del Certificado
Certificado reportado   : null

El sello no pudo ser verificado


IMPORTANTE: Los resultados anteriores se presentan a efecto de que valide
la estructura, cadena original y sello de su CFDI. Para que una factura
electrónica sea válida para efectos fiscales, deberá reunir los requisitos que
establecen las disposiciones fiscales vigentes.


Me pregunto... ¿porqué una vez me dice que el sello está correcto y en otro que no ha sido verificado?

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Creación de CFDI 3.2

Mensajepor Dado » Sab Sep 15, 2012 3:03 pm

Porque son DOS SELLOS, el primero lo creas tu y al parecer ya esta bien. felicidades

El segundo sello es el famoso "TIMBRADO" y ese lo genera el PAC, de ese practicamente no tienes que preocuparte ya que te lo proporcionan cuando envias tu CFDI al PAC

En otro asunto un comentario de cuates, veo que borraste el numero de certificado, supongo que por la desconfianza a la que ya estamos acostumbrados en Mexico pero te comento que los certificados SON PUBLICOS y hay una lista en donde hay una relacion certificado-vigencia-RFC y esta lista se puede descargar libremente del SAT.

Eso significa que no debes preocuparte por ocultar tu certificado, no hay nada malo que puedan hacer conociendo ese dato y si de todos modos quieren saberlo es facil obtenerlo.

Por ultimo, te recomiendo mucho mas que uses el validador gratuito de www.validacfd.com es mucho mejor que el del SAT
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

AlgusDark
Mensajes: 6
Registrado: Mar Sep 11, 2012 7:56 pm

Re: Creación de CFDI 3.2

Mensajepor AlgusDark » Sab Sep 15, 2012 5:29 pm

Muchas gracias DADO.

Disculpa, quiero poner mi código completo, ya que pude agregar el SELLO por medio de código en VB.NET
De cualquier forma, lo anexo:

Función para

Código: Seleccionar todo

Public Sub AplicarSelloDigital(selloDigitalOriginal As String)
        ' Open the XML file
        Dim docXML As New XmlDocument
        docXML.Load("CFDIdePrueba.xml")

        ' Create an attribute and add it to the root element
        docXML.DocumentElement.SetAttribute("sello", selloDigitalOriginal )
        docXML.Save("CFDIdePrueba.xml")

    End Sub


Es todo un rollo ésto del CFDI pero entonces ya terminó esa parte. Gracias por el dato del CER. Si, lo borré por si las dudas.

Entonces los siguientes datos:

Código: Seleccionar todo

<tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital"
xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital TimbreFiscalDigital.xsd"
selloCFD="tOSe+Ex/wvn33YlGwtfmrJwQ31Crd7lI9VcH63TGjHfxk5vfb3q9uSbDUGk9TXvo70ydOpikRVw+9B2Six0mbu3PjoPpO909oAYITrRyomdeUGJ4vmA2/12L86EJLWpU7vIt4cL8HpkEw7TOFhSdpzb/890+jP+C1adBsHU1VHc="
FechaTimbrado="2010-03-06T20:40:10"
UUID="ad662d33-6934-459c-a128-bdf0393e0f44"
noCertificadoSAT="30001000000100000801"
version="1.0"
selloSAT="j5bSpqM3w0+shGtImqOwqqy6+d659O78ckfstu5vTSFa+2CVMj6Awfr18x4yMLGBwk6ruYbjBlVURodEIl6nJIhTTUtYQV1cbRDG9kvvhaNAakxqaSOnOx79nHxqFPRVoqh10CsjocS9PZkSM2jz1uwLgaF0knf1g8pjDkLYwlk="/>


¿Me los enviará el PAC una vez que yo les envíe el XML? ¿Esa respuesta XML tendría que anexarla al XML original dentro del ELEMENTO <cfdi:complementos>? La verdad es que esa parte es la que si tengo muchas dudas.

Saludos!!!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Creación de CFDI 3.2

Mensajepor Dado » Sab Sep 15, 2012 8:00 pm

Es correcto, el nodo tfd:TimbreFiscalDigital te lo genera el PAC

Algunos te devuelven *solo* el nodo del timbre y depende de ti pegarlo al XML

Otros PAC devuelven *todo* el XML ya con el timbre insertado

Si necesitas informes del timbrado me avisas
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

AlgusDark
Mensajes: 6
Registrado: Mar Sep 11, 2012 7:56 pm

Re: Creación de CFDI 3.2

Mensajepor AlgusDark » Sab Sep 15, 2012 9:01 pm

Una pregunta:
Si Elijo a ECODEX como PAC. ¿Ellos se encargan de mandarme todo el xml?

Con ValidaCFD me marcó errores en el CER, que no se encontraba en la lista, también en otros dos campos me decía que usaba la FIEL y debía usar el CSD. ¿Eso significa que me han dado mal los archivos .cer y . Key? Debería el emisor tramitar el csd por medio de SOLCEI (Creo así se llama).

Y como último, con ECODEX ¿puedo comparte a ti los timbres? ¿Hay manuales sobre cancelación de CFDI's con ECODEX? Hay forma de hacer el timbrado manual y automático?
Con manual me refiero a entrar a una URL y subir los CFDI's.
Con automático me refiero a que el programa use algun servicio web.

Y para quedar claro, ¿necesito crear el nodo de complementos vacío en el xml?

Muchas gracias por tu tiempo y por resolverme las dudas.

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Creación de CFDI 3.2

Mensajepor Dado » Dom Sep 16, 2012 12:00 pm

Para el timbrado con ECODEX puedo ofrecerte una libreria dll o un sistema que llamo "Servitimbre"

Cualquiera de los dos puedes checarlo y descargar una DEMO de mi pagina www.validacfd.com

De hecho el Servitimbre es muy completo puede crear el XML, sellarlo, timbrarlo y hasta hacer el PDF e imprimirlo, todas las operaciones son opcionales asi que si no necesitas alguna opcion la desactivas

Ahi en la pagina viene el costo del timbrado, es muy economico, va desde $1.00 y depende del volumen de facturas que compres

Tambien con la DLL y el Servitimbre se pueden cancelar facturas

Por lo "manual" y "automatico" pues nop, no conozco ningun PAC que tenga la opcion manual, todos se manejan por web service para que esto sea automatizado
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

AlgusDark
Mensajes: 6
Registrado: Mar Sep 11, 2012 7:56 pm

Re: Creación de CFDI 3.2

Mensajepor AlgusDark » Lun Sep 17, 2012 2:47 pm

Disculpa DADO,

¿Qué precio tiene ServiTimbre? No enuentro el costo.

Me pondré a trabajar el DLL de Ecodex que tienes en la página para ver que tan factible es ésa opción.

Gracias por tu pronta respuesta.

Saludos!!!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Creación de CFDI 3.2

Mensajepor Dado » Lun Sep 17, 2012 3:21 pm

Por email ya te envie la cotizacion
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

albertoarau
Mensajes: 3
Registrado: Mar Sep 18, 2012 1:53 pm

Re: Creación de CFDI 3.2

Mensajepor albertoarau » Mar Sep 18, 2012 5:39 pm

Buen dia, a todos.
Soy nuevo en todo esto y estoy realizando algunas pruebas y me encontre este foro donde he seguido la mayoria de sus comentarios.
Sera que alguien me pudiera ayudar con la clave opensslkey ya que me marca un error (El nombre X509Certificate2UI no existe en el contexto actual) y no encuentro el motivo.

De antemano muchas gracias.

Saludos


Volver a “Visual Basic”

¿Quién está conectado?

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