Receive JSON POST with PHP

前端 未结 7 2301
Happy的楠姐
Happy的楠姐 2020-11-21 04:42

I’m trying to receive a JSON POST on a payment interface website, but I can’t decode it.

When I print :

echo $_POST;

I get:

相关标签:
7条回答
  • 2020-11-21 05:17

    Use $HTTP_RAW_POST_DATA instead of $_POST.

    It will give you POST data as is.

    You will be able to decode it using json_decode() later.

    0 讨论(0)
  • 2020-11-21 05:19
    $data = file_get_contents('php://input');
    echo $data;
    

    This worked for me.

    0 讨论(0)
  • 2020-11-21 05:25

    It is worth pointing out that if you use json_decode(file_get_contents("php://input")) (as others have mentioned), this will fail if the string is not valid JSON.

    This can be simply resolved by first checking if the JSON is valid. i.e.

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

    Edit: Note that removing strlen($json_params) above may result in subtle errors, as json_last_error() does not change when null or a blank string is passed, as shown here: http://ideone.com/va3u8U

    0 讨论(0)
  • 2020-11-21 05:26

    Read the doc:

    In general, php://input should be used instead of $HTTP_RAW_POST_DATA.

    as in the php Manual

    0 讨论(0)
  • 2020-11-21 05:26

    I'd like to post an answer that also uses curl to get the contents, and mpdf to save the results to a pdf, so you get all the steps of a tipical use case. It's only raw code (so to be adapted to your needs), but it works.

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

    In $mysrcfile I'll read json data like this (as stated on previous answers):

    $data = json_decode(file_get_contents('php://input'));
    // (then process it and build the page source)
    
    0 讨论(0)
  • 2020-11-21 05:27

    If you already have your parameters set like $_POST['eg'] for example and you don't wish to change it, simply do it like this:

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

    This will save you the hassle of changing all $_POST to something else and allow you to still make normal post requests if you wish to take this line out.

    0 讨论(0)
提交回复
热议问题