8 Domanda: Ricevi JSON POST con PHP

domanda creata a Tue, Dec 20, 2016 12:00 AM

Sto provando a ricevere un post di JSON su un sito Web di interfaccia di pagamento, ma non riesco a decodificarlo.

Quando stampo:

 
echo $_POST;

Ottengo:

 
Array

Non ottengo nulla quando provo questo:

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

Non ottengo nulla quando provo questo:

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

Ottengo NULL quando provo questo:

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

Quando lo faccio:

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

Ottengo:

 
NULL

Il formato JSON è (secondo la documentazione del sito di 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"
       }
    }
}

Il log del sito di pagamento dice che tutto è OK. Qual è il problema?

    
244
  1. Che cosa dice var_dump($_POST)? È un array vuoto?
    2013-09-18 07: 51: 16Z
  2. $_ POST ha il dizionario di "&" richieste post separate. $_POST per JSON NON FUNZIONERÀ SICURAMENTE. Puoi stampare file_get_contents ('php: //input')? Inoltre è var_dump (operazione $data- >); o var_dump ($data- > operacion); ?
    2013-09-18 07: 53: 38Z
  3. JSON è testo, perché non dovrebbe essere accessibile in POST? Finché i POST di servizi di pagamento che inviano messaggi al proprio endpoint PHP, dovrebbero essere in grado di farlo json_decode. Ma forse il servizio invia i dati nel corpo della richiesta ​​i>, questa è una storia diversa e sì, il file_get_contents('php://input') dovrebbe funzionare allora.
    2013-09-18 08: 03: 51Z
  4. Se è così, questo è stato discusso qui: stackoverflow.com/questions/8945879/...
    2013-09-18 08: 04: 39Z
  5. $_ POST: Un array associativo di variabili passato allo script corrente tramite il metodo HTTP POST quando si utilizza application /x-www -form-urlencoded o multipart /form-data come HTTP Content-Type nella richiesta. Non quando si utilizza application /json.
    2018-05-17 16: 39: 00Z
8 risposte                              8                         

Prova;

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

Dal tuo json e dal tuo codice, sembra che tu abbia scritto correttamente la parola operation , ma non è in the json.

Modifica

Forse vale anche la pena provare ad echo la stringa json da php: //input.

 
echo file_get_contents('php://input');
    
426
2013-09-18 08: 30: 28Z
  1. Ciao In entrambi i casi non ottengo niente sullo schermo
    2013-09-18 09: 00: 23Z
  2. Per quello che vale, l'operazione è l'ortografia (dare o prendere un accento) in spagnolo.
    2013-10-01 07: 44: 26Z
  3. Il suo punto era che non lo ha scritto correttamente in entrambi i posti, o operacion o operazione in entrambi i punti.
    2013-12-12 04: 39: 42Z
  4. Prima di PHP 5.6, ottenere il contenuto di php: //input poteva essere fatto solo una volta. Il tuo codice o la struttura potrebbero averlo aperto da qualche parte prima?
    2015-02-17 23: 45: 19Z
  5. operacion è corretto, operation non lo è.
    2017-09-22 19: 01: 16Z

Se hai già impostato i parametri come $_POST ['eg'] per esempio e non vuoi cambiarlo, semplicementefai come questo:

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

Questo ti farà risparmiare il fastidio di cambiare tutto $_POST in qualcos'altro e permetterti di fare ancora normali richieste di posta se desideri prendere questa linea.

    
70
2017-02-24 01: 57: 26Z
  1. Grazie signore. Questo ha funzionato nel mio caso mentre sto facendo postare json da Android a PHP!
    2018-03-21 11: 51: 14Z

Utilizza $HTTP_RAW_POST_DATA anziché $_POST.

Ti fornirà dati POST così come sono.

Sarai in grado di decodificarlo usando json_decode() in seguito.

    
38
2014-06-13 20: 52: 54Z
  1. Poiché $HTTP_RAW_POST_DATA è ammortizzato ora puoi usare in questo modo per leggere JSON POST $json = file_get_contents('php://input'); $obj = json_decode($json);
    2014-09-14 07: 31: 19Z
  2. Per me questa risposta comune [usa $json = file_get_contents ('php: //input'); ] Stavo vedendo non ha funzionato quando il JSON veniva inviato con la maggior parte dei "container char" come []. Questa risposta qui con RAW_POST_DATA ha fatto il trucco per me. E va bene con il mio attuale stack PHP. Sono rimasto bloccato per un po '... grazie mille per questa soluzione!
    2015-03-18 21: 21: 11Z
  3. Questo è ancora abbastanza attuale, per GitLab webhooks (per esempio), devi ancora usare $HTTP_RAW_POST_DATA.
    2016-10-02 10: 11: 48Z
  4. Thanx molto uomo ... ha funzionato come un incantesimo
    2017-02-25 11: 36: 55Z
  5. Ho cercato e cercato una soluzione e Bikel Basnet ha funzionato per me. Grazie!
    2017-03-01 00: 41: 42Z

