Estou tentando receber um JSON POST em um site de interface de pagamento, mas não consigo decodificá-lo.
Quando imprimo:
echo $_POST;
Eu recebo:
Array
Não recebo nada quando tento isso:
if ( $_POST ) {
foreach ( $_POST as $key => $value ) {
echo "llave: ".$key."- Valor:".$value."<br />";
}
}
Não recebo nada quando tento isso:
$string = $_POST['operation'];
$var = json_decode($string);
echo $var;
Eu recebo NULL quando tento isso:
$data = json_decode( file_get_contents('php://input') );
var_dump( $data->operation );
Quando eu faço:
$data = json_decode(file_get_contents('php://input'), true);
var_dump($data);
Eu recebo:
NULL
O formato JSON é (de acordo com a documentação do site de pagamento):
{
"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"
}
}
}
O log do site de pagamento diz que está tudo bem. Qual é o problema?
var_dump($_POST)
diz? É uma matriz vazia?json_decode
fazê - lo. Mas talvez o serviço envie dados no corpo da solicitação , isso é uma história diferente e sim,file_get_contents('php://input')
deve funcionar então.Respostas:
Experimentar;
No seu json e no seu código, parece que você digitou a palavra operação corretamente do seu lado, mas não está no json.
EDITAR
Talvez também valha a pena tentar ecoar a string json de php: // input.
fonte
Se você já possui seus parâmetros definidos como $ _POST ['eg'], por exemplo, e não deseja alterá-lo, faça o seguinte:
Isso poupará o trabalho de alterar todos os $ _POST para outra e permitirá que você faça solicitações de postagem normais, se desejar eliminar esta linha.
fonte
Vale ressaltar que se você usar
json_decode(file_get_contents("php://input"))
(como outros já mencionaram), isso falhará se a sequência não for JSON válida.Isso pode ser resolvido simplesmente verificando se o JSON é válido. ie
Edit: Note que a remoção
strlen($json_params)
acima pode resultar em erros sutis, comojson_last_error()
se não mudar quandonull
ou uma cadeia em branco é passado, como mostrado aqui: http://ideone.com/va3u8Ufonte
Use em
$HTTP_RAW_POST_DATA
vez de$_POST
.Ele fornecerá os dados do POST como estão.
Você será capaz de decodificá-lo usando
json_decode()
mais tarde.fonte
$json = file_get_contents('php://input'); $obj = json_decode($json);
$HTTP_RAW_POST_DATA
.Leia o documento:
como no manual do php
fonte
Isso funcionou para mim.
fonte
Gostaria de postar uma resposta que também use curl para obter o conteúdo e mpdf para salvar os resultados em um pdf, para que você obtenha todas as etapas de um caso de uso típico. É apenas um código bruto (para ser adaptado às suas necessidades), mas funciona.
No $ mysrcfile, lerei dados json como este (como indicado nas respostas anteriores):
fonte
file_get_contents('php://input')
.