Estoy tratando de recibir un JSON POST en un sitio web de interfaz de pago, pero no puedo decodificarlo.
Cuando imprimo:
echo $_POST;
Yo obtengo:
Array
No obtengo nada cuando intento esto:
if ( $_POST ) {
foreach ( $_POST as $key => $value ) {
echo "llave: ".$key."- Valor:".$value."<br />";
}
}
No obtengo nada cuando intento esto:
$string = $_POST['operation'];
$var = json_decode($string);
echo $var;
Obtengo NULL cuando intento esto:
$data = json_decode( file_get_contents('php://input') );
var_dump( $data->operation );
Cuando lo hago:
$data = json_decode(file_get_contents('php://input'), true);
var_dump($data);
Yo obtengo:
NULL
El formato JSON es (de acuerdo con la documentación del sitio de pago):
{
"operacion": {
"tok": "[generated token]",
"shop_id": "12313",
"respuesta": "S",
"respuesta_details": "respuesta S",
"extended_respuesta_description": "respuesta extendida",
"moneda": "PYG",
"monto": "10100.00",
"authorization_number": "123456",
"ticket_number": "123456789123456",
"response_code": "00",
"response_description": "Transacción aprobada.",
"security_information": {
"customer_ip": "123.123.123.123",
"card_source": "I",
"card_country": "Croacia",
"version": "0.3",
"risk_index": "0"
}
}
}
El registro del sitio de pago dice que todo está bien. ¿Cuál es el problema?
var_dump($_POST)
dice ¿Es una matriz vacía?json_decode
hacerlo. Pero tal vez el servicio envía datos en el cuerpo de la solicitud , esa es una historia diferente y sí,file_get_contents('php://input')
debería funcionar entonces.Respuestas:
Tratar;
Desde su json y su código, parece que ha deletreado la palabra operación correctamente en su extremo, pero no está en el json.
EDITAR
Quizás también valga la pena intentar hacer eco de la cadena json de php: // input.
fuente
Si ya tiene sus parámetros configurados como $ _POST ['eg'] por ejemplo y no desea cambiarlo, simplemente hágalo así:
Esto le ahorrará la molestia de cambiar todos los $ _POST a otra cosa y le permitirá realizar solicitudes de publicación normales si desea eliminar esta línea.
fuente
Vale la pena señalar que si usa
json_decode(file_get_contents("php://input"))
(como otros han mencionado), esto fallará si la cadena no es JSON válida.Esto se puede resolver simplemente comprobando primero si el JSON es válido. es decir
Editar: Tenga en cuenta que la eliminación
strlen($json_params)
anterior puede generar errores sutiles, yajson_last_error()
que no cambia cuandonull
se pasa una cadena en blanco, como se muestra aquí: http://ideone.com/va3u8Ufuente
Usar en
$HTTP_RAW_POST_DATA
lugar de$_POST
.Le dará datos POST tal como están.
Podrá decodificarlo más
json_decode()
tarde.fuente
$json = file_get_contents('php://input'); $obj = json_decode($json);
$HTTP_RAW_POST_DATA
.Lee el documento:
como en el manual de php
fuente
Esto funcionó para mí.
fuente
Me gustaría publicar una respuesta que también use curl para obtener los contenidos, y mpdf para guardar los resultados en un pdf, para que obtenga todos los pasos de un caso de uso típico. Es solo código sin formato (para adaptarse a sus necesidades), pero funciona.
En $ mysrcfile leeré datos json como este (como se indicó en las respuestas anteriores):
fuente
file_get_contents('php://input')
.