开发微信公众号遇到的一个坑,只因一个字母 s ,我浪费了 5 个小时

功能

超简单,就是公众号启动“服务器配置“,就要把消息转到自己的服务器来处理。

症状

  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

写文字大部分时候是因为我希望能帮助到你,小部分时候是想做总结或做记录。我的微信是 lijinma,希望和你交朋友。

以下是我的公众账号,会分享我的学习和成长。
file