### responseMsg() * * * * * 先把responseMsg()补充完整 ~~~ public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ $this->logger("R ".$postStr); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $RX_TYPE = trim($postObj->MsgType); if (($postObj->MsgType == "event") && ($postObj->Event == "subscribe" || $postObj->Event == "unsubscribe" || $postObj->Event == "TEMPLATESENDJOBFINISH")){ //过滤关注和取消关注事件 }else{ //更新互动记录 Db::name('user')->where('openid',strval($postObj->FromUserName))->setField('heartbeat', time()); } //消息类型分离 switch ($RX_TYPE) { case "event": $result = $this->receiveEvent($postObj); break; case "text": $result = $this->receiveText($postObj); break; case "image": $result = $this->receiveImage($postObj); break; case "location": $result = $this->receiveLocation($postObj); break; case "voice": $result = $this->receiveVoice($postObj); break; case "video": $result = $this->receiveVideo($postObj); break; case "link": $result = $this->receiveLink($postObj); break; default: $result = "unknown msg type: ".$RX_TYPE; break; } $this->logger("T ".$result); echo $result; }else { echo ""; exit; } } ~~~ ### 测试文本消息 * * * * * 接收文本消息 ~~~ private function receiveText($object) { $keyword = trim($object->Content); $openid = strval($object->FromUserName); if (strstr($keyword, "文本")){ $content = "这是个文本消息\n".$openid; $this->logger("正确收到消息: ".$keyword); }else{ $content = "你刚刚发的是:".$keyword; } $result = $this->transmitText($object, $content); $this->logger("QQ ".$keyword); return $result; } ~~~ 回复文本消息 ~~~ private function transmitText($object, $content) { if (!isset($content) || empty($content)){ return ""; } $xmlTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content); return $result; } ~~~ 日志记录 方便我们调错,加入了日志记录方法,直接生成在public下。 如果测试时遇到问题,不清楚怎么回事,加入logger方法可以清晰找出问题点。比如: `$this->logger("当前执行内容 ".$postStr);` ~~~ private function logger($log_content) { if(isset($_SERVER['HTTP_APPNAME'])){ //SAE sae_set_display_errors(false); sae_debug($log_content); sae_set_display_errors(true); }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.2"){ //LOCAL $max_size = 1000000; $log_filename = "log.xml"; if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);} file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND); } } ~~~ 测试,成功!程序正确接收到用户发送的内容,并回复指定关键词。对于自定义菜单的触发,也是同样逻辑。 由于,我们需要返回给用户推广海报,返回的便不是文本消息,而是我们生成之后的海报图片。 ~~~ if (strstr($keyword, "文本")){ $content = "这是个文本消息\n".$openid; //$this->logger("文本回复 ".$keyword); } ~~~