问题描述:

在进行微信服务号开发时,通过微信后台成功设置了自己服务器的地址,但是发现在微信一发送消息马上返回“该公众号暂时无法提供服务,请稍后再试”,而一开始是可以的,而且PHP入口文件居然没有被执行。。。

这个问题怪异之处在于,一开始微信号还是正常返回消息的。但是后来看到的表象是微信总是返回“该公众号暂时无法提供服务,请稍后再试”,而查看nginx下的access.log是可以看到有请求过来的。

140.207.54.79 - - [08/Jan/2015:20:46:58 +0800] "POST /?signature=843506c7d2451087bf7×tamp=1420721218&nonce=1521817541 HTTP/1.0" 499 0 "-" "Mozilla/4.0"

排查过程:

PHP代码问题?

一开始以为是PHP代码出错,或者是有异常,但是看了nginx下的error.log并无纪录,因此排除。

PHP环境问题?

有出现上面问题前,最近的操作是对php.ini文件进行了配置的更改,但是查看了一下PHP的相关进程,运行正常。而且,用脚本来模拟微信的请求也是可以得到正确的预期的返回。因此排除。

相关的脚本如下:

#!/usr/bin/env php
/**
* 微信服务号辅助脚本
*
* 模拟向服务器发送微信文本消息
*
* @author dogstar 2015-01-08
*/
if ($argc 
echo "Usage: $argv[0]  \n\n";
die();
}
$host = $argv[1];
$content = $argv[2];
$ch = curl_init();
$xml= '
1419757723
6097812988731466682
';
$header[]="Content-Type: text/xml; charset=utf-8";
$header[]="Content-Length: ".strlen($xml);
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HEADER, 0);
$res = curl_exec($ch);
echo $res, "\n\n";
调用和结果如下:
$ ./send_wechat_text.php http://XXX.com.cn/ demo
1420723897
0

Nginx环境问题?

在尝试使用tcpdump来抓包的同时,忽然意识到可以看下Nginx返回的状态码,果然不是200,而是499!网上稍微查了一下,499的两种原因是:客户端放弃了请求或服务器断开了请求。但显然是服务器没有超时不会自己断开连接,也没超过微信规定的5秒内响应。那到底是什么原因致使客户端放弃了请求呢?!!

域名解析问题!

最后发现(通过一位在上海的同学),绑定的域名在广东 内访问是正常的,但在上海访问却提示需要做备案。而且对应 的返回也是499。提示如下:

nginx 代码499 nginx 499解决办法_nginx 代码499

最终解决:

通过重新绑定域名,问题得以解决。