本文作者:心月

微信公众号开发——接收事件推送并回复

心月IT博客 2019-10-02
摘要:虽然在微信公众平台的后台有自动回复设置,但微信公众平台的自动回复太过呆板,不够灵活,而通过对公众号进行开发可以让回复变的非常灵活,图片、语音、视频、音乐等都可以回复。

        在前面的文章中已经分享过 微信公众号API接口在应用中的接入验证 ,今天继续分享微信公众号的接收事件推送并回复的开发(关注微信号后自动回复消息,以及通过下面的消息发送向公众号发送消息时的回复)。

        虽然在微信公众平台的后台有自动回复设置,但微信公众平台的自动回复太过呆板,不够灵活,而通过对公众号进行开发可以让回复变的非常灵活。

20191002_1570029782458232.jpg微信图片_20191002232213.jpg

先把代码上上来:

(这里博主用的是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>

在公众号的开发文档中还有 回复图片消息、回复语音消息、回复视频消息等,文档里面都有相应的回复格式,在实际开发中只需参照开发文档里面的格式,把相应的内容替换成你想要回复的内容。

文章版权及转载声明:

作者:心月 本文地址:http://www.xinyueseo.com/other/352.html发布于 2019-10-21
文章转载或复制请以超链接形式并注明出处心月IT博客

分享到:
赞(

发表评论

快捷输入:

    评论列表 (有 0 条评论,人围观)参与讨论