Imagen

DESCARGA SOFTWARE PARA FACTURA ELECTRONICA DE AQUI.
Facturacion, Validacion, Addendas, Librerias de programacion, etc.


ECODEX TIENE ESTOS NUEVOS DATOS DE CONTACTO :
Comercializacion y Ventas - Evelia Vicke evicke@ecodex.com.mx 33-16-03-03-48
Soporte - Humberto Guerrero soporte@ecodex.com.mx 33-34-90-46-03

txt utf8 con formato diferente

Para quienes programan Visual Basic aqui esta la solucion
[[ FORO CERRADO DEBIDO A QUE YA LA INFORMACION YA NO ES VIGENTE ]]
en_gamboa
Mensajes: 16
Registrado: Sab Oct 09, 2010 3:19 pm

txt utf8 con formato diferente

Mensajepor en_gamboa » Dom Oct 10, 2010 12:58 pm

Hola a todos, estoy programando la salida de la cadena original a un archivo de texto llamado utf8.txt

Dim Cad As Integer
cad = FreeFile
Open CurrentProject.Path & "\configcfd\utf8.txt" For Output As #cad
Print #Cad, Me.Sellop
Close #Cad

despues de esto hago todo el proceso de sellado y parece que todo va bien, pero cuando verifico el xml en el verificador del sat, me dice que no es valido el sello, ya verifique la conversion de la cadena a md5 y parece que hay esta el problema, al exportar la cadena original convertido en utf-8 me aparece esto en el archivo de texto md5.txt.

ffc715851f54f9499bd2bc21b829ec74

despues hise pruebas antes de ejecutar el bat

OpenSSL dgst -md5 utf8.txt >md5.txt

para hacer la digestion, entre al archivo utf8.txt y sin realizar ningun cambio lo guarde me sali y ejecute el archivo

OpenSSL dgst -md5 utf8.txt >md5.

y me mando esto

8da7ed9f61130bb346f1f816f7075fc9

muy diferente a lo que me manda cuando no hago el proceso de guardarlo, me imagino que pasa con un formato diferente por eso es que no manda la digestion correcta cuando lo hago sin guardarlo, la segunda digestion es la correcta ya lo verifique, el problema es que tengo que entrar al archivo y guardarlo para que sea correcto, tiene alguna idea de por que pasa esto, programo en vba de access.

Grcias de antemano

mauricio
Mensajes: 372
Registrado: Mié Ago 11, 2010 1:55 am
Ubicación: México, D.F.
Contactar:

Re: txt utf8 con formato diferente

Mensajepor mauricio » Dom Oct 10, 2010 6:14 pm

¿Como estas generando tu cadena original?... si esta no cumple con los requisitos, por más que la digestion en MD5 resulten iguales, jamas obtendrás un sello valido...

Saludos
Todo lo que no es dado es perdido

en_gamboa
Mensajes: 16
Registrado: Sab Oct 09, 2010 3:19 pm

Re: txt utf8 con formato diferente

Mensajepor en_gamboa » Lun Oct 11, 2010 12:29 pm

Set rst = CurrentDb.OpenRecordset(" Select * From [" & Forms!inicio!Ruta & "\facturas.mdb;PWD=svp261206-2].detalles_facturas where factura=" & Me.Lista.Column(1) & "")
While Not rst.EOF
vpartidas = vpartidas & rst!cantidad & "|" & rst!unidad & "|" & rst!Descripcion & "|" & Format(rst!preciop, "########0.00") & "|" & Format(rst!preciotp, "########0.00") & "|"
rst.MoveNext
Wend
rst.Close

