Empfangen Sie JSON POST mit PHP

Lesezeit: 7 Minuten

Empfangen Sie JSON POST mit PHP
Pablo Ramírez

Ich versuche, einen JSON-POST auf einer Zahlungsschnittstellen-Website zu erhalten, aber ich kann ihn nicht entschlüsseln.

Wenn ich drucke:

echo $_POST;

Ich bekomme:

Array

Ich bekomme nichts, wenn ich das versuche:

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

Ich bekomme nichts, wenn ich das versuche:

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

Ich bekomme NULL, wenn ich das versuche:

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

Wenn ich das mache:

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

Ich bekomme:

NULL

Das JSON-Format ist (laut Dokumentation der Zahlungsseite):

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

Das Protokoll der Zahlungsseite sagt, dass alles in Ordnung ist. Was ist das Problem?

  • Was macht var_dump($_POST) sagen? Ist es ein leeres Array?

    – Sergiu Paraschiw

    18. September 2013 um 7:51 Uhr

  • $_POST hat das Wörterbuch von “&” getrennten Post-Requests. $_POST für json wird DEFINITIV nicht funktionieren. Können Sie file_get_contents(‘php://input’) drucken? Auch ist es var_dump($data->operation); oder var_dump($data->operation); ?

    – Akshaya Shanbhogue

    18. September 2013 um 7:53 Uhr


  • JSON ist Text, warum sollte es in POST nicht zugänglich sein? Solange der Zahlungsdienst diesen Text an seinen PHP-Endpunkt sendet, sollte er dazu in der Lage sein json_decode es. Aber vielleicht sendet der Dienst Daten rein Anforderungstextdas ist eine andere Geschichte und ja, file_get_contents('php://input') sollte dann funktionieren.

    – Sergiu Paraschiw

    18. September 2013 um 8:03 Uhr

  • Wenn ja, dann wurde dies hier diskutiert: stackoverflow.com/questions/8945879/…

    – Sergiu Paraschiw

    18. September 2013 um 8:04 Uhr

  • $_POST: Ein assoziatives Array von Variablen, die über die HTTP POST-Methode an das aktuelle Skript übergeben werden bei Verwendung von application/x-www-form-urlencoded oder multipart/form-data als HTTP Content-Type in der Anfrage. Nicht bei Verwendung von application/json.

    – Cristian Sepulveda

    17. Mai 2018 um 16:39 Uhr

Versuchen;

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

Aus Ihrem JSON und Ihrem Code sieht es so aus, als hätten Sie das Wort buchstabiert Operation korrekt an Ihrem Ende, aber es ist nicht im json.

BEARBEITEN

Vielleicht lohnt es sich auch, den json-String von php://input zu echoen.

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

  • Hallo In beiden Fällen bekomme ich nichts auf dem Bildschirm

    – Pablo Ramírez

    18. September 2013 um 9:00 Uhr

  • Für das, was es wert ist, ist operacion die Schreibweise (geben oder nehmen Sie einen Akzent) auf Spanisch.

    – Patrick

    1. Oktober 2013 um 7:44 Uhr

  • Sein Punkt war, dass er es an beiden Stellen nicht richtig geschrieben hat, entweder operacion oder operation an beiden Stellen.

    – msj121

    12. Dezember 2013 um 4:39 Uhr

  • Vor PHP 5.6 konnte der Inhalt von php://input nur einmal abgerufen werden. Könnte Ihr Code oder Framework es schon einmal irgendwo geöffnet haben?

    – Aljo f

    17. Februar 2015 um 23:45 Uhr

  • Achten Sie darauf, keine einfachen Anführungszeichen für JSON-Daten zu verwenden

    – Sonnenuhr

    3. Februar 2021 um 19:46 Uhr


Empfangen Sie JSON POST mit PHP
Steve Chan

Wenn Sie Ihre Parameter bereits wie $_POST[‘eg’] zum Beispiel und Sie möchten es nicht ändern, machen Sie es einfach so:

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

Dies erspart Ihnen die Mühe, alle $_POST in etwas anderes zu ändern, und ermöglicht es Ihnen, weiterhin normale Post-Anforderungen zu stellen, wenn Sie diese Zeile entfernen möchten.

  • Danke mein Herr. Dies hat in meinem Fall funktioniert, da ich JSON-Postings von Android nach PHP mache!

    – vanurag

    21. März 2018 um 11:51 Uhr

  • Danke, in meinem Fall hat es funktioniert. Ich habe die $_POST-Daten einer $request-Variablen zugewiesen, jetzt habe ich dieser Variablen einfach den Inhalt von php://input zugewiesen.

    – Geldgeber7

    7. August 2019 um 12:55 Uhr

  • Das hat meinen Tag so viel einfacher gemacht. Danke.

    – Tyler Mammone

    25. April 2020 um 22:10 Uhr

  • Hallo, ich habe so etwas in PHP $sql = "INSERT INTO userdetails (email, username) VALUES ('".$_POST['email']."', '".$_POST['username']."')"; if (mysqli_query($conn,$sql)) { $data = array("data" => "You Data added successfully"); echo json_encode($data); . Wie kann ich den Code hier ändern, damit ich json übergeben und in phpmysql-Datenbankfelder schieben kann?

    – NoobCoder

    8. Juli 2021 um 13:02 Uhr

Empfangen Sie JSON POST mit PHP
XtraEinfachheit

Es ist erwähnenswert, dass, wenn Sie verwenden json_decode(file_get_contents("php://input")) (wie andere erwähnt haben), wird dies fehlschlagen, wenn die Zeichenfolge ist nicht gültiges JSON.

Dies kann einfach gelöst werden, indem zuerst überprüft wird, ob der JSON gültig ist. dh

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

Bearbeiten: Beachten Sie das Entfernen strlen($json_params) oben kann zu subtilen Fehlern führen, wie z json_last_error() tut nicht wann ändern null oder es wird eine leere Zeichenfolge übergeben, wie hier gezeigt:
http://ideone.com/va3u8U

  • Wenn jemand eine ziemlich große Datenmenge in der Eingabe und/oder ein hohes Volumen an Anfragen erwartet, möchte er die Funktion möglicherweise erweitern, um optional eine bereitgestellte Variablenreferenz mit dem Ergebnis von json_decode zu füllen, sodass das Parsing dies nicht tun muss bei wohlgeformter Eingabe zweimal ausgeführt werden.

    – schwaches Signal

    2. Februar 2019 um 1:23 Uhr

  • Auf diese Weise decodieren Sie den JSON tatsächlich zweimal. Das ist teuer. Bei der ersten Decodierung können Sie den decodierten Wert sofort speichern, diese Überprüfung anschließend durchführen (json_last_error() == JSON_ERROR_NONE) und dann mit der Verarbeitung fortfahren, wenn alles in Ordnung ist [fail otherwise]

    – Kakoma

    26. März 2019 um 17:12 Uhr

  • @kakoma, auf jeden Fall! Dies wurde mit Einfachheit im Verstand geschrieben. Für Bildungszwecke ist Einfachheit oft wichtiger als Effizienz. 🙂

    – XtraEinfachheit

    27. März 2019 um 8:35 Uhr

  • Wahr. Für Bildungszwecke. Danke für die Klarstellung @XtraSimplicity Ha, es ist sogar in deinem Namen 🙂

    – Kakoma

    27. März 2019 um 8:51 Uhr


1647083049 616 Empfangen Sie JSON POST mit PHP
Urisavka

Verwenden $HTTP_RAW_POST_DATA anstatt $_POST.

Es gibt Ihnen POST-Daten wie sie sind.

Sie können es mit entschlüsseln json_decode() später.

Lesen Sie das Dokument:

Im Allgemeinen sollte php://input anstelle von $HTTP_RAW_POST_DATA verwendet werden.

wie im php-Handbuch

  • Warnung Diese Funktion wurde in PHP 5.6.0 VERWORFEN und ab PHP 7.0.0 ENTFERNT. => php.net/manual/en/reserved.variables.httprawpostdata.php

    – Aktion

    28. Dezember 2016 um 9:13 Uhr


  • Und die Verbindung ist jetzt unterbrochen

    – RiggsFolly

    4. Januar 2021 um 13:06 Uhr

  • Im Fall von POST-Anforderungen ist es vorzuziehen, php://input anstelle von $HTTP_RAW_POST_DATA zu verwenden, da dies nicht von speziellen php.ini-Anweisungen abhängt. Darüber hinaus ist es für die Fälle, in denen $HTTP_RAW_POST_DATA standardmäßig nicht gefüllt ist, eine potenziell weniger speicherintensive Alternative zur Aktivierung von always_populate_raw_post_data. php://input ist mit enctype=”multipart/form-data” nicht verfügbar.

    – GabrieleMartini

    3. April 2021 um 15:10 Uhr

1647083049 38 Empfangen Sie JSON POST mit PHP
hyperCoder

$data = file_get_contents('php://input');
echo $data;

Das hat bei mir funktioniert.

  • Warnung Diese Funktion wurde in PHP 5.6.0 VERWORFEN und ab PHP 7.0.0 ENTFERNT. => php.net/manual/en/reserved.variables.httprawpostdata.php

    – Aktion

    28. Dezember 2016 um 9:13 Uhr


  • Und die Verbindung ist jetzt unterbrochen

    – RiggsFolly

    4. Januar 2021 um 13:06 Uhr

  • Im Fall von POST-Anforderungen ist es vorzuziehen, php://input anstelle von $HTTP_RAW_POST_DATA zu verwenden, da dies nicht von speziellen php.ini-Anweisungen abhängt. Darüber hinaus ist es für die Fälle, in denen $HTTP_RAW_POST_DATA standardmäßig nicht gefüllt ist, eine potenziell weniger speicherintensive Alternative zur Aktivierung von always_populate_raw_post_data. php://input ist mit enctype=”multipart/form-data” nicht verfügbar.

    – GabrieleMartini

    3. April 2021 um 15:10 Uhr

Ziemlich spät.
Es scheint, dass (OP) bereits alle ihm gegebenen Antworten ausprobiert hatte.
Wenn Sie (OP) dennoch nicht erhalten, was an die „.PHP“-Datei übergeben wurde, könnte der Fehler eine falsche URL sein.
Prüfen Sie, ob Sie die richtige „.PHP“-Datei aufrufen.
(Rechtschreibfehler oder Großbuchstabe in URL)
und am wichtigsten
Überprüfen Sie, ob Ihre URL ein “s” (secure) nach “http” hat.
Beispiel:

"http://yourdomain.com/read_result.php"

sollte sein

"https://yourdomain.com/read_result.php"

oder so oder so.
fügen Sie das “s” hinzu oder entfernen Sie es, um es Ihrer URL anzupassen.

993450cookie-checkEmpfangen Sie JSON POST mit PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy