Problemas con la conversion de UTF8 a FOX en Ticket de Acceso WS de AFIP

222 views
Skip to first unread message

Eric Zbrun

unread,
Jun 21, 2025, 10:45:14 AM6/21/25
to publice...@googlegroups.com
Compañeros de FOX!
En el sistema de Facturación que tengo desarrollado con FOX (VFP9) desde hace años para este cliente me pasa que con los últimos cambios que hay por la RG 5616 de la AFIP cuando bajo el TA (Ticket de Acceso) que me da la AFIP lo puedo usar sin problema la primer factura que hace el usuario pero la segunda vez si recupero ese TA de un XML o incluso de una propiedad o DBF da error de ASCII les paso la pantalla.
Lo particular es que ese cliente tiene una ñ en su nombre ahí empiezan los problemas de conversión. Con la versión anterior de las librerías de PyAFIPWS  (Sistemas Agiles) no había problemas, con las nuevas si. Lo estoy viendo con ellos ese tema pero según consulté algunas IA me dice que es un problema conocido de VFP9 no puede manejar UTF8 a ANSI Codepage (uso la estándar 1252) pero según me informa la IA (no sé si alucina!!!) VFP no puede manejar bien esta conversión y menos con el string generado por la librerías PyAFIPWS que están en Python. 
Ya probé el strconv y no hay caso pasa lo mismo. Lo peor es que la única manera que estoy probando es en producción en el cliente.  (Con los tiempos y trastornos que esto lleva).

imagen.png

XML que me muestra FOX que guardo en XML 
jujeña sería la empresa pero la pone como  jujeña  y por mas que haga cambios loTA=STRTRAN(loTA, "ñ", "ñ") sigue con el error.
(Los CUIT fueron cambiados)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<loginTicketResponse version="1.0">
    <header>
        <source>CN=wsaa, O=AFIP, C=AR, SERIALNUMBER=CUIT 33333333333</source>
        <destination>C=ar, O=jujeña srl, SERIALNUMBER=CUIT 31313131313, CN=jujeña srl</destination>
        <uniqueId>4106579323</uniqueId>
        <generationTime>2025-06-20T11:57:47.187-03:00</generationTime>
        <expirationTime>2025-06-20T23:57:47.187-03:00</expirationTime>
    </header>
    <credentials>
        <token>tocken.....................K</token>
        <sign>sign.............</sign>
    </credentials>
</loginTicketResponse>
--



XML que guardo en un DBF

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<loginTicketResponse version="1.0">
    <header>
        <source>CN=wsaa, O=AFIP, C=AR, SERIALNUMBER=CUIT 3333333333</source>
        <destination>C=ar, O=jujeña s.a., SERIALNUMBER=CUIT 3311111111, CN=jujeña s.a.</destination>
        <uniqueId>4106579323</uniqueId>
        <generationTime>2025-06-20T11:57:47.187-03:00</generationTime>
        <expirationTime>2025-06-20T23:57:47.187-03:00</expirationTime>
    </header>
    <credentials>
        <token>......</token>
        <sign>.......</sign>
    </credentials>
</loginTicketResponse>

Alguien tiene idea qué solución se le puede dar a esto?
Estoy probando que este en una variable publica el TA asignado pero el tema que no puede cerrar el sistema es una locura ya que no la puede generar otra hasta que se venza esa TA.

Saludos.
Eric!

Zarlu

unread,
Jun 21, 2025, 11:21:55 AM6/21/25
to Comunidad de Visual Foxpro en Español
Buenos días Eric!

Me declaro neófito en el asunto, pero te comento de una experiencia semejante...

Al enviar correos solucioné lo de los caracteres especiales aplicando al texto un reemplazo con la función que anexo.
Quizá puedas probarla a ver si te ayuda.

lcTexto="Señor"
lcTexto= acentos( lcTexto)

FUNCTION acentos(lcDato)
*https://www.degraeve.com/reference/specialcharacters.php
LOCAL lcDato
lcDato=STRTRAN(lcDato, "á", "&#225;")
lcDato=STRTRAN(lcDato, "Á", "&#193;")
lcDato=STRTRAN(lcDato, "é", "&#233;")
lcDato=STRTRAN(lcDato, "É", "&#201;")
lcDato=STRTRAN(lcDato, "í", "&#237;")
lcDato=STRTRAN(lcDato, "Í", "&#205;")
lcDato=STRTRAN(lcDato, "ó", "&#243;")
lcDato=STRTRAN(lcDato, "Ó", "&#211;")
lcDato=STRTRAN(lcDato, "ú", "&#250;")
lcDato=STRTRAN(lcDato, "Ú", "&#218;")
lcDato=STRTRAN(lcDato, "ñ", "&#241;")
lcDato=STRTRAN(lcDato, "Ñ", "&#209;")
lcDato=STRTRAN(lcDato, "ü", "&#252;")
lcDato=STRTRAN(lcDato, "Ü", "&#220;")
RETURN (lcDato)
ENDFUNC


Suerte
zarlu
Chetumal, Quintana Roo, México

Esteban Herrero

unread,
Jun 21, 2025, 11:29:22 AM6/21/25
to publice...@googlegroups.com
Hola...

Del TA sólo necesitas el Token y Sign y guardas la fecha/hora p validar
la vigencia del ticket, pq obtener los datos de tu cliente, cuando ya
los sabes de antemano???

Saludos

El 21/06/2025 a las 11:44, Eric Zbrun escribió:
> RG 5616

Sergio Rojas

unread,
Jun 21, 2025, 3:35:07 PM6/21/25
to publice...@googlegroups.com

La "ñ" debe ser reeplazada por "&ntilde;"

El 21/06/2025 a las 11:44, Eric Zbrun escribió:
--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/CABcn1T%3DoYxLPA7rBMRoJK-09hqSSu4whm%2BvgebMac1Abe1yQRQ%40mail.gmail.com.

António Tavares Lopes

unread,
Jun 21, 2025, 6:07:40 PM6/21/25
to Comunidad de Visual Foxpro en Español
Eric,

La codificación del documento XML está marcada como UTF-8 (el valor del atributo encoding en la primera línea). Por lo tanto, no debe intentar sustituir la codificación por otra (por ejemplo, ANSI) sin cambiar lo que asume el documento XML.

Además, el XML que estás recibiendo tiene un prefijo (los símbolos 0hEFBBF, representados visualmente por VFP como ï "¿) que no tienen otra función que indicar la codificación del fichero (independientemente del atributo encoding en la declaración del documento XML).

¿Qué puede hacer para registrar el documento XML en su base de datos VFP? Asumiendo que no te sientes cómodo manejando documentos UTF-8, te sugiero

a) ignorar el prefijo

m.lcXML = SUBSTR(m.lcXML, 4)

b) traducir la codificación UTF-8 a ANSI

m.lcXML = STRCONV(m.lcXML, 11)

c) sustituir el valor del atributo encoding en la declaración XML

m.lcXML = STRTRAN(m.lcXML, 'encoding="UTF-8"', 'encoding="iso-8859-1"', 1, 1)


Traducción realizada con la versión gratuita del traductor DeepL.com


Daniel Diaz

unread,
Jun 22, 2025, 8:38:39 AM6/22/25
to publice...@googlegroups.com
Y si compañero, van a ir pasando estas cosas cada vez mas, hace rato ya que eso pide migrar a web.

--

Esteban Herrero

unread,
Jun 22, 2025, 11:04:27 AM6/22/25
to publice...@googlegroups.com

Haciendo esto q te propone Zarlu, resolvés el problema. Hice una prueba y funciona Ok.

Saludos

        <token>tocken....................K</token>

        <sign>sign.............</sign>
    </credentials>
</loginTicketResponse>
--



XML que guardo en un DBF

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<loginTicketResponse version="1.0">
    <header>
        <source>CN=wsaa, O=AFIP, C=AR, SERIALNUMBER=CUIT 3333333333</source>
        <destination>C=ar, O=jujeña s.a., SERIALNUMBER=CUIT 3311111111, CN=jujeña s.a.</destination>
        <uniqueId>4106579323</uniqueId>
        <generationTime>2025-06-20T11:57:47.187-03:00</generationTime>
        <expirationTime>2025-06-20T23:57:47.187-03:00</expirationTime>
    </header>
    <credentials>
        <token>......</token>
        <sign>.......</sign>
    </credentials>
</loginTicketResponse>

Alguien tiene idea qué solución se le puede dar a esto?
Estoy probando que este en una variable publica el TA asignado pero el tema que no puede cerrar el sistema es una locura ya que no la puede generar otra hasta que se venza esa TA.

Saludos.
Eric!
--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Message has been deleted

Eric Zbrun

unread,
Jun 27, 2025, 6:46:54 PM6/27/25
to Comunidad de Visual Foxpro en Español
Gracias a todos por su ayuda y su tiempo pero logre resolverlo mi problema era que tomaba la Ticket de Acceso para la factura electrónica y ese ticket tiene el nombre de la empresa con Ñ y no hubo manera de resolverlo con los tiempo que tengo lo resolvi por un comentario que dijo Estaban H. que era usar solo el Token y el sign. Yo tenia que la forma de volver reusar el ticket de Acceso era
this.oWSFE.SetTicketAcceso(_TicketAcceso)  ahora la info que me de _TicketAcceso= This.oWSAA.CallWSAA(this.oCMS, "https://wsaa.afip.gov.ar/ws/services/LoginCms")  es del codigo que tengo desde 2015. 
Luego tomo  _screen.token=this.oWSAA.Token
_screen.sign=this.oWSAA.Sign
_screen.fechaTA=this.oWSAA.expirationTime
Y listo.
Bueno agradezco a todos y a seguir "programando en FOX, claro"!!!

Saludos
Eric!

Victor Espina

unread,
Jul 9, 2025, 11:45:15 AM7/9/25
to Comunidad de Visual Foxpro en Español
Quizas voy a decir una burrada, pero de esa respuesta lo unico que necesitas son los valores de token, sign y la fecha de expiracion del token, y ninguno de esos valores necesitan estar en UTF8.  En mi libreria lo que hago es guardar esos valores en un archivo texto asociado al CUIT emisor y el webservice asociado.  Al momento de autenticar verifico si tengo ese archivo, lo leo y veo si aun es valido (por la fecha de expiracion);  si es asi, termino y devuelvo el token y sign que ya tenia guardados.  Si el archivo no existe o ya vencio, ahi recien vuelvo a generar un TRA.XML desde cero (sin source ni target) y obtengo un nuevo set de token/sign y los guardo para reusarlos luego.

A veces pasa que aunque se supone que el token es valido, cuando invocas otro endpoint recibes un error indicando que el token de acceso ya no es valido.  En ese caso mi libreria detecta esa situacion automaticamente,  se autentica de nuevo automaticamnete en el ws apropiado y repite la operacion con el nuevo token, de modo que el usuario no se entera de nada (solo nota que tarda un poco mas en autorizar).

Saludos

Victor Espina

Eric Zbrun

unread,
Jul 10, 2025, 7:09:46 AM7/10/25
to publice...@googlegroups.com
Hola Victor!! Si lo resolví de esa manera guardando el Token y el Sign antes guardaba el TA (Ticket de Acceso) y ese TA este tiene el nombre de mi cliente que tiene una Ñ y me da error al hacer la segunda factura (no a la primera), no me pasa lo mismo con otros clientes. Así que cambiando la forma de conectarme con WS de ARCA funcionó sin problemas. Gracias por contestar.
Saludos.
Eric!


--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/publicesvfoxpro/cSrcC0vmLsc/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/70a3249a-157c-4c90-b041-430f5b2a310an%40googlegroups.com.


--
Saludos.
Eric!
Reply all
Reply to author
Forward
0 new messages