vsversion = "||" & Me.version & "|"
vsserie = Me.serie & "|"
vsfolio = Me.folio & "|"
vsfecha = Mid(Vfecha, 7, 4) & "-" & Mid(Vfecha, 4, 2) & "-" & Mid(Vfecha, 1, 2) & "T" & Vhora & "|"
vsnaprob = Me.noaprob & "|"
vsaaprob = Me.anoaprob & "|"
vstcomprobante = Me.tcomprobate & "|"
vsfpago = Me.fpago & "|"
vscpago = Me.cpago & "|"
vssubtotal = Me.subtotal & "|"
vsdescuento = Me.Descuento & "|"
vstotal = Me.total & "|"
vsrfce = Me.rfce & "|"
vsrazonse = Me.nombree & "|"
vscallee = Me.callee & "|"
vsexte = Me.exteriore & "|"
If Me.interiore = "" Or IsNull(Me.interiore) Then
vsinte = ""
Else
vsinte = Me.interiore & "|"
End If
vscole = Me.coloniae & "|"
If Me.localidade = "" Or IsNull(Me.localidade) Then
vslocalidade = ""
Else
vslocalidade = Me.localidade & "|"
End If
vsmune = Me.municipioe & "|"
Vseste = Me.estadoe & "|"
Vspaise = Me.paise & "|"
vscodposte = Me.codpose & "|"
Vsrfcr = Me.rfcr & "|"
vsrazonsr = Me.nombrer & "|"
Vscaller = Me.caller & "|"
Vsextr = Me.exteriorr & "|"
If Me.interiorr = "" Or IsNull(Me.interiorr) Then
vsintr = ""
Else
vsintr = Me.interiorr & "|"
End If
Vscolr = Me.coloniar & "|"
If Me.localidadr = "" Or IsNull(Me.localidadr) Then
vslocalidadr = ""
Else
vslocalidadr = Me.localidadr & "|"
End If
Vsmunr = Me.municipior & "|"
Vsestr = Me.estador & "|"
vspaiser = Me.paisr & "|"
Vscodposr = Me.codposr & "|"
vsivaetiq = Format(16, "########0.00") & "|"
vsiva = Format(Me.iva, "########0.00") & "|"
cadena_original = ""

cadena_original = vsversion & vsserie & vsfolio & vsfecha & vsnaprob & vsaaprob & vstcomprobante & vsfpago & vscpago & vssubtotal & vsdescuento & _
vstotal & vsrfce & vsrazonse & vscallee & vsexte & vsinte & vscole & vslocalidade & vsmune & Vseste & Vspaise & vscodposte & Vsrfcr & _
vsrazonsr & Vscaller & Vsextr & vsinter & Vscolr & vslocalidadr & Vsmunr & Vsestr & vspaiser & Vscodposr & vpartidas & "IVA" & "|" & _
vsivaetiq & vsiva & "|"

Me.Cadena = cadena_original

luego la convierto a utf8

UTF8 = ""
For a = 1 To Len(cadena_original)
Caracter = AscW(Mid(cadena_original, a, 1))
If Caracter < 128 Then
UTF8 = UTF8 + Mid(cadena_original, a, 1)
ElseIf ((Caracter > 127) And (Caracter < 2048)) Then
UTF8 = UTF8 + Chr(((Caracter \ 64) Or 192))
UTF8 = UTF8 + Chr(((Caracter And 63) Or 128))
Else
UTF8 = UTF8 + Chr(((Caracter \ 144) Or 234))
UTF8 = UTF8 + Chr((((Caracter \ 64) And 63) Or 128))
UTF8 = UTF8 + Chr(((Caracter And 63) Or 128))
End If
Next a
Me.Sellop.SetFocus
Me.Sellop.Text = UTF8

luego la mando al archivo de texto utf8.txt

Dim Channel As Integer
Channel = FreeFile
Open CurrentProject.Path & "\configcfd\utf8.txt" For Output As #Channel
Print #Channel, Me.Sellop
Close #Channel

creo que algo me falta pero no se que espero encuentres la falla, gracias por tu interes.

mauricio
Mensajes: 372
Registrado: Mié Ago 11, 2010 1:55 am
Ubicación: México, D.F.
Contactar:

Re: txt utf8 con formato diferente

Mensajepor mauricio » Lun Oct 11, 2010 2:24 pm

Hola...

Hace años que no programo en VB (¿que versión estas usando?), pero no estoy seguro de que el paso que haces a UTF-8 sea el correcto, he visto varias funciones en Internet que son muy diferentes a la que usas, UTF-8 tiene soporte acentos y la letra ñ, por lo que el paso a UTF-8 es realmente para los siguiente caracteres: “, <, > y ‘.
Para verificar donde esta el error, prueba son los datos de la siguiente factura de prueba: http://www.correolibre.net/archivos/factura.xml
Ingresalos a tu sistema y pon aquí la cadena original resultante, tanto la primero como la que obtienes después de que aplicas tu función UTF-8.

