微信支付通知包含兩部分數據:
$_POST 可直接獲取)。php://input 獲取原始報文)。| 場景 | $_POST | php://input |
|---|---|---|
| Content-Type: application/x-www-form-urlencoded | ✅ 自動解析 | ✅ 原始數據一致 |
| Content-Type: multipart/form-data | ✅ 含檔案上傳 | ❌ 為空 |
| Content-Type: text/xml / application/json | ❌ 忽略 | ✅ 完整原始報文 |
微信通知同時包含表單與 XML,故必須雙重讀取。
array(
'bank_type' => '3006',
'out_trade_no' => '1214284731',
'total_fee' => '3400',
'sign' => '545FA0E8B594BBXXXX48XX142F084TY',
// ... 更多字段
)
<xml>
<OpenId><![CDATA[o0pd3jqHaN7b0tVPDFJPzJEkSCLw]]></OpenId>
<AppId><![CDATA[wxXXX06XX2cXXX88XX]]></AppId>
<IsSubscribe>1</IsSubscribe>
<TimeStamp>1400814743</TimeStamp>
<NonceStr><![CDATA[lqxwMsiY9EXRDpms]]></NonceStr>
<AppSignature><![CDATA[c2dxxxe186116b32b06axxxc1a688b671eexxx5e]]></AppSignature>
<SignMethod><![CDATA[sha1]]></SignMethod>
</xml>
$post = $_POST; 獲取常規字段。$xml = file_get_contents('php://input'); 獲取原始 XML。$xmlObj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 解析 XML。success 確認收到,否則微信會重試通知。