Problemas con capturar datos con cURL

  • Autor Autor Programarte
  • Fecha de inicio Fecha de inicio
Programarte

Programarte

Épsilon
Programador
Verificado
Verificación en dos pasos activada
Que tal compañeros buenas tardes.

Les vengo a hacer una consulta pues llevo ya buen rato con esto y por más que le he movido no encuentro aún el problema.

Resulta que en una web estoy programando el envío de unos datos por cURL a una web y ya vi que si los envía y la web que recibe los datos los procesa y devuelve un resultado. El problema viene cuando esos datos que devuelve la web no los puedo captar. Se supone que $datos debería tomar la información que regresa la página $url y al correr la página en el navegador si se ven los datos pero esos datos los debería tomar la variable y la siguiente línea que tengo es para que se escriban en un archivo pero al escribirlo lo pone vacío con 0 bytes, el código que tengo es este:

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cadena);
$datos = curl_exec($ch);
curl_close($ch);

file_put_contents('texto.xml', html_entity_decode(base64_decode($datos)));

Corriéndolo desde el navegador si veo el texto codificado pero al parecer no lo está capturando la variable porque incluso ya probé poner el texto que me aparece en el navegador directamente en la variable una línea antes de escribir el archivo y así si funciona quedando así:

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cadena);
$datos = curl_exec($ch);
curl_close($ch);

$datos="lkjad9038jdquduw09dmdo3i9moksdñlaksd0okem0iwmkdw"; //claro que esta es sólo una cadena inventada.
file_put_contents('texto.xml', html_entity_decode(base64_decode($datos)));

¿Alguien habrá tenido algún problema similar o se le ocurre alguna solución?

Gracias de antemano por sus respuestas.
 
Prueba con lo siguiente en la tercera linea.

PHP:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

Saludos
 
Prueba con lo siguiente en la tercera linea.

PHP:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

Saludos

Gracias por la respuesta.

Se me pasó mencionar que ya le había puesto esa línea aunque en vez de TRUE puse un uno pero de cualquier manera la puse tal cual me la indicas y el resultado es el mismo que me dio hace rato y este resultado es que en el archivo me escribe como 50 caracteres de basura cuando debería estar escrito un archivo en formato XML.
 
[MENTION=121488]Programarte[/MENTION] ¿Ya tiene la siguiente linea?

PHP:
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/xml"));

Con ello esperamos que la respuesta sea en formato XML y no como sea que se le de la gana.
 
[MENTION=121488]Programarte[/MENTION] ¿Ya tiene la siguiente linea?

PHP:
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/xml"));

Con ello esperamos que la respuesta sea en formato XML y no como sea que se le de la gana.

No la tiene porque en realidad no la espero en formato de XML sino que me la mando codificado en base64 y htmlentities y cuando lo recibo lo decodifico y el resultado que queda es precisamente el texto en formato XML. Ya verifiqué que efectivamente venga bien codificado pues como mencioné, cuando lo veo en el navegador me muestra un montón de caracteres que se supone debería tomar la variable $datos pero al escribir el archivo lo hace en blanco, entonces si los caracteres que yo veo en el navegador los copio, los pongo en el código en la variable manualmente antes de guardar el archivo y corró el archivo nuevamente en el navegador entonces si se crea el archivo como debe de ser por eso estoy viendo que el problema es que la variable simplemente parece no tomar los datos de regreso.
 
No la tiene porque en realidad no la espero en formato de XML sino que me la mando codificado en base64 y htmlentities y cuando lo recibo lo decodifico y el resultado que queda es precisamente el texto en formato XML. Ya verifiqué que efectivamente venga bien codificado pues como mencioné, cuando lo veo en el navegador me muestra un montón de caracteres que se supone debería tomar la variable $datos pero al escribir el archivo lo hace en blanco, entonces si los caracteres que yo veo en el navegador los copio, los pongo en el código en la variable manualmente antes de guardar el archivo y corró el archivo nuevamente en el navegador entonces si se crea el archivo como debe de ser por eso estoy viendo que el problema es que la variable simplemente parece no tomar los datos de regreso.

hace un file_put_contents sin el html_entity_decode a ver si ese es el culpable
 
Entonces dale un var_dump luego de cerrar curl a ver que es lo que contiene esa variable y con ello se descarta lo que dice cicklow
 
hace un file_put_contents sin el html_entity_decode a ver si ese es el culpable

Entonces dale un var_dump luego de cerrar curl a ver que es lo que contiene esa variable y con ello se descarta lo que dice cicklow

Gracias a ambos por sus respuestas.

Pues he hecho lo que ambos comentan y sigue el problema, ya intenté muchas variantes como mandar los datos con y sin htmlentities con y sin base64_encode/decode y nada el código que hasta el momento mejor trabajo por decirlo así es este ne lo que llamaré pagina1.php:

PHP:
$cadena="info=".base64_encode(htmlentities($informacion));

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POSTFIELDS, $cadena);
$datos = curl_exec($ch);
curl_close($ch);

$datos_xml=base64_decode($datos);
file_put_contents('texto.xml', html_entity_decode(base64_decode($datos_xml)));

Eso en el lado de la página que envía y la que recibe que le llamaré pagina2.php toma los datos así:

$base64Comprobante = html_entity_decode(base64_decode($_POST['info']));
$base64Comprobante=base64_encode($base64Comprobante);

Luego esa variable $base64Comprobante se manda a un webservice para ser validada y se le agregan datos al XML y lo devuleven y después viene esta línea

echo $xmlrecibido;

Cuando ejecuto pagina1.php en el navegador se queda en blanco pero si veo el código fuente está el texto XML que incluso si se ve que fue procesado por el webservice pues tiene la información adicional pero no se si la variable está en blanco porque como al correrlo en el navegador también se queda en blanco y sólo al ver el código fuente veo el archivo o no se ya le moví varias veces que a veces sí sale el texto directo en la página al correr en la página y a veces no pero de ninguna manera se ha guardado la información en el archivo texto.xml

Actualizo:

Se me pasó que ya antes había puesto que los datos de respuesta vinieran codificados o sea que en la página2.php los mando así:

PHP:
echo base64_encode(htmlentities($xmlrecibido));

Y así si veo la cadena codificada en el navegador al ejecutar el archivo y se supone que esa cadena es la que debería recibir la variable $datos pero sigue creando el archivo pero vacío. Para recibir y escribir los datos en la pagina1.php pongo esto:

PHP:
$datos_xml=html_entity_decode(base64_decode($datos));
file_put_contents('texto.xml', html_entity_decode(base64_decode($datos_xml)));

Pero pues nada.
 
Última edición:
Gracias a los que comentaron y para que les quede de conocimiento a aquellos que lean el tema les comento que encontré la solución.

No estaba recibiendo los datos porque el servidor donde estaba la pagina1.php tenía el parámetro allow_url_fopen en off en el archivo php.ini por lo que al cambiarlo a on funcionó como se esperaba desde un principio.
 
Atrás
Arriba