417 Stimmen

Empfangen Sie JSON POST mit PHP

Ich versuche, einen JSON-POST auf einer Zahlungsschnittstellen-Website zu empfangen, aber ich kann ihn nicht decodieren.

Wenn ich drucke :

echo $_POST;

Erhalte ich:

Array

Ich erhalte nichts, wenn ich dies versuche:

if ( $_POST ) {
    foreach ( $_POST as $key => $value ) {
        echo "Schlüssel: ".$key."- Wert:".$value."";
    }
}

Ich erhalte nichts, wenn ich dies versuche:

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

Ich erhalte NULL, wenn ich dies versuche:

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

Wenn ich dies mache:

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

Erhalte ich:

NULL

Das JSON-Format laut Dokumentation der Zahlungsseite ist:

{
   "operacion": {
       "tok": "[generiertes Token]",
       "shop_id": "12313",
       "antwort": "S",
       "antwort_details": "Antwort S",
       "erweiterte_antwort_beschreibung": "erweiterte Antwort",
       "währung": "PYG",
       "betrag": "10100.00",
       "autorisierungsnummer": "123456",
       "ticketnummer": "123456789123456",
       "antwortcode": "00",
       "antwortbeschreibung": "Transaktion genehmigt.",
       "sicherheitsinformation": {
           "kunden_ip": "123.123.123.123",
           "kartentyp": "I",
           "karteland": "Kroatien",
           "version": "0.3",
           "risikoindex": "0"
       }
    }
}

Das Zahlungsseitenprotokoll sagt, dass alles in Ordnung ist. Was ist das Problem?

647voto

Dom Punkte 7105

Versuch es:

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

Anhand deines JSONs und deines Codes sieht es so aus, als hättest du das Wort operation korrekt auf deiner Seite geschrieben, aber es ist nicht im JSON enthalten.

BEARBEITEN

Vielleicht ist es auch einen Versuch wert, den JSON-String von php://input auszugeben.

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

131voto

Steve Chan Punkte 2368

Wenn Sie Ihre Parameter bereits so eingestellt haben, z.B. wie $_POST['eg'], und Sie sie nicht ändern möchten, tun Sie einfach Folgendes:

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

Dies erspart Ihnen die Mühe, alle $_POST zu etwas anderem zu ändern, und ermöglicht es Ihnen immer noch, normale POST-Anfragen zu stellen, wenn Sie diese Zeile entfernen möchten.

67voto

XtraSimplicity Punkte 5136

Es ist erwähnenswert, dass wenn Sie json_decode(file_get_contents("php://input")) verwenden (wie bereits erwähnt), dies fehlschlägt, wenn der String nicht gültiges JSON ist.

Dies lässt sich einfach lösen, indem zunächst überprüft wird, ob das JSON gültig ist. z.B.

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

Bearbeitung: Beachten Sie, dass das Entfernen von strlen($json_params) oben zu subtilen Fehlern führen kann, da sich json_last_error() nicht ändert, wenn null oder ein leerer String übergeben wird, wie hier gezeigt: http://ideone.com/va3u8U

37voto

Urisavka Punkte 551

Verwenden Sie $HTTP_RAW_POST_DATA anstelle von $_POST.

Es liefert Ihnen die POST-Daten so wie sie sind.

Sie können sie später mit json_decode() decodieren.

15voto

gdm Punkte 7271

Lese das Dokument:

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

wie im PHP Handbuch

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X