I’ve read many ‘possible duplicates’ of this question and have used the code from one of them in this post but I cannot seem to see exactly what this question is asking.
As part of a much bigger project unrelated to PHP or websites I need to obtain the body of a POST request to my shared server. Following the ideas from this SO post I have made a php file in the www folder on the server containing the following
webhook.php
<?php
error_log("webhook running");
file_put_contents("post.log", print_r($_POST, true));
?>
I then used a third party company to POST a test message to that script on my server, which was received OK, with a 200 response.
The body of that post contained
Body
{
"events": [
{
"id": "EVTESTDCQAHTYRDYM72",
"created_at": "2021-01-04T12:17:41.536Z",
"resource_type": "payments",
"action": "paid_out",
"links": {
"payment": "index_ID_1234567"
},
"details": {
"origin": "mycompanys",
"cause": "payment_paid_out",
"description": "The payment has been paid out by mycompany."
},
"metadata": {}
}
]
}
but the log file on my server contains only
Array
(
)
I’m not a PHP programmer (just do the minimum I need to in order to get the job done) For debugging and development purposes, how should I alter my webhook.php script so that I can see all the data that was sent?
If I can do that then I can probably work out how do do the proper processing on each element, which won’t always have the structure above.
Advertisement
Answer
PHP only populates $_POST, when the request Content-Type was either application/x-www-form-urlencoded
or multipart/form-data
. If you get send anything else, then you have to use php://input
to read the raw POST body, and parse it yourself.
The example JSON you have shown appears to be valid – so if json_decode does not give you the expected result here, then your input data was probably not what you expected it to be in the first place.
A basic debugging mistake here is that you are only looking at the final result of multiple “compound” operations. Log what file_get_contents('php://input')
returned first of all, to see if that actually is what you expected it to be. If it wasn’t to begin with, then looking only at what json_decode returned, isn’t that helpful.