Получите JSON POST с PHP

Я пытаюсь получить JSON POST на веб-сайте платежного интерфейса, но я не могу его декодировать.

Когда я печатаю:

echo $_POST; 

Я получил:

 Array 

Я ничего не получаю, когда я пытаюсь это сделать:

 if ( $_POST ) { foreach ( $_POST as $key => $value ) { echo "llave: ".$key."- Valor:".$value."<br />"; } } 

Я ничего не получаю, когда я пытаюсь это сделать:

 $string = $_POST['operation']; $var = json_decode($string); echo $var; 

Я получаю NULL, когда я пытаюсь это сделать:

 $data = json_decode( file_get_contents('php://input') ); var_dump( $data->operation ); 

Когда я делаю:

 $data = json_decode(file_get_contents('php://input'), true); var_dump($data); 

Я получил:

 NULL 

Формат JSON (согласно документации сайта оплаты):

 { "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" } } } 

В журнале платежного сайта говорится, что все в порядке. В чем проблема?

Пытаться;

 $data = json_decode(file_get_contents('php://input'), true); print_r($data); echo $data["operacion"]; 

Из вашего json и вашего кода кажется, что вы правильно произвели правильную работу слова на своем конце, но это не в json.

РЕДАКТИРОВАТЬ

Возможно, также стоит попытаться отследить строку json из ввода php: //.

 echo file_get_contents('php://input'); 

Используйте $HTTP_RAW_POST_DATA вместо $_POST .

Он даст вам данные POST как есть.

Вы сможете декодировать его с помощью json_decode() позже.

Если у вас уже есть ваши параметры, например, $ _POST ['eg'], и вы не хотите его менять, просто сделайте это так:

 $_POST = json_decode(file_get_contents('php://input'), true); 

Это избавит вас от необходимости менять все $ _POST на что-то еще и позволяет вам делать обычные почтовые запросы, если вы хотите использовать эту строку.

Стоит отметить, что если вы используете json_decode(file_get_contents("php://input")) (как упомянули другие), это не удастся, если строка недействительна JSON.

Это можно просто решить, предварительно проверив, действительно ли JSON. т.е.

 function isValidJSON($str) { json_decode($str); return json_last_error() == JSON_ERROR_NONE; } $json_params = file_get_contents("php://input"); if (strlen($json_params) > 0 && isValidJSON($json_params)) $decoded_params = json_decode($json_params); 

Изменить: Обратите внимание, что удаление strlen($json_params) выше может привести к тонким ошибкам, поскольку json_last_error() не изменяется, когда пустая или пустая строка передается, как показано здесь: http://ideone.com/va3u8U

Прочтите документ:

Как правило, вместо $ HTTP_RAW_POST_DATA следует использовать вход php: //.

как в справочнике php

Использование php: // может помочь, но это не сработало для меня, вот что получилось:

  • проверьте кодировку данных. Если это URLEncoded, убедитесь, что он отправлен URLEncoded.

  • убедитесь, что кавычки не были экранированы из-за флага волшебных кавычек.

Если эти две проверки не решают вашу проблему, то, чтобы узнать, что такое данные, вы должны выполнить эхо или распечатать свои данные до, а затем после декодирования, чтобы узнать, как данные получены и обработаны.