鍍金池/ 問答/PHP  HTML/ php微信掃碼支付異步回調(diào)時$_POST為空

php微信掃碼支付異步回調(diào)時$_POST為空

框架thinkphp5
支付用插件EasyWeChat
微信異步回調(diào)時本應(yīng)存放了一個xml的$_POST是空的,卻能這樣file_get_contents('php://input')獲得xml。
圖片描述

回答
編輯回答
我不懂

xml格式要用php的輸入流 //input獲取

2018年2月25日 18:19
編輯回答
情已空

不是很清除,猜測是:微信回調(diào),發(fā)起一個POST請求到你的服務(wù)器,POST的內(nèi)容是XML格式,你接收這個內(nèi)容做處理,接收不到,應(yīng)該是姿勢不對,呵呵。

2017年11月9日 19:24
編輯回答
下墜

因為PHP默認(rèn)只識別application/x-www.form-urlencoded標(biāo)準(zhǔn)的數(shù)據(jù)類型,
對text/xml的內(nèi)容無法解析為$_POST數(shù)組,
所以只能用file_get_contents('php://input')獲取原始數(shù)據(jù)流

文檔
圖片描述


這個回答很棒了,我就基于次編輯一下做個補(bǔ)充,為什么不支持 $_POST

首頁 PHP 獲取到的數(shù)據(jù)都在 php://input ,但是里面的收是原始數(shù)據(jù)(RAW)。

$_POST 本質(zhì)上是提供了一個快捷獲取通道,把原始數(shù)據(jù)給轉(zhuǎn)成了數(shù)組,但是不是所有原始數(shù)據(jù)都會被轉(zhuǎn)成數(shù)組形式的

目前支持的是 application/x-www-form-urlencodedmultipart/form-data-encoded。這兩者是是必須被 client 支持的最基本的數(shù)據(jù)交互類型。所以 PHP 對他們做了支持,但并不代表 PHP 不能做到支持其他數(shù)據(jù)類型轉(zhuǎn)換,只是投入產(chǎn)出不太合適(如果需求強(qiáng)烈可以去給官方組提需求或者自己實(shí)現(xiàn)一波?)。

$data = trim(file_get_contents('php://input'));
$xml = simplexml_load_string($data);

$xml 是一個 SimpleXMLElement 對象

2017年11月16日 13:00
編輯回答
吢涼

因為微信通知是raw模式而不是form-data模式,必須要用獲取raw來獲取xml字符串。。。一般現(xiàn)在就算自己開發(fā)的接口很多也直接傳json字符串,不采用表單

2017年9月23日 06:47