Я пытаюсь получить сообщение 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"
}
}
}
Журнал сайта оплаты говорит, что все в порядке. В чем проблема?
var_dump($_POST)
говорит? Это пустой массив?json_decode
это сделать. Но, возможно, служба отправляет данные в теле запроса , это другая история, и да, тогдаfile_get_contents('php://input')
должно работать.Ответы:
Пытаться;
Судя по вашему json и вашему коду, похоже, что вы правильно написали слово операция на своем конце, но это не в json.
РЕДАКТИРОВАТЬ
Возможно также стоит попытаться повторить строку json из php: // input.
источник
Если у вас уже есть параметры, например, $ _POST ['eg'], и вы не хотите их изменять, просто сделайте это так:
Это избавит вас от необходимости менять все $ _POST на что-то еще и позволит вам по-прежнему отправлять обычные почтовые запросы, если вы хотите убрать эту строку.
источник
Стоит отметить, что если вы используете
json_decode(file_get_contents("php://input"))
(как уже упоминали другие), это не удастся, если строка не является допустимым JSON.Это может быть просто решено, сначала проверив, действителен ли JSON. т.е.
Изменить: Обратите внимание , что удаление
strlen($json_params)
выше , может привести к тонким ошибкам, так какjson_last_error()
это не изменится , когдаnull
или передается строка пустой, как показано здесь: http://ideone.com/va3u8Uисточник
Используйте
$HTTP_RAW_POST_DATA
вместо$_POST
.Это даст вам данные POST как есть.
Вы сможете расшифровать его, используя
json_decode()
позже.источник
$json = file_get_contents('php://input'); $obj = json_decode($json);
$HTTP_RAW_POST_DATA
.Прочитайте документацию:
как в руководстве по PHP
источник
Это сработало для меня.
источник
Я хотел бы опубликовать ответ, который также использует curl для получения содержимого и mpdf для сохранения результатов в pdf, так что вы получите все шаги типичного варианта использования. Это всего лишь необработанный код (чтобы его можно было адаптировать к вашим потребностям), но он работает.
В $ mysrcfile я буду читать данные json следующим образом (как указано в предыдущих ответах):
источник
file_get_contents('php://input')
.