首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

淺析 PHP 微信支付異步通知處理:php://input 與 $_POST 雙重讀取

     編輯:PHP 相關知識

通知數據結構特點

微信支付通知包含兩部分數據:

  1. 常規 POST 表單字段($_POST 可直接獲取)。
  2. 額外 XML 數據(需讀取 php://input 獲取原始報文)。

核心差異:php://input vs $_POST

場景$_POSTphp://input
Content-Type: application/x-www-form-urlencoded✅ 自動解析✅ 原始數據一致
Content-Type: multipart/form-data✅ 含檔案上傳❌ 為空
Content-Type: text/xml / application/json❌ 忽略✅ 完整原始報文

微信通知同時包含表單與 XML,故必須雙重讀取。

實際數據範例

$_POST 部分

array(
  'bank_type' => '3006',
  'out_trade_no' => '1214284731',
  'total_fee' => '3400',
  'sign' => '545FA0E8B594BBXXXX48XX142F084TY',
  // ... 更多字段
)

php://input XML 部分

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

處理流程建議

  1. $post = $_POST; 獲取常規字段。
  2. $xml = file_get_contents('php://input'); 獲取原始 XML。
  3. $xmlObj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 解析 XML。
  4. 合併驗證簽名(注意兩部分簽名算法可能不同)。
  5. 業務邏輯:更新訂單狀態、發貨、記錄日誌。
  6. 返回 success 確認收到,否則微信會重試通知。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved