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

PHP 微信開發:Token 驗證失敗與請求 URL 超時問題排查指南

     編輯:PHP 綜合知識

前言

微信公眾號接入時,最常遇到的兩個問題就是「Token 驗證失敗」和「請求 URL 超時」。本文針對這兩類問題提供系統性排查方案,並附上最精簡可用的驗證代碼,幫助開發者快速通過接入驗證。

問題一:Token 驗證失敗

核心檢查點

  1. Token 一致性:代碼中 define('TOKEN', 'your_token') 必須與公眾平台後台「開發者中心」填寫的 Token 完全一致(區分大小寫、無多餘空格)。
  2. 簽名算法正確:將 token、timestamp、nonce 三個參數字典序排序,拼接後 SHA1 加密,與 signature 比對。
  3. 輸出 echostr:驗證通過後必須原樣輸出 echostr 並 exit,不能有任何額外輸出(包括空白字符、BOM 頭、錯誤信息等)。

常見錯誤

  • PHP 文件以 UTF-8 with BOM 編碼保存,導致輸出隱形字符 → 使用編輯器轉為 UTF-8 without BOM。
  • 代碼中有 echo、var_dump、錯誤提示等輸出 → 驗證邏輯中只允許 echo $echoStr; exit;。
  • 服務器未開啟 80/443 端口,或防火牆攔截微信 IP 段。

問題二:請求 URL 超時

排查清單

  1. 服務器響應時間:微信要求 5 秒內響應,PHP 腳本執行時間過長(如死循環、慢 SQL、外部 API 調用無超時設置)會導致超時。
  2. 安全軟件攔截:服務器安裝「安全狗」、「雲鎖」等軟件可能誤攔截微信回調 IP → 暫時關閉或加白名單測試。
  3. DNS 解析失敗:域名解析異常、未備案(境內服務器需備案)、SSL 證書過期/不匹配(HTTPS 接口必須有效憑證)。
  4. 網絡不通:服務器在海外、或網絡波動 → 多提交幾次、更換服務器節點、使用 CDN 加速。

最精簡可用驗證代碼

<?php
/**
 * 微信服務器驗證入口 - 僅保留核心邏輯
 */
define('TOKEN', 'weixin');  // 必須與後台一致

$wechatObj = new WechatCallbackApiTest();

// 區分驗證請求與消息推送
if (isset($_GET['echostr'])) {
    $wechatObj->valid();
} else {
    $wechatObj->responseMsg();
}

class WechatCallbackApiTest {
    public function valid() {
        $echoStr = $_GET['echostr'];
        if ($this->checkSignature()) {
            echo $echoStr;
            exit;
        }
    }

    public function responseMsg() {
        $postStr = $GLOBALS['HTTP_RAW_POST_DATA'];
        if (!empty($postStr)) {
            libxml_disable_entity_loader(true);
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            
            $fromUsername = $postObj->FromUserName;
            $toUsername   = $postObj->ToUserName;
            $keyword      = trim($postObj->Content);
            $time         = time();
            $msgType      = 'text';

            $textTpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>0</FuncFlag>
            </xml>";

            if (!empty($keyword)) {
                $contentStr = 'Welcome to wechat world!';
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;
            } else {
                echo 'Input something...';
            }
        } else {
            echo '';
            exit;
        }
    }

    private function checkSignature() {
        $signature = $_GET['signature'];
        $timestamp = $_GET['timestamp'];
        $nonce     = $_GET['nonce'];
        $token     = TOKEN;

        $tmpArr = [$token, $timestamp, $nonce];
        sort($tmpArr, SORT_STRING);
        $tmpStr = sha1(implode($tmpArr));

        return $tmpStr === $signature;
    }
}

關鍵提醒

驗證通過後,務必將 $wechatObj->valid(); 註釋掉,改用 $wechatObj->responseMsg(); 進行業務測試,否則手機端測試無任何響應。

延伸閱讀

更多微信開發技巧:PHP 微信開發技巧匯總、PHP 網絡編程技巧總結、PHP 基礎語法入門教程 等專題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved