微信公眾號接入時,最常遇到的兩個問題就是「Token 驗證失敗」和「請求 URL 超時」。本文針對這兩類問題提供系統性排查方案,並附上最精簡可用的驗證代碼,幫助開發者快速通過接入驗證。
define('TOKEN', 'your_token') 必須與公眾平台後台「開發者中心」填寫的 Token 完全一致(區分大小寫、無多餘空格)。echo、var_dump、錯誤提示等輸出 → 驗證邏輯中只允許 echo $echoStr; exit;。<?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 基礎語法入門教程 等專題。