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
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
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
Y el selloDigital (SHA-1) 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||
SIZiKCIS2MSkB20b1mwqCj02lUZr8iB1Sgqb0D9l30l2FwASwdxR44BCH/nE1BS74pD1dVA5BGpRiXUAwSwtFCUEq6Cu4xdKgJPAxxCXvav5tNl2Sn6XBVnXqMgOyZuCLZQj+BPYLYMMb7stce2+PaHkNHkhqaFHBRYDwuJvV8s=