Problema enviando SMS con JSON desde VFP 9 (200 OK, pero no llega)

280 views
Skip to first unread message

Alejandro García Garay

unread,
Dec 27, 2024, 8:28:14 AM12/27/24
to Comunidad de Visual Foxpro en Español

Hola a todos,

Estoy enfrentando un problema con una rutina que desarrollé para enviar SMS a través de una empresa que proporciona este servicio. El programa envía una solicitud HTTP utilizando JSON, incluyendo los datos requeridos: el usuario, el token, el número de celular y el mensaje.

El inconveniente es que, aunque la solicitud devuelve un código de estado 200 OK, el mensaje no llega al destinatario. Lo curioso es que cuando pruebo la misma solicitud utilizando herramientas como Insomnia o Postman, el SMS se envía correctamente, lo que indica que la configuración y los datos proporcionados son correctos.

En VFP 9 no recibo ningún error, pero tampoco el resultado esperado. Mi sospecha es que podría haber algún problema con la forma en que se está manejando el JSON, la codificación o tal vez con la librería que estoy utilizando para realizar la solicitud HTTP.

Agradecería cualquier orientación o sugerencia sobre qué podría estar causando este problema y cómo solucionarlo.

Gracias de antemano por su ayuda.

Acá dejo la rutina que estoy utilizando

lcPhoneNumber  = '573000000000'
lcMessageText = 'Recordatorio Pago pendiente credito HZ 002474 Si ya pago, ignore este mensaje. Gracias por su compromiso.'

lnRespuesta = SendSMSAPI(lcPhoneNumber, lcMessageText)

FUNCTION SendSMSAPI(tcPhoneNumber, tcMessageText)
LOCAL lnResult, response
LOCAL loHTTP AS MSXML2.SERVERXMLHTTP

WaitWindowCentrado("Enviando mesaje SMS al cliente.", 1,)

lcUserZenvia  = ALLTRIM(devuelveparametro("185")) &&Usuario SMS masivo Zenvia
lcTokenZenvia = ALLTRIM(devuelveparametro("186")) &&Token SMS masivo Zenvia
WURL ='https://api.zenvia.com/v2/channels/sms/messages' &&URL para el envío

* Inicializa el objeto JSON
PJSON = ""

TEXT TO PJSON NOSHOW
{
"from": <<lcUserZenvia>>,
"to": <<tcPhoneNumber>>,
"contents": [
{
"type": "text",
"text": <<tcMessageText>>
}
]
}
ENDTEXT


* Aquí puedes agregar la lógica para enviar el SMS utilizando la API de un tercero.
TRY
loHTTP = CREATEOBJECT("MSXML2.ServerXMLHTTP")

loHTTP.OPEN("POST", WURL, .F.)
loHTTP.SETREQUESTHEADER("Content-Type", "application/json") && ; charset=utf-8
loHTTP.SETREQUESTHEADER("Accept", "application/json")
loHTTP.SETREQUESTHEADER("X-API-TOKEN", lcTokenZenvia) &&El Token para identidicar al usuario

* Enviamos el JSON con todo lo demas arriba configurado para que se mande el SMS
loHTTP.SEND(PJSON)
response = loHTTP.responseText

DO WHILE loHTTP.READYSTATE != 4
WaitWindowCentrado("loHTTP.READYSTATE", 1,)
DOEVENTS
ENDDO
*

IF loHTTP.STATUS # 200
lnReturn = null
WAIT CLEAR
EXIT
ENDIF

lnReturn = response

CATCH TO oExc
lnReturn = .F.
MESSAGEBOX(oExc.Message)
FINALLY
loHTTP = NULL
ENDTRY

WAIT CLEAR
loHTTP = .NULL.
  RELEASE loHTTP

RETURN lnReturn
ENDFUNC

Diego F.

unread,
Dec 27, 2024, 9:48:58 AM12/27/24
to Comunidad de Visual Foxpro en Español
Revisa los headers

Alejandro García Garay

unread,
Dec 27, 2024, 9:53:42 AM12/27/24
to Comunidad de Visual Foxpro en Español
Gracias por responder, el único que me pide o exige es esta línea que contiene el token:

loHTTP.SETREQUESTHEADER("X-API-TOKEN", lcTokenZenvia) &&El Token para identidicar al usuario

En Insomnia, lo debo colocar allí para que el mensaje se pueda ir.

Alejandro García Garay

unread,
Dec 27, 2024, 10:34:18 AM12/27/24
to Comunidad de Visual Foxpro en Español
Hice un cambio en la rutina y he capturado un error, sin embargo, no lo comprendo bien ya que el JSON se esta armando como lo hago en el Insomnia, coloco la respuesta:

Request has one or mor errors In body For Content-Type application/json Invalid value Did not validate against all schemas at: 0 One or more required properties missing: from, to, contents

El nuevo códgio que tengo es el siguiente:

FUNCTION SendSMSAPI(tcPhoneNumber, tcMessageText)
LOCAL lnResult, response
LOCAL loXMLHTTP AS "MSXML2.XMLHTTP"

Set Procedure To "C:\IGD\Clases\nfJson\nfJsonRead" additive


WaitWindowCentrado("Enviando mesaje SMS al cliente.", 1,)

lcUserZenvia  = ALLTRIM(devuelveparametro("185")) &&Usuario SMS masivo Zenvia
lcTokenZenvia = ALLTRIM(devuelveparametro("186")) &&Token SMS masivo Zenvia
WURL ='https://api.zenvia.com/v2/channels/sms/messages' &&URL para el envío

* Inicializa el objeto JSON
PJSON = ""

*!* TEXT TO PJSON NOSHOW
*!* {
*!* "from": <<lcUserZenvia>>,
*!* "to": <<tcPhoneNumber>>,
*!* "contents": [
*!* {
*!* "type": "text",
*!* "text": <<tcMessageText>>
*!* }
*!* ]
*!* }
*!* ENDTEXT
SET STEP ON
PJSON = '{"from": "' + lcUserZenvia + '", "to": "' + tcPhoneNumber + '", "contents": [{"type": "text", "text": "' + tcMessageText + '"}]}'


TRY
loXMLHTTP = CREATEOBJECT("MSXML2.XMLHTTP.6.0")
CATCH
loXMLHTTP = CREATEOBJECT("MSXML2.XMLHTTP.3.0")
ENDTRY


* Aquí puedes agregar la lógica para enviar el SMS utilizando la API de un tercero.
TRY
WITH loXMLHTTP
.OPEN("POST", WURL, .F.)

.SETREQUESTHEADER("X-API-TOKEN", lcTokenZenvia) &&El Token para identidicar al usuario
.SEND(PJSON)

response = .responseText
ENDWITH

vfpobj = nfJsonRead(response)
SET STEP ON
CATCH TO oException
IF oException.ERRORNO = 1
STRTOFILE("Ocurrio un error a las: " + TRANSFORM(DATETIME());
+ CHR(13),"C:\Temp\Errors.log",.T.)
ENDIF
FINALLY
ENDTRY

WAIT CLEAR
loXMLHTTP = .NULL.
  RELEASE loXMLHTTP

RETURN IIF(TYPE("vfpobj") = "U", .F., vfpobj) &&cDato
ENDFUNC

Diego F.

unread,
Dec 27, 2024, 12:27:41 PM12/27/24
to Comunidad de Visual Foxpro en Español
Segun el error que muestras, el problema esta en tu json. Prueba hacer el json en un archivo de texto y cargarlo con FILETOSTR para ver si de esa manera te lo toma.

Diego.

Mik

unread,
Dec 27, 2024, 1:39:22 PM12/27/24
to Comunidad de Visual Foxpro en Español
A menos que ya tengas en alguna parte de tu codigo el SET TEXTMERGE en ON, creo que esta linea debes cambiarla:

TEXT TO PJSON NOSHOW   a  TEXT TO PJSON TEXTMERGE NOSHOW    

Saludos!

Alejandro García Garay

unread,
Dec 28, 2024, 9:31:58 AM12/28/24
to Comunidad de Visual Foxpro en Español
Saludos.

Gracias por las respuetas. Voy a ir probando con las sugerencias  a ver si alguna me funciona y les comento luego que tuve que hacer, en caso de que sea positivo.

Victor Espina

unread,
Dec 30, 2024, 4:10:33 PM12/30/24
to Comunidad de Visual Foxpro en Español
Tu JSON esta mal formado.  Tu estas esperando algo como esto:

{
   "from": "pru...@gmail.com",
   "to": "des...@gmail.com",
   ..
}

pero en realidad lo que estas generando es:

{
   "from": pru...@gmail.com,
   "to": des...@gmail.com,
   ..
}


Cambia tu codigo por este:

TEXT TO PJSON NOSHOW
{
"from": "<<lcUserZenvia>>",
"to": "<<tcPhoneNumber>>",
"contents": [
{
"type": "text",
"text": "<<tcMessageText>>"
}
]
}
ENDTEXT

y ahi pruebas de nuevo.  Otra buena idea es guardar el JSON en un archivo (con STRTOFILE) y luego validarlo en alguna pagina en linea para validacion de JSONs.  Asi sabras si el JSON es efectivamente valido o no antes de enviarlo.

Finalmente, si no lo conocias, te recomiendo mi clase JSON, la cual contiene metodos para invocar webservices tipo REST.

Saludos

Victor Espina

Alejandro García Garay

unread,
Dec 31, 2024, 9:40:58 AM12/31/24
to Comunidad de Visual Foxpro en Español
Hola, saludos.

Efectivamente, el detalle que tenia era en la creación del JSON, así como comentaron Mik y Vespinas lo modifique y obtengo respuesta afirmativa, sin embargo, no esta funcionando como tal el servicio, ya coloque una petición de revisión en mi usuario para ver y estoy a la espera.

Sobre tu clase, si la conozco y la utilizo en algunas partes de un aplicativo que tengo, para esta rutino no lo revise por ser más sencillo el código pero lo miraré nuevamente.

Alejandro García Garay

unread,
Jan 10, 2025, 8:12:56 AM1/10/25
to Comunidad de Visual Foxpro en Español
Saludos, feliz año.

Luego de tomarme unas vacaciones, retorno a laborar. Les retoalimento sobre mi detalle:

Efectivamente por un lado la construcción del JSON tenia un detalle, el cual fue corregido. Luego, utilice la librería de Vespina para acortar y mejorar el código y aún así no funcionaba, pero me percate que el problema era por parte del proveedor del servicio, Zenvia, estuve en dialogos con ellos y luego de revisiones se percataron de que mi usuario de pruebas no tenia créditos para hacer los envíos, hubo algunos detalles internos de ellos y en el día de ayer me voliveron a activar un set de pruebas, comence a enivar por Postman un par y luego de verificar que funcionaba todo, utiilice la rutina y también me llegan los SMS a los moviles.

Con esto claro, continuare a implementar la opción para los clientes. Les agradezco a todos por el tiempo y las repuestas dadas.
Reply all
Reply to author
Forward
0 new messages