首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

微信公眾平台測試賬號服務器配置失敗:雖然收到參數並返回 echostr,但驗證邏輯錯誤導致校驗不通

     編輯:程式設計疑難解答

微信公眾號開發「服務器配置」步驟:微信發送 GET 請求攜帶 signature、timestamp、nonce、echostr,開發者需驗證簽名後**原樣返回 echostr**。許多新手以為「收到參數並打印了 echostr 就行」,實則返回格式、簽名算法、字符編碼任一環節出錯即配置失敗。

標準驗證流程

  1. 將 token、timestamp、nonce 三個參數進行字典序排序。
  2. 將三個參數字符串拼接成一個字符串進行 SHA1 加密。
  3. 開發者獲得加密後的字符串可與 signature 對比,標識該請求來源於微信。
  4. 驗證通過後,**直接返回 echostr 參數值**(純文本,無 JSON、無 HTML、無多餘空白)。

常見失敗原因對照表

現象根因修正
返回 "success" / "ok" / JSON誤以為需返回狀態碼**必須原樣返回 echostr 字符串**
返回帶換行/空格的 echostrSystem.out.println / 模板引擎輸出用 response.getWriter().write(echostr) 或 response.getWriter().print(echostr)
簽名算法錯誤排序方式錯、編碼錯、大小寫錯嚴格按字典序、UTF-8、SHA1 十六進制小寫
Token 不一致公眾平台填寫的 Token 與代碼常量不一致雙向核對,建議從配置中心讀取
HTTPS 證書不受信自簽證書/過期/域名不匹配用有效 CA 證書,或內網穿透工具 (ngrok/frp) 提供 HTTPS
端口非 80/443微信只回調 80/443Nginx 反向代理轉發至內部端口

Java Servlet 正確實現

@WebServlet("/wx/verify")
public class WxVerifyServlet extends HttpServlet {
    private static final String TOKEN = "your_token_from_config";

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String signature = req.getParameter("signature");
        String timestamp = req.getParameter("timestamp");
        String nonce = req.getParameter("nonce");
        String echostr = req.getParameter("echostr");

        // 1. 參數校驗
        if (signature == null || timestamp == null || nonce == null || echostr == null) {
            resp.setStatus(400);
            return;
        }

        // 2. 簽名驗證
        String[] arr = {TOKEN, timestamp, nonce};
        Arrays.sort(arr); // 字典序
        String sortedStr = String.join("", arr);
        String sha1 = SHA1Util.encode(sortedStr); // 自行實現或用 Commons Codec

        if (!sha1.equals(signature)) {
            resp.setStatus(403); // 簽名失敗
            return;
        }

        // 3. 關鍵:原樣返回 echostr,設置 Content-Type=text/plain
        resp.setContentType("text/plain; charset=UTF-8");
        resp.getWriter().write(echostr); // 不要用 println/print 避免換行
        resp.getWriter().flush();
    }
}

調試技巧

  1. 微信開發者工具 → 公眾平台 → 接口調試工具:模擬發送驗證請求,查看返回內容。
  2. Nginx access_log / error_log:確認請求是否到達、返回狀態碼、返回體大小。
  3. 抓包 (tcpdump/Wireshark):查看原始 HTTP 交互,確認 echostr 是否被修改。
  4. 日誌記錄:記錄收到的參數、計算出的簽名、微信簽名、是否匹配。

避坑口訣

「排序拼接 SHA1,匹配才算過;原樣返回 echostr,多一字節都算錯。」

配置失敗 90% 是「返回格式不對」或「Token 不一致」。對照清單逐項核對,分分鐘搞定。

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