微信服务号开发 - Nginx请求返回499 - 问题排查与解决

原创
2015/01/08 21:42
阅读数 3.8K

问题描述:

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


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


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

排查过程:

PHP代码问题?

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

PHP环境问题?

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

相关的脚本如下:

#!/usr/bin/env php

<?php
/**
 * 微信服务号辅助脚本
 *
 * 模拟向服务器发送微信文本消息
 *
 * @author dogstar 2015-01-08
 */

if ($argc < 3) {
    echo "Usage: $argv[0] <host> <content>\n\n";
    die();
}

$host = $argv[1];
$content = $argv[2];

$ch = curl_init();

$xml= '<xml>
    <ToUserName><![CDATA[gh_43235ff1360f]]></ToUserName>
    <FromUserName><![CDATA[oWNXvjipYqRViMpO8GZwXxE43pUY]]></FromUserName>
    <CreateTime>1419757723</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[' . $content . ']]></Content>
    <MsgId>6097812988731466682</MsgId>
    </xml>';

$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 

<xml>
<ToUserName><![CDATA[oWNXvjipYqRViMpO8GZwXxE43ppY]]></ToUserName>
<FromUserName><![CDATA[gh_43235ff1360f]]></FromUserName>
<CreateTime>1420723897</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[Hello World!]]></Content>
<FuncFlag>0</FuncFlag>
</xml>

Nginx环境问题?

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

域名解析问题!

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

最终解决:

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


展开阅读全文
加载中
点击加入讨论🔥(2) 发布并加入讨论🔥
2 评论
0 收藏
1
分享
返回顶部
顶部