পিএইচপি দিয়ে জেএসন পোস্ট পান


291

আমি একটি পেমেন্ট ইন্টারফেস ওয়েবসাইটে JSON পোস্ট পাওয়ার চেষ্টা করছি, তবে আমি এটি ডিকোড করতে পারি না।

যখন আমি মুদ্রণ:

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;

আমি যখন চেষ্টা করি তখন আমি নুল পাই:

$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
_P _POST এর "&" পৃথক পোস্ট অনুরোধগুলির অভিধান রয়েছে। জসনের জন্য _P _POST অবশ্যই কাজ করবে না। আপনি কি ফাইল_জেট_কন্টেন্টস ('পিএইচপি: // ইনপুট') মুদ্রণ করতে পারবেন? এটিও কি var_dump ($ ডেটা-> অপারেশন); বা var_dump ($ ডেটা-> অপারেশন); ?
অক্ষয় শানভোগ

4
জেএসএন পাঠ্য, কেন এটি পোস্টে অ্যাক্সেসযোগ্য হবে না? যতক্ষণ পেমেন্ট সার্ভিস তার পিএইচপি শেষ পয়েন্টে সেই লেখাটি পোস্ট করে ততক্ষণ সে এতে সক্ষম হতে json_decodeহবে। তবে সম্ভবত পরিষেবাটি অনুরোধের বৌটিতে ডেটা প্রেরণ করে , এটি একটি ভিন্ন গল্প এবং হ্যাঁ, file_get_contents('php://input')তখন কাজ করা উচিত।
সের্গিউ প্যারাসিভিভ

1
যদি তা হয় তবে এখানে এখানে আলোচনা করা হয়েছে: স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি

3
_P _POST: অ্যাপ্লিকেশন / x-www-form-urlencoded বা মাল্টিপার্ট / ফর্ম-ডেটা অনুরোধে HTTP সামগ্রী-প্রকার হিসাবে ব্যবহার করার সময় HTTP POST পদ্ধতির মাধ্যমে চলতি স্ক্রিপ্টটিতে একটি চলকগুলির একটি সহযোগী অ্যারে অ্যাপ্লিকেশন / জেসন ব্যবহার করার সময় নয়।
ক্রিশ্চিয়ান সেপলভেদ

উত্তর:


476

চেষ্টা করুন

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

আপনার জাসন এবং আপনার কোড থেকে দেখে মনে হচ্ছে আপনি আপনার শেষের দিকে শব্দ অপারেশনটি সঠিকভাবে বানান করেছেন তবে এটি জসন-এ নেই।

সম্পাদনা

হতে পারে পিএইচপি: // ইনপুট থেকে জেসন স্ট্রিং প্রতিধ্বনি করার চেষ্টা করাও মূল্যবান।

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

2
হাই উভয় ক্ষেত্রেই আমি পর্দায় কিছুই পাই না
পাবলো রামিরেজ

6
এটির জন্য মূল্যবান, অপারেশন হ'ল স্প্যানিশ ভাষায় বানান (একটি উচ্চারণ দিন বা নিন)।
প্যাট্রিক

11
তার বক্তব্যটি হ'ল তিনি উভয় জায়গায় এটি সঠিকভাবে বানান করেননি, হয় উভয় দাগেই অপারেশন বা অপারেশন।
msj121

2
পিএইচপি 5.6 এর পূর্বে, পিএইচপি: // ইনপুটগুলির বিষয়বস্তুগুলি পাওয়া মাত্র একবার করা যেতে পারে। আপনার কোড বা কাঠামো এটিকে আগে কোথাও খুলতে পারে?
aljo f

89

যদি আপনি ইতিমধ্যে উদাহরণস্বরূপ আপনার পরামিতিগুলি $ _POST ['উদাহরণস্বরূপ'] এর মতো সেট করে রেখেছেন এবং আপনি এটি পরিবর্তন করতে চান না, কেবল এটির মতো করুন:

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

এটি আপনাকে সমস্ত _PLST কে অন্য কোনও কিছুতে পরিবর্তন করার ঝামেলা বাঁচাবে এবং আপনি যদি এই লাইনটি বের করতে চান তবে আপনাকে এখনও সাধারণ পোস্ট অনুরোধ করতে অনুমতি দেবে।


