開發微信公眾號遇到的一個坑,只因一個字母 s ,我浪費了 5 個小時

lijinma發表於2017-05-17

功能

超簡單,就是公眾號啟動“伺服器配置“,就要把訊息轉到自己的伺服器來處理。

症狀

  1. 配置 url 和 token,提交配置,配置正確。
  2. 因為能配置正確,所以每次提交配置的時候,都能看到 nginx 的 access_log
  3. 但是發訊息就會出現"Official account services unavalible, Try again later",說明訊息沒有正常返回 200
  4. 傳送訊息的時候,nginx 沒有 access_log,什麼鬼??
  5. 我以為是伺服器配置開啟的有問題,不斷在開啟和停用“伺服器配置”之間切換,結果,微信被我玩壞了,症狀就是即使已經停用了“伺服器配置”,仍然沒有切回去,不能實時切換,而且一直報錯:

file

到後來,根本就是無法開啟或停用了,那一刻,我好想死一死。

file

糾結點

  1. 為什麼配置可以正確提交,而且 access_log 有日誌,但是正常發訊息就有問題,而且沒有 access_log,為什麼?為什麼?為什麼?

原因

我給你看 nginx 配置你就知道了

server {
  listen 80;
  server_name host.com;
  return 301 https://$host$request_uri;
}

你肯定已經猜到了,我把配置填錯了,本來應該是 https://host.com/wechat ,我填寫成了 http://host.com/wechat

因為做了 301 的 redirect,所以提交配置這個 GET 請求自然就可以成功,而且有 access_log,但是微信訊息是 POST 請求,自然就出錯了。

學到的功課

  1. 不要鑽牛角尖,遇到一個問題,嘗試把所有可能性理一理,休息一會,上個廁所。
  2. 如果微信公眾號出現了"Official account services unavalible, Try again later"的問題,正確的 debug 流程是:

    先看 nginx 日誌是否請求過來,然後再看後端 cgi 這邊的報錯,不要武斷。

  3. 如果沒有日誌,就要檢查配置的問題,比如,是不是 https 寫成了 http 之類的傻問題。
  4. 如果有日誌,那就好好檢查,如果 cgi 這邊沒有報錯,比如 Laravel 的 csrf 的問題,最好自己模擬微信 POST 一個請求過去,一目瞭然。
  5. 微信真的可能被你玩壞,所以出問題了的時候,不要頻繁開啟或停用伺服器配置。

沒有傷痛,就沒有成長,我立志要成為微信開公眾號開發專家。含著淚也要把這些問題做好記錄,爭取給別人一點啟發。

file
file

本作品採用《CC 協議》,轉載必須註明作者和本文連結
寫文字大部分時候是因為我希望能幫助到你,小部分時候是想做總結或做記錄。我的微信是 lijinma,希望和你交朋友。 以下是我的公眾賬號,會分享我的學習和成長。

相關文章