Vale la pena ricordare che se usi json_decode(file_get_contents("php://input")) (come altri hanno già detto), questo fallirà se la stringa è non JSON valido.

Questo può essere semplicemente risolto verificando prima se il JSON è valido. cioè.

 
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);

Modifica: tieni presente che la rimozione di strlen($json_params) sopra può causare errori impercettibili, poiché json_last_error() cambia non quando viene passato il null o una stringa vuota, come mostrato qui: http://ideone.com/va3u8U

    
31
2018-11-18 05: 53: 06Z
  1. Se qualcuno si aspetta una quantità piuttosto grande di dati nell'input e /o un volume elevato di richieste, potrebbe voler estendere la funzione per compilare facoltativamente una variabile fornita riferimento con il risultato di json_decode, in modo che l'analisi non debba essere eseguita due volte su un input ben formato.
    2019-02-02 01: 23: 22Z
  2. Fatto in questo modo, decodificare effettivamente il JSON due volte. È caro. Con la prima decodifica, è possibile salvare immediatamente il valore decodificato, eseguire tale controllo in seguito (json_last_error () == JSON_ERROR_NONE) e quindi procedere con l'elaborazione se tutto va bene [fail altrimenti]
    2019-03-26 17: 12: 37Z
  3. @ kakoma, sicuramente! Questo è stato scritto con semplicità in mente. Ai fini dell'istruzione, la semplicità è spesso più importante dell'efficienza. :)
    2019-03-27 08: 35: 16Z
  4. Vero. Per scopi educativi. Grazie per il clarification @XtraSimplicity Ha, è anche nel tuo nome: -)
    2019-03-27 08: 51: 46Z

Leggi il documento:

  

In generale, è necessario utilizzare php: //input invece di $HTTP_RAW_POST_DATA.

come nel manuale php

    
11
2016-05-02 12: 55: 56Z
  1. Attenzione Questa funzione è stata DEPRECATED in PHP 5.6.0 e REMOVED a partire da PHP 7.0.0. = &Gt; php.net/manual/en/reserved.variables.httprawpostdata.php
    2016-12-28 09: 13: 06Z
 
$data = file_get_contents('php://input');
echo $data;

Questo ha funzionato per me.

    
8
2018-06-17 20: 04: 19Z

L'utilizzo di php: //input può aiutare, ma non ha funzionato per me, ecco cosa ha fatto:

  • controlla la codifica dei dati. Se è URLEncoded, assicurati che sia inviato URLEncoded.

  • controlla che le virgolette non siano state sfuggite a causa del flag delle virgolette magiche.

Se questi due controlli non risolvono il tuo problema, per scoprire come sono i dati, devi prima echo o print_r i tuoi dati, e poi dopo, la decodifica, per scoprire come i dati vengono ricevuti ed elaborati .

    
- 1
2017-01-04 19: 12: 01Z

Vorrei pubblicare una risposta che usi anche arricciatura per ottenere i contenuti, e mpdf per salvare i risultati in un pdf, in modo da ottenere tutti i passaggi di un caso d'uso tipico. È solo codice raw (quindi adattato alle tue esigenze), ma funziona.

 
// import mpdf somewhere
require_once dirname(__FILE__) . '/mpdf/vendor/autoload.php';

// get mpdf instance
$mpdf = new \Mpdf\Mpdf();

// src php file
$mysrcfile = 'http://www.somesite.com/somedir/mysrcfile.php';
// where we want to save the pdf
$mydestination = 'http://www.somesite.com/somedir/mypdffile.pdf';

// encode $_POST data to json
$json = json_encode($_POST);

// init curl > pass the url of the php file we want to pass 
// data to and then print out to pdf
$ch = curl_init($mysrcfile);

// tell not to echo the results
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1 );

// set the proper headers
curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($json) ]);

// pass the json data to $mysrcfile
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);

// exec curl and save results
$html = curl_exec($ch);

curl_close($ch);

// parse html and then save to a pdf file
$mpdf->WriteHTML($html);
$this->mpdf->Output($mydestination, \Mpdf\Output\Destination::FILE);

In $mysrcfile leggerò dati json come questo (come indicato nelle risposte precedenti):

 
$data = json_decode(file_get_contents('php://input'));
// (then process it and build the page source)
    
- 2
2018-07-31 09: 28: 05Z
fonte posta Qui
Altre domande