微信扫码,公众号被动回复了消息连续两次,第一次是服务出现故障的提示,第二次是正确的回复,怎么回事?
公众号开发:
步骤:
- 服务器创建了临时二维码
- 用户微信扫码,进入公众号聊天界面(已关注)
- 服务器被动推送扫码事件消息,告知用户登陆成功
问题:
服务器只接收到了一条事件消息,我在服务器储存了Log日志记录,然后用户却收到了两条消息,第一条是提示“该公众号暂时无法提供服务,请稍后再试”,第二条是正确的服务器回复消息“登录成功”,如下图所示。
第一条提示的消息不知道怎么来的??而且在公众号后台运维中心-日志查询,是查不到任何记录的。
背景:
最开始开发的是完全正常的,不会返回两条消息。但是最近我们项目迁移了服务器,迁移过后,就出现了这样的问题。
后台是PHP,传输时加密安全模式。
部分代码如下:
public function responseMsg()
{
$xml_str = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");
// \Log::info($xml_str);
if (empty($xml_str) || empty($_REQUEST)) {
$this->noRes();
die('');
}
if (!empty($xml_str)) {
$res = new \stdClass;
$errCode = self::$wxBizMsgCrypt->decryptMsg($_REQUEST['msg_signature'], $_REQUEST['timestamp'], $_REQUEST['nonce'], $xml_str, $res);
\Log::info('res:' . json_encode($res, JSON_FORCE_OBJECT) . $errCode);
if ($errCode == 0) {
switch ($res->MsgType) {
case 'event':
//判断具体的时间类型(关注、取消、点击)
$event = $res->Event;
if ($event == 'SCAN') {
if ($res->EventKey == 'admin_login') {
// 后台系统绑定登陆 查询处理一些事情后,执行$this->sendText()
$this->backSystemLogin($res);
} elseif ($res->EventKey == 'admin_bind') {
$this->backSystemBind($res);
} else {
$this->noRes();
}
} else {
// ......
}
break;
case 'text': //文本消息
$this->noRes();
break;
default:
# code...
$this->noRes();
break;
}
} else {
$this->noRes();
die('');
}
}
}
private function sendText($text, $to, $from)
{
$format = "
%s
";
$xmlText = sprintf($format, $to, $from, time(), $text);
$encryptMsg = '';
$errorCode = self::$wxBizMsgCrypt->encryptMsg($xmlText, $_REQUEST['timestamp'], $_REQUEST['nonce'], $encryptMsg);
if (!empty($encryptMsg)) {
// \Log::info('encrypt:' . $encryptMsg);
echo $encryptMsg;
} else {
// \Log::info('errCOde:' . $errorCode);
$this->noRes();
die('');
}
}
private function noRes()
{
$encryptMsg = '';
$errorCode = self::$wxBizMsgCrypt->encryptMsg('success', $_REQUEST['timestamp'], $_REQUEST['nonce'], $encryptMsg);
if (!empty($encryptMsg)) {
echo $encryptMsg;
} else {
die('');
}
}