<p>προσπαθώ να λάβω ένα json post σε μια τοποθεσία διεπαφής πληρωμής, αλλά δεν μπορώ να την αποκωδικοποιήσω.</p><p>όταν εκτυπώνω:</p><pre><code>echo $\_post; </code></pre><p>παίρνω:</p><pre><code>array </code></pre><p>δεν παίρνω τίποτα όταν το δοκιμάζω αυτό:</p><pre><code>if ( $\_post ) { foreach ( $\_post as $key =&gt; $value ) { echo "llave: ".$key."- valor:".$value."&lt;br /&gt;"; } } </code></pre><p>δεν παίρνω τίποτα όταν το δοκιμάζω αυτό:</p><pre><code>$string = $\_post['operation']; $var = json\_decode($string); echo $var; </code></pre><p>παίρνω null όταν δοκιμάζω αυτό:</p><pre><code>$data = json\_decode( file\_get\_contents('php://input') ); var\_dump( $data-&gt;operation ); </code></pre><p>οταν κάνω:</p><pre><code>$data = json\_decode(file\_get\_contents('php://input'), true); var\_dump($data); </code></pre><p>παίρνω:</p><pre><code>null </code></pre><p>η μορφή json είναι (σύμφωνα με την τεκμηρίωση της τοποθεσίας πληρωμής):</p><pre><code>{ "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" } } } </code></pre><p>το αρχείο καταγραφής πληρωμών λέει ότι όλα είναι εντάξει. ποιο είναι το πρόβλημα?</p>
λήψη json post με php
<p>προσπαθήστε;</p><pre><code>$data = json\_decode(file\_get\_contents('php://input'), true); print\_r($data); echo $data["operacion"]; </code></pre><p>από το json και τον κώδικα σας, φαίνεται ότι έχετε γράψει το word <strong>operation</strong> σωστά στο τέλος σας, αλλά δεν είναι στο json.</p><p><strong>επεξεργαστείτε</strong></p><p>ίσως αξίζει επίσης να προσπαθήσουμε να επαναλάβουμε τη συμβολοσειρά json από το php: // input.</p><pre><code>echo file\_get\_contents('php://input'); </code></pre>
<p>εάν έχετε ήδη τις παραμέτρους σας όπως $ \_post ['eg'] για παράδειγμα και δεν θέλετε να το αλλάξετε, απλά το κάνετε όπως αυτό:</p><pre><code>$\_post = json\_decode(file\_get\_contents('php://input'), true); </code></pre><p>αυτό θα σας εξοικονομήσει την ταλαιπωρία της αλλαγής όλων των $ \_post σε κάτι άλλο και θα σας επιτρέψει να συνεχίσετε να κάνετε κανονικά αιτήματα μετά την υποβολή αίτησης αν θέλετε να πάρετε αυτή τη γραμμή έξω.</p>
<p>χρησιμοποιήστε <code>$http\_raw\_post\_data</code> αντί για <code>$\_post</code>.</p><p>θα σας δώσει δεδομένα post ως έχει.</p><p>θα μπορείτε να την αποκωδικοποιήσετε χρησιμοποιώντας <code>json\_decode()</code> αργότερα.</p>
<p>αξίζει να σημειωθεί ότι αν χρησιμοποιήσετε <code>json\_decode(file\_get\_contents("php://input"))</code> (όπως άλλοι ανέφεραν), αυτό θα αποτύχει αν η συμβολοσειρά είναι <em> όχι </em> έγκυρη json.</p><p>αυτό μπορεί απλά να επιλυθεί ελέγχοντας πρώτα εάν το json είναι έγκυρο. δηλ.</p><pre><code>function isvalidjson($str) { json\_decode($str); return json\_last\_error() == json\_error\_none; } $json\_params = file\_get\_contents("php://input"); if (strlen($json\_params) &gt; 0 &amp;&amp; isvalidjson($json\_params)) $decoded\_params = json\_decode($json\_params); </code></pre><p><strong>επεξεργασία:</strong> σημειώστε ότι η κατάργηση του <code>strlen($json\_params)</code> παραπάνω μπορεί να έχει ως αποτέλεσμα ελαφρά σφάλματα, καθώς το <code>json\_last\_error()</code> <em> δεν </em> αλλάζει όταν <code>null</code> ή έχει περάσει κενή συμβολοσειρά, όπως φαίνεται εδώ: <a href="http://ideone.com/va3u8u">http://ideone.com/va3u8</a> </p>
<p>διαβάστε το έγγραφο:</p><blockquote> <p>γενικά, θα πρέπει να χρησιμοποιείται η είσοδος php: // αντί για $ http\_raw\_post\_data.</p> </blockquote><p>όπως στο <a href="http://php.net/manual/en/reserved.variables.httprawpostdata.php">php manual</a> </p>
<pre><code>$data = file\_get\_contents('php://input'); echo $data; </code></pre><p>αυτό λειτούργησε για μένα.</p>