微信回复文本消息和图文消息
微信自动回复,我的理解,大体可以分为:
1、关注平台后自动回复。
2、用户推送了文本,我们回复消息。包括文本消息,单图文消息和多图文消息等等。
3、click事件,响应事件后回复消息。
我们先写一个判断类型的函数:
public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $RX_TYPE = trim($postObj->MsgType); //用户发送的消息类型判断 switch ($RX_TYPE) { case "text": $result = $this->receiveText($postObj); break; case "image": $result = $this->receiveImage($postObj); break; case "event": $result = $this->receiveEvent($postObj); break; default: $result = "unknow msg type: ".$RX_TYPE; break; } echo $result; }else { echo ""; exit; } }
一、先谈谈关注微信公众平台后自动回复消息吧。
首先,他们得关注我们的平台,方式我们都不用管了,就是关注微信公众平台后,发出一段消息。
关注平台,我们要记得一个关键字是:“subscribe”,这个词可以判断关注与否。先写一个回复文本消息的方法,如下:
/* * 回复文本消息 */ private function transmitText($object, $content){ $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content); return $result; }
关注平台后,我们首先要给出一个判断:
private function receiveEvent($object){ $contentStr = ""; switch ($object->Event) { case "subscribe": $contentStr = "欢迎关注***平台"."\n"."\n是换行符"; break; default: break; } $result = $this->transmitText($object, $contentStr); return $result; }
关注平台后,即可回复一个文本消息。消息内容是:
欢迎关注***平台\n是换行符
二、用户推送了文本,我们回复消息。
同样,先给他写好各种方法,其中有如何回复单文本消息,回复图片消息 ,回复图文消息。
/* * 回复文本消息 */ private function transmitText($object, $content){ $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content); return $result; } /* * 回复图片消息 */ private function transmitImage($object, $imageArray){ $itemTpl = "<Image> <MediaId><![CDATA[%s]]></MediaId> </Image>"; $item_str = sprintf($itemTpl, $imageArray['MediaId']); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[image]]></MsgType> $item_str </xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time()); return $result; } /* * 回复图文消息 */ private function transmitNews($object, $arr_item){ if(!is_array($arr_item)) return; $itemTpl = "<item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item>"; $item_str = ""; foreach ($arr_item as $item) $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']); $newsTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <Content><![CDATA[]]></Content> <ArticleCount>%s</ArticleCount> <Articles>$item_str</Articles> </xml>"; $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item)); return $result;
}
然后给回复
/* *回复文本消息 *编码时间:2015-09-21 */ private function receiveText($object) { $keyword = trim($object->Content); if($keyword == "公司"){ //回复文本消息 //回复单图文消息 $content = array(); $content[] = array("Title"=>"公司介绍", "Description"=>"公司各种东西。", "PicUrl"=>"图片地址", "Url" =>"链接; $result = $this->transmitNews($object, $content); } else if($keyword == "地址"||$keyword=="电话"||$keyword =="联系方式"||$keyword == "邮箱"){ //回复多图文消息 $content = array(); $content[] = array("Title"=>"公司", "Description"=>"", "PicUrl"=>"图片地址", "Url" =>"链接地址"); $content[] = array("Title"=>"公司地址", "Description"=>"","PicUrl"=>"", "Url" =>""); $content[] = array("Title"=>"公司联系方式:", "Description"=>"","PicUrl"=>"", "Url" =>""); $content[] = array("Title"=>"公司邮箱:", "Description"=>"", "PicUrl"=>"","Url" =>""); $result = $this->transmitNews($object, $content); } else if(!empty($keyword)){ //回复文本消息 //回复单图文消息 $content = array(); $content[] = array("Title"=>"hello", "Description"=>"hello 你好等等" ); $result = $this->transmitNews($object, $content); } return $result; }
三、click事件回复消息
click事件,首先要提到写个json,来做一系列的按钮。如下:
{ "button":[ { "type":"click", "name":"click事件", "key":"text_click" } ] }
点击click事件,执行如下代码:
private function receiveEvent($object){ $contentStr = ""; switch ($object->Event){
case "CLICK": switch ($object->EventKey){ case "text_click":
$contentStr = "click事件响应!"; break;
} break;
default: break; }
$result = $this->transmitText($object, $contentStr);
return $result; }
就OK了。