PHP中為什么使用file_get_contents("php://input")接收微信通知
微信用戶和公眾號產(chǎn)生交互的過程中,用戶的某些操作會使得微信服務器通過事件推送的形式,通知到開發(fā)者在開發(fā)者中心處設置的服務器地址(回調url),從而開發(fā)者可以獲取到該信息。PHP中為什么會使用file_get_contents("php://input")來接收呢?為什么有些場景file_get_contents("php://input")會接收不到呢?
php用file_get_contents("php://input")或者$HTTP_RAW_POST_DATA可以接收xml數(shù)據(jù),
file_get_contents()
file_get_contents() 函數(shù)把整個文件讀入一個字符串中。
php://input
php://input 是個可以訪問請求的原始數(shù)據(jù)的只讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA,因為它不依賴于特定的 php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 默認沒有填充, 比激活 always_populate_raw_post_data 潛在需要更少的內存。 enctype="multipart/form-data" 的時候 php://input 是無效的。
php://input使用范圍
1、 讀取POST數(shù)據(jù)
2、不能用于multipart/form-data類型
$http_raw_post_data
$http_raw_post_data是PHP內置的一個全局變量。它用于,PHP在無法識別的Content-Type的情況下,將POST過來的數(shù)據(jù)原樣地填入變量$http_raw_post_data。它同樣無法讀取Content-Type為multipart/form-data的POST數(shù)據(jù)。需要設置php.ini中的always_populate_raw_post_data值為On,PHP才會總把POST數(shù)據(jù)填入變量$http_raw_post_data。
php://input、$http_raw_post_data、$_POST、$_GET區(qū)別
1、GET提交時,不會指定Content-Type和Content-Length,它表示http請求body中的數(shù)據(jù)是使用http的post方法提交的表單數(shù)據(jù),并且進行了urlencode()處理。
2、 POST提交時,Content- Type取值為application/x-www-form-urlencoded時,也指明了Content-Length的值,php會將http請求body相應數(shù)據(jù)會填入到數(shù) 組$_POST,填入到$_POST數(shù)組中的數(shù)據(jù)是進行urldecode()解析的結果。
3、php://input數(shù)據(jù),只要Content-Type不為 multipart/form-data(該條件限制稍后會介紹)。那么php://input數(shù)據(jù)與http entity body部分數(shù)據(jù)是一致的。該部分相一致的數(shù)據(jù)的長度由Content-Length指定。
4、僅當Content-Type為application/x-www-form-urlencoded且提交方法是POST方法時,$_POST數(shù)據(jù)與php://input數(shù)據(jù)才是”一致”(打上引號,表示它們格式不一致,內容一致)的。其它情況,它們都不一致。
5、php://input讀取不到$_GET數(shù)據(jù)。是因為$_GET數(shù)據(jù)作為query_path寫在http請求頭部(header)的PATH字段,而不是寫在http請求的body部分。
接收和發(fā)送XML的php示例
php示例:接收XML
接收xml數(shù)據(jù),并轉化為array數(shù)組。
<?php
$xmlData = file_get_contents("php://input");
$obj = simplexml_load_string($xmlData,"SimpleXMLElement", LIBXML_NOCDATA);
$json = json_decode(json_encode($obj),true);php示例:發(fā)送xml
<?php
$xml = '<xml>xmldata</xml>';//要發(fā)送的xml
$url = 'http://***.php';//接收XML地址
$header = 'Content-type: text/xml';//定義content-type為xml
$ch = curl_init(); //初始化
curl curl_setopt($ch, CURLOPT_URL, $url);//設置鏈接
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//設置是否返回信息
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//設置HTTP頭
curl_setopt($ch, CURLOPT_POST, 1);//設置為POST方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//POST數(shù)據(jù)
$response = curl_exec($ch);//接收返回信息
if(curl_errno($ch)){//出錯則顯示錯誤信息
print curl_error($ch);
}
curl_close($ch); //關閉curl鏈接
echo $response;//顯示返回信息
?>到此這篇關于PHP中為什么使用file_get_contents("php://input")接收微信通知的文章就介紹到這了,更多相關PHP中file_get_contents("php://input")接收微信通知內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Zend Framework過濾器Zend_Filter用法詳解
這篇文章主要介紹了Zend Framework過濾器Zend_Filter用法,結合實例形式分析了過濾器Zend_Filter的功能、原理、使用方法及相關注意事項,需要的朋友可以參考下2016-12-12
搭建PhpStorm+PhpStudy開發(fā)環(huán)境的超詳細教程
這篇文章主要介紹了搭建PhpStorm+PhpStudy開發(fā)環(huán)境的超詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Yii2中的場景(scenario)和驗證規(guī)則(rule)詳解
Yii2的rule用于對模型屬性進行驗證,scenario用戶定義不同場景下需要驗證的模型,下面這篇文章主要給大家介紹了關于Yii2中場景(scenario)和驗證規(guī)則(rule)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。2018-01-01
ThinkPHP利用PHPMailer實現(xiàn)郵件發(fā)送實現(xiàn)代碼
本文章介紹了關于在thinkphp中利用了phpmailer來實現(xiàn)郵件發(fā)送的詳細教程,有需要的朋友可以參考一下2013-09-09