Por cierto, yo uso una lógica totalmente diferente a la tuya:
1.- Genero el XML con todos los datos de la factura de la base de datos
2.- Obtengo la cadena original parseando el XML contra los XSLT proporcionados con el SAT
3.- En un solo paso obtengo la digestión en MD5, sello con mi firma y paso a BASE64
4.- Agrego el sello al XML
5.- Lista para validar...

Publica lo que te pido para poder seguir ayudándote...

Saludos
Todo lo que no es dado es perdido

Sergio
Mensajes: 14
Registrado: Vie Oct 01, 2010 7:28 pm

Re: txt utf8 con formato diferente

Mensajepor Sergio » Lun Oct 18, 2010 10:55 am

Yo también tenía problemas en el momento de obtener el sello con el archivo utf8.txt. Busque ayuda pero tuve que resolver el problema a prueba y error. En mi caso, el problema fue que al guardar el archivo, se esconde un EOF que altera la información del archivo de texto. Para eleminar el EOF simplemente se ponen un punto y coma (;) y eso es todo. Probe el validador del SAT y todo correcto. Espero que esto sea la causa del problema y que lo puedas resolver:
Ejemplo:
Open "UTF8.txt" For Output As #1
Print #1, Cadena;
Close #1
También es muy importante que la cadena original coincida con el archivo XML. Esto lo puedes comprobar con el XML Notepad de Microsoft y el archivo cadenaoriginal_2_0.xslt del SAT, para hacer la transformación XML a cadeba original.

mauricio
Mensajes: 372
Registrado: Mié Ago 11, 2010 1:55 am
Ubicación: México, D.F.
Contactar:

Re: txt utf8 con formato diferente

Mensajepor mauricio » Mar Oct 19, 2010 10:04 am

Hola...

Para asegurarse que la cadena original esta correctamente formada, es mejor parsear el XML del CFD contra el XSLT proporcionado por la autoridad, así la cadena resultante es tal como la pide...

Saludos
Todo lo que no es dado es perdido

dcordova
Mensajes: 1
Registrado: Mar Nov 09, 2010 8:32 am

Re: txt utf8 con formato diferente

Mensajepor dcordova » Mar Nov 09, 2010 8:42 am

Buenos días.

En mi experiencia con la programación del cfd y en particular la cadena original puedo decirles que yo me pase mucho tiempo buscando algun error en ella y no lo encontre, y es porque siempre busque en el lugar equivocado, resulta que al crear el archivo de texto con la cadena original este quedaba en un formato UTF8, PERO ESTO NO ESE CORRECTO, debe de se UTF8 SIN BOM. así es que me di a la taria de quitarle la marca BOM, y es muy simple solo que yo no sabia que eso existiera.

Les paso mi codigo.

Dim fileName As String = "CadenaOriginal.txt"
Dim strStreamW As Stream
Dim strStreamWriter As StreamWriter
Dim PathUbicacionDeArchivos as string = "c:\Sello\"
Dim cadena as string = ""||2.0|A|0000122|2010-11-04T13:40:07|1|2010|ingreso|UNA SOLA EXHIBICIÓN|4060|20001|GEC0809301KA|GRUPO EI EN COMERCIO EXTERIOR S. DE R.L. DE C.V.|CANTÚ|9|705 1|NUEVA ANZURES|MIGUEL HIDALGO|DISTRITO FEDERAL|DISTRITO FEDERAL|MÉXICO|11590|EDM930614781|CARLOS SANCHEZ MEJIA|AYUTLA|2992|SAN FELIPE DE JESUS|DISTRITO FEDERAL|MÉXICO|07510|1.00|Servicio|1|HONORARIOS DEL AGENTE ADUANAL|1100|1100|1.00|Servicio|2|COMPLEMENTARIOS|1740|1740|1.00|Servicio|3|VALIDACION DE PEDIMENTOS|290|290|1.00|Servicio|4|TELEGRAMAS|580|580|1.00|Servicio|5|OTROS|174|174|IVA|16|560|560||""

