PHP के साथ JSON POST प्राप्त करें


292

मैं एक भुगतान इंटरफ़ेस वेबसाइट पर 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"
       }
    }
}

भुगतान साइट लॉग कहता है कि सब कुछ ठीक है। समस्या क्या है?


4
क्या var_dump($_POST)कहता है? क्या यह एक खाली सरणी है?
सेरगुई पाराशिव

3
$ _POST में "और" अलग-अलग पोस्ट अनुरोधों का शब्दकोश है। JSON के लिए $ _POST निश्चित रूप से काम नहीं करेगा। क्या आप file_get_contents ('php: // input') प्रिंट कर सकते हैं? इसके अलावा यह var_dump ($ डेटा-> ऑपरेशन) है; या var_dump ($ data-> operacion); ?
अक्षय शंभोग

4
JSON पाठ है, यह POST में सुलभ क्यों नहीं होगा? जब तक भुगतान सेवा उस पाठ को अपने PHP समापन बिंदु पर पोस्ट करती है, तब तक वह इसके लिए सक्षम होना चाहिए json_decode। लेकिन शायद सेवा अनुरोध शरीर में डेटा भेजती है , यह एक अलग कहानी है और हां, file_get_contents('php://input')तब काम करना चाहिए।
सेरगुई पाराशिव

1
यदि ऐसा है तो यहाँ इस पर चर्चा की गई है: stackoverflow.com/questions/8945879/…
सेर्गी पारशिव

3
$ _POST: अनुरोध में एप्लिकेशन / x-www-form-urlencoded या मल्टीपार्ट / फॉर्म-डेटा के रूप में HTTP POST विधि का उपयोग करते समय चर का एक साहचर्य सरणी HTTP POST विधि के माध्यम से पारित कर दिया आवेदन / जसन का उपयोग करते समय नहीं।
क्रिस्टियन सेपुल्वेडा

जवाबों:


477

प्रयत्न;

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

आपके json और आपके कोड से, ऐसा लगता है कि आपने अपने अंत में शब्द संचालन को सही तरीके से लिखा है , लेकिन यह json में नहीं है।

संपादित करें

शायद यह भी php: // इनपुट से json स्ट्रिंग को प्रतिध्वनित करने की कोशिश कर रहा है।

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

2
नमस्ते दोनों ही मामलों में मुझे स्क्रीन पर कुछ भी नहीं मिला
पाब्लो रामिरेज़

6
जो इसके लायक है, उसके लिए ओपेरा स्पेनिश में स्पेलिंग (उच्चारण देना या लेना) है।
पैट्रिक

11
उनका कहना था कि उन्होंने इसे दोनों जगहों पर सही ढंग से नहीं चलाया, या तो दोनों स्थानों में संचालन या संचालन किया।
msj121

2
PHP 5.6 से पहले, php की सामग्री प्राप्त करना: // इनपुट केवल एक बार किया जा सकता था। क्या आपके कोड या ढांचे ने इसे पहले कहीं खोला है?
aljo f

90

यदि आपके पास पहले से ही अपना पैरामीटर $ _POST ['जैसे'] उदाहरण के लिए सेट है और आप इसे बदलना नहीं चाहते हैं, तो बस इसे पसंद करें:

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

यह आपको सभी $ _POST को किसी और चीज़ में बदलने की परेशानी से बचाएगा और अगर आप इस लाइन को बाहर निकालना चाहते हैं, तो आप अभी भी सामान्य पोस्ट अनुरोध कर सकते हैं।


1
धन्यवाद महोदय। यह मेरे मामले में काम कर रहा है क्योंकि मैं एंड्रॉइड से पीएचपी में जोंस पोस्टिंग कर रहा हूं!
वणराग

धन्यवाद, इसने मेरे मामले में काम किया। मैं $ _POST डेटा को एक $ अनुरोध चर में निर्दिष्ट कर रहा था, अब मैं बस उस चर php की सामग्री को सौंपा: // इनपुट।
फंडर

इसने मेरे दिन को इतना आसान बना दिया। धन्यवाद।
टायलर मैमोन

47

यह इंगित करने योग्य है कि यदि आप उपयोग करते हैं 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/va3u8U


2
यदि कोई इनपुट और / या अनुरोधों की उच्च मात्रा में डेटा की एक बड़ी मात्रा की अपेक्षा कर रहा है, तो वे json_decode के परिणाम के साथ वैकल्पिक रूप से प्रदान किए गए चर संदर्भ को पॉप्युलेट करने के लिए फ़ंक्शन को विस्तारित करना चाह सकते हैं, ताकि पार्स करने की आवश्यकता न हो अच्छी तरह से गठित इनपुट पर दो बार प्रदर्शन किया जाए।
faintsignal

4
इस तरह से, आपने वास्तव में दो बार जसन को डिकोड किया। वो तो महंगा है। पहले डीकोड के साथ, आप तुरंत डिकोड किए गए मान को बचा सकते हैं, उसके बाद चेक करें (json_last_error () == JSON_ERROR_NONE) और फिर प्रोसेसिंग के साथ आगे बढ़ें अगर सब ठीक है [विफल अन्यथा]
काकोमा

