在前面的文章中已经分享过 微信公众号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>
在公众号的开发文档中还有 回复图片消息、回复语音消息、回复视频消息等,文档里面都有相应的回复格式,在实际开发中只需参照开发文档里面的格式,把相应的内容替换成你想要回复的内容。