strStreamW = File.OpenWrite(PathUbicacionDeArchivos & fileName)
strStreamWriter = New StreamWriter(strStreamW) 'NOTA EL PROBLERA ERAN LOS PARAMETROS QUE AQUI SE PASAN, NO PONGAN NADA MAS
strStreamWriter.Write(cadena)
strStreamWriter.Close()
strStreamWriter.Dispose()


El resultado es un archivo en c:\sello\CadenaOriginal.txt en formato UTF-8 sin Bom y con este archivo ya puedes generar tu sello.

Saludos.

Avatar de Usuario
Dado
Mensajes: 15836
Registrado: Mar Jul 06, 2010 7:56 pm

Re: txt utf8 con formato diferente

Mensajepor Dado » Mar Nov 09, 2010 9:08 am

@dcordova

Gracias por el aporte, tambien es importante que las cadenas no se graben con un CR-LF (#13 #10) al final, ni tampoco con un caracter Ctrl-Z o EOF (Fin de archivo)
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

enniosc
Mensajes: 1
Registrado: Vie Ene 28, 2011 2:00 pm

Re: txt utf8 con formato diferente

Mensajepor enniosc » Vie Ene 28, 2011 2:06 pm

mauricio escribió:¿Como estas generando tu cadena original?... si esta no cumple con los requisitos, por más que la digestion en MD5 resulten iguales, jamas obtendrás un sello valido...

Saludos

Hola Mauricio, yo me encuentro en ese predicamento y llevo un mes sin poder generar un sello correcto, podrías darme tips en VB de como generarlo, yo creo que de inicio la conversión de mi cadena original a uft8 está mal, crees que podrías ayudarme?

Saludos

Jeansoft
Mensajes: 10
Registrado: Jue Ene 06, 2011 10:22 am

Re: txt utf8 con formato diferente

Mensajepor Jeansoft » Sab Ene 29, 2011 10:34 am

Buen dia a compañeros...

A ver si esto les ayuda para resolver sus dudas.....solo para el tratamiento de la Cadena original

Recien armado el resumen o Cadena Original, pueden aplicar.

wCadenaOriginal = RetiraSecuencia(CadenaOriginal)

luego aplican.....

wCadenaOriginal=Encode_UTF8(wCadenaOriginal)

Finalmente graban en un archivo.
.....


Public Function RetiraSecuencia(xCadenaOriginal)
NuevaCadena = ""
For i = 1 To Len(xCadenaOriginal)
wCode = Asc(Mid(xCadenaOriginal, i, 1))
If wCode = 10 Or wCode = 13 Then
'NuevaCadena = NuevaCadena & " "
Else
NuevaCadena = NuevaCadena & Mid(xCadenaOriginal, i, 1)
End If
Next
RetiraSecuencia = NuevaCadena
End Function

Public Function Encode_UTF8(wStr)
'AscW devuelve el codigo en Unicode.
'Este valor puede ser de 0 a 65535.
'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vblr7/html/vaorivbruntimelibrarykeywords.asp
'
'UTF-8
'+------------------+----------------+--------------------------------+
'| UNICODE HEX | UNICODE DEC | OUTPUT |
'| From-To | From-To | Bytes |
'+------------------+----------------+--------------------------------+
'| 0..7F | 0..127 | 1 |
'| 80..7FF | 128..2047 | 2 |
'| 800..FFFF | 2048..65535 | 3 |
'+------------------+----------------+--------------------------------+
Dim X As Integer
Dim wCHR As Long
Dim UTF8_Text As String
UTF8_Text = ""
For X = 1 To Len(wStr)
wCHR = AscW(Mid(wStr, X, 1))
If wCHR < 128 Then
UTF8_Text = UTF8_Text + Mid(wStr, X, 1)
ElseIf ((wCHR > 127) And (wCHR < 2048)) Then
UTF8_Text = UTF8_Text + Chr(((wCHR \ 64) Or 192))
UTF8_Text = UTF8_Text + Chr(((wCHR And 63) Or 128))
Else
UTF8_Text = UTF8_Text + Chr(((wCHR \ 144) Or 234))
UTF8_Text = UTF8_Text + Chr((((wCHR \ 64) And 63) Or 128))
UTF8_Text = UTF8_Text + Chr(((wCHR And 63) Or 128))
End If
Next X
Encode_UTF8 = UTF8_Text
End Function


Volver a “Visual Basic”

¿Quién está conectado?

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