@ काकोमा, सबसे निश्चित रूप से! यह मन में सरलता के साथ लिखा गया था। शिक्षा के उद्देश्यों के लिए, सादगी अक्सर दक्षता से अधिक महत्वपूर्ण होती है। :)
XtraSimplicity

1
सच। शिक्षा के प्रयोजनों के लिए। स्पष्टीकरण @XtraSimplicity हा के लिए धन्यवाद, यह अपने नाम में भी :-) है
kakoma

37

के $HTTP_RAW_POST_DATAबजाय का उपयोग करें $_POST

यह आपको POST डेटा देगा जैसा कि है।

आप इसे json_decode()बाद में उपयोग करके डिकोड कर पाएंगे ।


45
चूंकि $ HTTP_RAW_POST_DATA अब मूल्यह्रास हो गया है इसलिए आप JSON POST$json = file_get_contents('php://input'); $obj = json_decode($json);
बिकल बेसनेट

2
मेरे लिए यह सामान्य उत्तर [$ json = file_get_contents ('php: // input') का उपयोग करें; ] मैं देख रहा था कि जब JSON को बाहरी सबसे "कंटेनर वर्ण" के साथ भेजा जा रहा था तो काम नहीं किया था []। यह जवाब यहाँ RAW_POST_DATA ने मेरे लिए किया। और मेरे वर्तमान PHP स्टैक के साथ ठीक है। मैं थोड़ी देर के लिए अटक गया था .. इस समाधान के लिए बहुत बहुत धन्यवाद!
जीन बो

यह अभी भी बहुत चालू है, GitLab webhooks (उदाहरण के लिए) के लिए, आपको अभी भी उपयोग करना है $HTTP_RAW_POST_DATA
developius

मैंने खोजा और एक समाधान खोजा और बिकेल बेसनेट तुम्हारा मेरे लिए काम किया। धन्यवाद!
स्कूटर

इसने मेरे 3 दिनों को
एंगुलर

12

डॉक्टर पढ़ें:

सामान्य तौर पर, php: // इनपुट का उपयोग $ HTTP_RAW_POST_DATA के बजाय किया जाना चाहिए।

में के रूप में php मैनुअल


4
चेतावनी इस सुविधा को PHP 5.6.0 में हटा दिया गया था, और PHP 7.0.0 के रूप में बनाया गया था। => php.net/manual/en/reserved.variables.httprawpostdata.php
प्रोमो

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

इसने मेरे लिए काम किया।


-5

मैं एक उत्तर पोस्ट करना चाहता हूं जो सामग्री प्राप्त करने के लिए कर्ल का उपयोग करता है, और परिणाम को पीडीएफ में सहेजने के लिए mpdf है, इसलिए आपको एक टिपिकल उपयोग मामले के सभी चरण मिलते हैं। यह केवल कच्चा कोड है (इसलिए अपनी आवश्यकताओं के अनुकूल होने के लिए), लेकिन यह काम करता है।

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

$ Mysrcfile में मैं इस तरह से json डेटा पढ़ूंगा (जैसा कि पिछले उत्तरों पर बताया गया है):

$data = json_decode(file_get_contents('php://input'));
// (then process it and build the page source)

1
बहुत बेकार जानकारी .. पहला कोड क्या करता है? दूसरा स्निपेट उत्तर है जो ..
फ़िप्सी

@ फ़िप्सी, (और सभी डाउनवोटर्स के लिए) मेरा जवाब केवल, और काफी स्पष्ट रूप से, दूसरों का एक संकलन है। और, जैसा कि मैंने लिखा है, एक उपयोग मामला (mpdf)। लेखन के समय, मैं इस तरह से एक उत्तर देखने के लिए प्यार करता था, जब मैं यह पता लगाने की कोशिश कर रहा था कि कैसे। और मेरा दूसरा स्निपेट निश्चित रूप से उत्तर नहीं है, क्योंकि json डेटा प्राप्त करने के लिए, डेटा को भी ठीक से भेजा जाना है, और न केवल भेजने के लिए और अधिक तरीके हैं, बल्कि अक्सर रास्ता, वास्तव में वास्तविक समस्या है। इस मामले में, ध्यान json_decode नहीं है, इसके बजाय यह है कि कैसे ठीक से कुछ प्राप्त किया जाए file_get_contents('php://input')
लुका रेजेलिन

2
मैंने हार नहीं मानी और मुझे आपका इरादा समझ में आया .. लेकिन सवाल यह है कि 'जॉन्सन प्राप्त करें' और 'भेजें जोंसें' नहीं। यह इस सवाल से बहुत स्पष्ट है कि ओपी के पास मुद्दे हैं और वास्तव में भेजने में कोई दिलचस्पी नहीं है
फ़िप्सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.