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
(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
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.
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):