2013-09-18 4 views
169

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

При печати:

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

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

+4

Что говорит 'var_dump ($ _ POST)' say? Это пустой массив? –

+0

'var_dump ($ _ POST);' что вы получаете? – Bora

+3

$ _POST имеет словарь «&» отделенных почтовых запросов. $ _POST для json ОПРЕДЕЛЕННО не работает. Можете ли вы распечатать file_get_contents ('php: // input')? Также это var_dump (операция $ data->); или var_dump ($ data-> operacion); ? – Akshay

ответ

326

Попыться;

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

Ваш JSON и код, это выглядит, как вы написали слово операцию правильно на вашем конце, но не в формате JSON.

EDIT

Возможно также стоит пытаться повторить JSON строку из PHP: // ввода.

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

Привет В обоих случаях я ничего не получаю на экране –

+4

Для чего это стоит, орфография (дайте или возьмите акцент) на испанском языке. – Patrick

+6

Его точка зрения заключалась в том, что он не правильно произнес ее в обоих местах, будь то операция или операция в обоих местах. – msj121

36

Использование $HTTP_RAW_POST_DATA вместо $_POST.

Он предоставит вам данные POST как есть.

Вы сможете декодировать его, используя json_decode().

+34

Поскольку $ HTTP_RAW_POST_DATA обесценивается теперь, вы можете использовать таким образом, чтобы читать JSON POST '$ json = file_get_contents ('php: // input'); $ obj = json_decode ($ json); ' –

+2

Для меня этот общий ответ [используйте $ json = file_get_contents ('php: // input'); ] Я видел, что не работал, когда JSON отправлялся с внешними «контейнерами» как []. Этот ответ здесь с RAW_POST_DATA сделал трюк для меня. И отлично с моим текущим стеком PHP. Я застрял какое-то время. Большое спасибо за это решение! – gnB

+0

Это все еще довольно актуально для веб-узлов [GitLab] (https://gitlab.com) (например), вам все равно придется использовать '' '$ HTTP_RAW_POST_DATA'''. – developius

9

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

В общем, PHP: // ввод должен быть использован вместо $ HTTP_RAW_POST_DATA.

как в php Manual

+2

Внимание! Эта функция была DEPRECATED в PHP 5.6.0 и удалена с PHP 7.0 +0,0. => http://php.net/manual/en/reserved.variables.httprawpostdata.php – Promo

15

Стоит отметить, что если вы используете 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); 

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

26

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

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

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

0

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

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

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

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

Смежные вопросы