1
ধন্যবাদ জনাব. আমি যেমন অ্যান্ড্রয়েড থেকে পিএইচপি তে জসন পোস্টিং করছি তখন এটি আমার ক্ষেত্রে কাজ করেছিল!
ভানুরগ

আপনাকে ধন্যবাদ, এটি আমার ক্ষেত্রে কার্যকর হয়েছে। আমি একটি $ অনুরোধ ভেরিয়েবলের জন্য $ _POST ডেটা বরাদ্দ করছিলাম, এখন আমি কেবলমাত্র সেই পরিবর্তনশীলটিকে পিএইচপি: // ইনপুট এর বিষয়বস্তু হিসাবে নিয়োগ করেছি।
অনুদানকারী

এটি আমার দিনটিকে এত সহজ করে তুলেছে। ধন্যবাদ।
টাইলার মামন

46

এটি উল্লেখ করার মতো যে আপনি যদি ব্যবহার করেন json_decode(file_get_contents("php://input"))(যেমন অন্যরা উল্লেখ করেছেন), স্ট্রিংটি বৈধ 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 এর ফলাফলের সাথে প্রদত্ত পরিবর্তনশীল রেফারেন্সটি বিকল্পভাবে প্রসারিত করতে ফাংশনটি প্রসারিত করতে চাইতে পারে, যাতে পার্সিংয়ের প্রয়োজন হয় না সুগঠিত ইনপুটটিতে দু'বার সম্পাদন করা হবে।
অবাস্তব

4
এইভাবে সম্পন্ন, আপনি জসনকে দু'বার ডিকোড করেছেন। ঐটা ব্যয়বহুল. প্রথম ডিকোডের সাহায্যে আপনি তাত্ক্ষণিকভাবে ডিকোডড মানটি সংরক্ষণ করতে পারেন, পরে এটি পরীক্ষা করুন (json_last_error () == JSON_ERROR_NONE) এবং তারপরে সমস্ত কিছু ঠিকঠাক থাকলে প্রক্রিয়াটি চালিয়ে যান [অন্যথায় ব্যর্থ হন]
কাকোমা ২ ''

@ কাকোমা, অবশ্যই! এটি সরলতার কথা মাথায় রেখেই লেখা হয়েছিল। শিক্ষার উদ্দেশ্যে, দক্ষতার চেয়ে সরলতা প্রায়শই গুরুত্বপূর্ণ। :)
এক্সট্রাস্পিলিটি

1
সত্য। শিক্ষার উদ্দেশ্যে। @ এক্সট্রাস্পিলিকালিটি হা এর স্পষ্টতার জন্য ধন্যবাদ, এটি আপনার নামেও রয়েছে :-)
কাকোমা ২

37

$HTTP_RAW_POST_DATAপরিবর্তে ব্যবহার করুন$_POST

এটি আপনাকে যেমন পোষ্ট ডেটা দেবে।

আপনি json_decode()পরে এটি ব্যবহার করে ডিকোড করতে সক্ষম হবেন ।


45
যেহেতু $ এইচটিটিপি_আরডব্লু_এসপিএডিএটি হ্রাস করা হয়েছে আপনি এখন জেএসএন পোস্ট পড়তে এই পদ্ধতিতে ব্যবহার করতে পারেন$json = file_get_contents('php://input'); $obj = json_decode($json);
বিকাশ বাসনেট

2
আমার জন্য এই সাধারণ উত্তর [ব্যবহার করুন $ json = file_get_contents ('পিএইচপি: // ইনপুট'); ] আমি যখন জেএসওএনকে বহিরাগত বেশিরভাগ "কন্টেইনার চর" সহ প্রেরণ করা হচ্ছিল তখন দেখছি না। এই উত্তরটি এখানে RAW_POST_DATA সহ আমার জন্য কৌশলটি করেছে। এবং আমার বর্তমান পিএইচপি স্ট্যাকের সাথে ঠিক আছে। আমি কিছুক্ষণ আটকে গেলাম .. এই সমাধানের জন্য অনেক ধন্যবাদ!
জিন বো বো 21

