IT-Swarm.Net

Λήψη JSON POST με PHP

Προσπαθώ να λάβω ένα 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"
       }
    }
}

Το αρχείο καταγραφής πληρωμών λέει ότι όλα είναι εντάξει. Ποιο είναι το πρόβλημα?

241
Pablo Ramirez

Προσπαθήστε;

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

Από το json και τον κώδικα σας, φαίνεται ότι έχετε γράψει το Word operation σωστά στο τέλος σας, αλλά δεν είναι στο json.

ΕΠΕΞΕΡΓΑΣΤΕΊΤΕ

Ίσως αξίζει επίσης να προσπαθήσουμε να επαναλάβουμε τη συμβολοσειρά json από το php: // input.

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

Εάν έχετε ήδη τις παραμέτρους σας όπως $ _POST ['eg'] για παράδειγμα και δεν θέλετε να το αλλάξετε, απλά το κάνετε όπως αυτό:

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

Αυτό θα σας εξοικονομήσει την ταλαιπωρία της αλλαγής όλων των $ _POST σε κάτι άλλο και θα σας επιτρέψει να συνεχίσετε να κάνετε κανονικά αιτήματα μετά την υποβολή αίτησης αν θέλετε να πάρετε αυτή τη γραμμή έξω.

69
Steve Chan

Χρησιμοποιήστε $HTTP_RAW_POST_DATA αντί για $_POST.

Θα σας δώσει δεδομένα POST ως έχει.

Θα μπορείτε να την αποκωδικοποιήσετε χρησιμοποιώντας json_decode() αργότερα.

37
Urisavka

Αξίζει να σημειωθεί ότι αν χρησιμοποιήσετε json_decode(file_get_contents("php://input")) (όπως άλλοι ανέφεραν), αυτό θα αποτύχει αν η συμβολοσειρά είναι όχι έγκυρη JSON.

Αυτό μπορεί απλά να επιλυθεί ελέγχοντας πρώτα εάν το JSON είναι έγκυρο. δηλ.

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

Επεξεργασία: Σημειώστε ότι η κατάργηση του strlen($json_params) παραπάνω μπορεί να έχει ως αποτέλεσμα ελαφρά σφάλματα, καθώς το json_last_error() δεν αλλάζει όταν null ή έχει περάσει κενή συμβολοσειρά, όπως φαίνεται εδώ: http://ideone.com/va3u8

29
XtraSimplicity

Διαβάστε το έγγραφο:

Γενικά, θα πρέπει να χρησιμοποιείται η είσοδος php: // αντί για $ HTTP_RAW_POST_DATA.

όπως στο php Manual

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

Αυτό λειτούργησε για μένα.

8
hyperCoder