摘要:虽然在微信公众平台的后台有自动回复设置,但微信公众平台的自动回复太过呆板,不够灵活,而通过对公众号进行开发可以让回复变的非常灵活,图片、语音、视频、音乐等都可以回复。
在前面的文章中已经分享过 微信公众号API接口在应用中的接入验证 ,今天继续分享微信公众号的接收事件推送并回复的开发(关注微信号后自动回复消息,以及通过下面的消息发送向公众号发送消息时的回复)。
虽然在微信公众平台的后台有自动回复设置,但微信公众平台的自动回复太过呆板,不够灵活,而通过对公众号进行开发可以让回复变的非常灵活。
先把代码上上来:
(这里博主用的是TthinkPHP5.0.24的框架)
【博主测试过在TthinkPHP5x中,如果用$_GET来接收数据,当没有传递数据时会报 index undefined 的错误,所以接收普通的post和get数据最好用助手函数input()】
<?php namespace app\weixin\controller; use think\Db; class index { public function index() { $timestamp = input('get.timestamp'); $nonce = input('get.nonce'); $token = 'xy_weixin_api'; $signature = input('get.signature'); $array = array($timestamp, $nonce, $token); sort($array); $stmstr = implode('', $array); $stmstr = sha1($stmstr); $echostr = input('get.echostr'); if($stmstr == $signature && $echostr){ echo $echostr; exit; } else { $this->responseMsg(); } } //发送响应消息 public function responseMsg() { $postArr = file_get_contents("php://input"); $postObj = simplexml_load_string($postArr); $type = strtolower($postObj->MsgType); //关注和向公众号发送消息是两个不同的事件 //因此可以通过获取到的事件类型来决定回复什么内容 switch ($type) { //关注事件回复内容 case 'event': if (strtolower($postObj->Event) == 'subscribe') { $content = '欢迎来到心月IT博客微信公众号'.$postObj->FromUserName; } break; //纯文本回复内容 //根据用户发送过来的文本内容判断该回复什么 case 'text': $txt = trim($postObj->Content); switch ($txt) { case '1': $content = '心月IT博客微信公众号'; break; //单图文回复内容 case 'tuwen': $data = \db('news')->order('id desc')->paginate(1)->toArray(); $content = $data['data']; break; //多图文回复内容 case 'tuwen2': $data = \db('news')->order('id desc')->paginate(8)->toArray(); $content = $data['data']; break; default: break; } break; default: break; } $toUser = $postObj->FromUserName; $fromUser = $postObj->ToUserName; $time = time(); $msgType = 'text'; if (is_array($cnt)) { if (empty($cnt)) return; $template = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType>"; $template .= "<ArticleCount>".count($cnt)."</ArticleCount>"; $template .= "<Articles>"; foreach ($cnt as $article) { $picUrl = $article['thumb'] ? "http://www.xinyueseo.com".$article['thumb'] : "http://www.xinyueseo.com/statics/images/itimages/default.png"; $template .= "<item> <Title><![CDATA[{$article['title']}]]></Title> <Description><![CDATA[{$article['description']}]]></Description> <PicUrl><![CDATA[{$picUrl}]]></PicUrl> <Url><![CDATA[{$article['url']}]]></Url> </item>"; } $template .= "</Articles> </xml>"; $msgType = 'news'; $info = sprintf($template, $toUser, $fromUser, $time, $msgType); echo $info; exit(); }else{ $content = $cnt; $template = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Contnet> </xml>"; $info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content); echo $info; exit(); } } }
微信公众号回复的消息是xml格式的,回复文本消息的格式,在开发的时候只需把CDATA里面的内容替换掉,然后通过sprintf格式化输出。
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> </xml>
微信公众号回复图文消息的格式,这里是单条图文,如果是多条图文,则通过 item 循环放置图文内容,一条图文对应一对item
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>1</ArticleCount> <Articles> <item> <Title><![CDATA[title1]]></Title> <Description><![CDATA[description1]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item> </Articles> </xml>
在公众号的开发文档中还有 回复图片消息、回复语音消息、回复视频消息等,文档里面都有相应的回复格式,在实际开发中只需参照开发文档里面的格式,把相应的内容替换成你想要回复的内容。