এই এখনও বেশ বর্তমান, জন্য GitLab webhooks (উদাহরণস্বরূপ), আপনি কি এখনও ব্যবহার করতে হবে $HTTP_RAW_POST_DATA
বিকাশ

আমি একটি সমাধান অনুসন্ধান করেছি এবং সন্ধান করেছি এবং বাইকেল বাসনেট আপনারা আমার পক্ষে কাজ করেছেন। ধন্যবাদ!
স্কুটার

এটি আমার 3 দিন সংরক্ষণ করেছে কৌণিক 2 এর এইচটিপিপিলেয়েন্ট থেকে পোষ্ট ভেরিয়েবলগুলি ধরার উপায়গুলি খুঁজছেন বিষয়বস্তুর প্রকারের সাথে একটি অনুরোধ প্রেরণ: অ্যাপ্লিকেশন /
জেসন

12

ডকটি পড়ুন:

সাধারণভাবে, php: // ইনপুটটি $ HTTP_RAW_POST_DATA এর পরিবর্তে ব্যবহার করা উচিত।

হিসেবে পিএইচপি ম্যানুয়াল


4
সতর্কতা এই বৈশিষ্ট্যটি পিএইচপি ৫..6.০ এ অপসারণ করা হয়েছিল এবং পিএইচপি 7.০.০ অনুযায়ী অপসারণ করা হয়েছিল। => php.net/manual/en/remitted.variables.httprawpostdata.php
প্রচার 23

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

এটি আমার পক্ষে কাজ করেছে।


-5

আমি কোন উত্তর যে কার্ল ব্যবহার বিষয়বস্তু পেতে পোষ্ট করতে চান, এবং mpdf , একটি পিডিএফ ফলাফল সংরক্ষণ করতে যাতে আপনি আপনার tipical ব্যবহার মামলার সমস্ত ধাপ পেতে। এটি কেবলমাত্র কাঁচা কোড (যাতে আপনার প্রয়োজনের সাথে খাপ খাইয়ে নেওয়া হয়) তবে এটি কার্যকর।

// 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 এ আমি জসন ডেটা এর মতো পড়ব (পূর্ববর্তী উত্তরে বর্ণিত):

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

1
অনেক বেশি অকেজো তথ্য .. প্রথম কোডটি কী করে? দ্বিতীয় স্নিপেটটি উত্তরটি
হ'ল

@ ফিপসি, (এবং সমস্ত নিম্নগামীদের কাছে) আমার উত্তরটি কেবলমাত্র এবং স্পষ্টতই অন্যদের একটি সংশ্লেষ। এবং, যেমনটি আমি লিখেছি, একটি ব্যবহারের কেস (এমপিডিএফ)। লেখার সময়, আমি কীভাবে কীভাবে তা বের করার চেষ্টা করছিলাম তখন আমি এই জাতীয় উত্তর দেখতে পছন্দ করতাম। এবং আমার দ্বিতীয় স্নিপেট অবশ্যই উত্তর নয়, যেহেতু জসন ডেটা পাওয়ার জন্য, ডেটাটিও সঠিকভাবে প্রেরণ করতে হবে, এবং কেবল পাঠানোর আরও অনেক উপায় নেই, তবে প্রায়ই উপায়টি হ'ল আসল সমস্যা। এই ক্ষেত্রে, ফোকাস json_decode নয়, এটা পরিবর্তে কত সঠিকভাবে কাছ থেকে কিছু পেতে file_get_contents('php://input')
লুকা রেগেলিন

2
আমি উঁচুতে যাইনি এবং আমি আপনার উদ্দেশ্য বুঝতে পারি না .. তবে প্রশ্নটি 'রিসিভ জেএসএন' এবং 'জেএসএন প্রেরণ' নয়। এই প্রশ্ন থেকে এটি বেশ পরিষ্কার যে ওপি-র সমস্যাগুলি রয়েছে এবং এটি প্রেরণে সত্যই আগ্রহী নয়
ফিলিপ্সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.