微信消息回复

微信消息回复的实例代码

具体的看一下我带的simplexml_load_string()函数的博客解析

(数据的变化类型和数据传输才是数据的流向)

<?php 

    class  IndexController extends CommonController{

        //加载首页
        public function Index(){

            //define your token
            $wechatObj = new wechatCallbackapiTest();

            //判定变量
            if(isset($_GET[‘echostr‘])){

                //有变量是验证 接口配置
                $wechatObj->valid();

            }else{

                $this->getQrcode();

                //设定菜单 没有验证信息
                $wechatObj->responseMsg();

            }

            // 有值返回,加载页面
            // require ‘view/index.html‘;

        }

    }

    //聊天类
    class wechatCallbackapiTest  extends CommonController{

        //去验证
        public function valid(){

            $echostr = $_GET["echostr"];

            if($this->checkSignature()){

                echo $echostr;//推送

                exit;
            }
        }

        //验证服务器地址的有效性
        private function checkSignature(){

            //签名
            $signature = $_GET["signature"];
            //时间戳
            $timestamp = $_GET["timestamp"];
            //随机数
            $nonce = $_GET["nonce"];
            //常量token
            $token = ‘akira‘;
            //将接到的三个再结合成token,做成一个数组
            $tmpArr = array($token, $timestamp, $nonce);
            //对数组进行字典排序
            sort($tmpArr, SORT_STRING);
            //排序过的再合成一个字符串
            $tmpStr = implode( $tmpArr );
            //通过sha1()进行加密处理
            $tmpStr = sha1( $tmpStr );

            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }

        //相应用户的消息.token验证
        public function responseMsg(){

            //get post data, May be due to the different environments
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

            //接收的消息写入日志
            // $this->logger(‘R \n‘.$postStr);

            //extract post data
            if (!empty($postStr)){

                    //LIBXML_NOCDATA将 CDATA 设置为文本节点
                    $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);

                    //获取传过来的数据类型
                    $msgType = trim($postObj->MsgType);     //text image location voice video link

                    switch($msgType){

                        case ‘event‘:
                            $resultStr = $this->receiveEvent($postObj);
                            break;

                        case ‘text‘:
                            $resultStr = $this->receiveText($postObj);  //接收文本消息
                            break;

                        case ‘image‘:
                            $resultStr = $this->receiveImage($postObj); //接收图片消息
                            break;

                        case ‘location‘:
                            $resultStr = $this->receiceLocation($postObj); //接收位置信息
                            break;

                        case ‘voice‘:
                            $resultStr = $this->receiveVoice($postObj);   //接收语音消息
                            break;

                        case ‘video‘:
                            $resultStr = $this->receiveVideo($postObj);     //接收视频消息
                            break;

                        case ‘link‘:
                            $resultStr = $this->receiveLink($postObj);     //接收链接消息
                            break;

                        default:
                            $resultStr = $this->transText(‘unknow msg type:‘.$msgType);
                    }   

                    //回复给用户的消息写入日志
                    //$this->logger(‘T \n‘.$resultStr);

                    //输出消息给用户
                    echo $resultStr;
            }else {
                echo "";
                exit;
            }
        }

        //接收事件消息
        private function receiveEvent($object){

            //临时定义一个变量,不同的事件发生时,给用户反馈不同的内容
            $content = "";

            //通过用户发过来的不同事件做一个处理
            switch($object->Event){
                //用户关注 触发事件
                case ‘subscribe‘:

                    $content = "欢迎关注akira的测试账号";

                    //如果用户传来Eventkey事件,则扫描二维码
                    // $content .= (!empty($object->EventKey))?("\n来自二维码场景".str):;
                    break;

                //用户取消关注
                case ‘unsubscribe‘:

                    $content = "取消关注";

                    break;

            }

            return $this->transText($object,$content);

        }

        //接收图片消息
        public function receiveImage($object){

            $content = array("Media_Id"=>$object->MediaId);

            $result = $this->transImage($object,$content);

            return $result;
        }

        //接收位置消息
        public function receiceLocation($object){

            $content = "你发送的位置是,纬度:".$object->Location_X.";经度为:".$object->Location_Y;

            $result = $this->transText($object,$content); 

            return $result;
        }

        //得到语音消息
        public function receiveVoice($object){

            if(isset($object->Recognition) && !empty($object->Recognition)){

                //通过语言识别返回的文件放到fci函数分词后返回数组(多少个词)
                $text = $this->fci($object->Recognition);

                $content = "你刚才说的是:".implode(",",$text);

                $result = $this->transText($object,$content);
            }else{
                $content = array("MediaId"=>$object->MediaId);

                $result = $this->transVoice($object,$content);
            }

            return $result;
        }

        //获取视频消息
        public function receiveVideo($object){

        }

        //接收链接信息
        public function receiveLink($object){

        }

        //接收文本消息
        public function receiveText($object){

            //接收用户的文本内容,放到keyword这个变量中
            $keyword = trim($object->Content);

            //如果keyword中有文本两个字就回复给用户一个字符串
            if(strstr($keyword,‘文本‘)){

                $content = ‘这是一个文本消息‘;

            }elseif(strstr($keyword,"单图文")){

                $content = array();

                $content[] = array("Title"=>"这是一个标题","Description"=>"1234","PicUrl"=>"http://mmbiz.qpic.cn/mmbiz/XImdqg47OccUzAbS32jSiaM72Tn2wyEvDLELLPoofiaKaeOAb9DC2F4srzBQCO7yqnSFaK8r5iaEQYguAicVj9XFSQ/640?wx_fmt=jpeg&wxfrom=5","Url"=>"http://mp.weixin.qq.com/s?__biz=MzAxNzUxOTczMg==&mid=207890753&idx=1&sn=4d097f8a06f89f940b1428ec6fc822c0#rd");

            }elseif(strstr($keyword,"图文")  || strstr($keyword,‘多图文‘)){

                $content = array();

                $content[] = array("Title"=>"这是一个标题1","Description"=>"111","PicUrl"=>"http://mmbiz.qpic.cn/mmbiz/XImdqg47OccUzAbS32jSiaM72Tn2wyEvDLELLPoofiaKaeOAb9DC2F4srzBQCO7yqnSFaK8r5iaEQYguAicVj9XFSQ/640?wx_fmt=jpeg&wxfrom=5","Url"=>"http://mp.weixin.qq.com/s?__biz=MzAxNzUxOTczMg==&mid=207890753&idx=1&sn=4d097f8a06f89f940b1428ec6fc822c0#rd");
                $content[] = array("Title"=>"这是一个标题2","Description"=>"222","PicUrl"=>"http://mmbiz.qpic.cn/mmbiz/XImdqg47OccUzAbS32jSiaM72Tn2wyEvDLELLPoofiaKaeOAb9DC2F4srzBQCO7yqnSFaK8r5iaEQYguAicVj9XFSQ/640?wx_fmt=jpeg&wxfrom=5","Url"=>"http://mp.weixin.qq.com/s?__biz=MzAxNzUxOTczMg==&mid=207890753&idx=1&sn=4d097f8a06f89f940b1428ec6fc822c0#rd");
                $content[] = array("Title"=>"这是一个标题3","Description"=>"333","PicUrl"=>"http://mmbiz.qpic.cn/mmbiz/XImdqg47OccUzAbS32jSiaM72Tn2wyEvDLELLPoofiaKaeOAb9DC2F4srzBQCO7yqnSFaK8r5iaEQYguAicVj9XFSQ/640?wx_fmt=jpeg&wxfrom=5","Url"=>"http://mp.weixin.qq.com/s?__biz=MzAxNzUxOTczMg==&mid=207890753&idx=1&sn=4d097f8a06f89f940b1428ec6fc822c0#rd");
                $content[] = array("Title"=>"这是一个标题4","Description"=>"444","PicUrl"=>"http://mmbiz.qpic.cn/mmbiz/XImdqg47OccUzAbS32jSiaM72Tn2wyEvDLELLPoofiaKaeOAb9DC2F4srzBQCO7yqnSFaK8r5iaEQYguAicVj9XFSQ/640?wx_fmt=jpeg&wxfrom=5","Url"=>"http://mp.weixin.qq.com/s?__biz=MzAxNzUxOTczMg==&mid=207890753&idx=1&sn=4d097f8a06f89f940b1428ec6fc822c0#rd");

            }elseif(strstr($keyword,"音乐")){

                $content = array("Title"=>"歌曲","Description"=>"nice的一逼","MusicUrl"=>"http://akira.weixin-sandbox.ciicgat.com/public/bcjl.mp3","HQMusicUrl"=>"http://akira.weixin-sandbox.ciicgat.com/public/bcjl.mp3");

            }elseif(strstr($keyword,"抽奖")){

                $content =  $this->get_authorize_url(CJURL,‘1‘);

            }
            else{

                $content = "akira".date(‘Y-m-d H:i:s‘)."技术支持";

            }

            //是数组,则为图文
            if(is_array($content)){

                if(isset($content[0])){

                    //第一张图有PicUrl,为单图文
                    $res = $this->transNews($object,$content);

                }elseif(isset($content[‘MusicUrl‘])){

                    $res = $this->transMusic($object,$content);

                }

            }else{
                //$keyword 你输入的文本
                //$object->FromUserName
                //调用一个方法,将openid和你输入的文本传入,使用这个函数处理
                $this->getUserInfo($object->FromUserName,$keyword);

                $res = $this->transText($object,$content);

            }

            return $res;
        }

        //回复语音消息
        public function transVoice($object,$voice){

            $xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[%s]]></MediaId>
</Voice>
</xml>";

            $result = sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),$voice[‘MediaId‘]);

            return $result;
        }

       //回复图片消息
       public function transImage($object,$image){

               $xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[%s]]></MediaId>
</Image>
</xml>";
            $result = sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),$object->MediaId);

            return $result;

        }

        //回复音乐消息
        public function transMusic($object,$music){

            $xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>
</xml>";

            $re = sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),$music[‘Title‘],$music[‘Description‘],$music[‘MusicUrl‘],$music[‘HQMusicUrl‘]);

            return $re;
        }

        //做单图文的相应消息
        public function transNews($object,$newsArray){

            if(!is_array($newsArray)){
                return ‘‘;
            }

            $itemTpl = "<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";

            $item_str = "";

            foreach($newsArray as $item){
                $item_str .= sprintf($itemTpl,$item[‘Title‘],$item[‘Description‘],$item[‘PicUrl‘],$item[‘Url‘]);
            }

            $xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>
    $item_str
</Articles>
</xml>";

            return sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),count($newsArray));

        }

        //向用户传输文本
        public function transText($object,$content){

            $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;
        }

        /*写日志
        @param string $log_content  传日志的内容
        */
        public function logger($log_content){

            //日志大小
            $max_file_size = 10000;

            $log_filename = ‘log.xml‘;

            if(file_exists($log_filename) && abs(filesize($log_filename)) > $max_file_size){
                @unlink($log_filename);
            }

            //写入日志,追加写日志
            file_put_contents($log_filename,date(‘H:i:s‘).‘ ‘.$log_content.‘\n‘,FILE_APPEND);

        }

    }

?>

对于数据抓包的处理很多时候决定了传输的定性

接收普通消息

http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html

接收事件推送

http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html

时间: 2024-10-13 02:26:56

微信消息回复的相关文章

Java - 微信公众号 - 消息回复

1.开发接入 (1)更改入门教程中的Controller:  注(验证是属于GET,然而交互是属于POST) @RequestMapping(value = "/getMsg", method = {RequestMethod.GET, RequestMethod.POST}) public void getMsg(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException

【玩转微信公众平台之十】 图文消息回复讲解

讲解目录 <保卫战:异形入侵>游戏开发    1 第一讲   游戏演示和资源的介绍    1 第二讲  "异形"怪物的实现    1 第三讲  "异形"怪物生命值的体现    9 第四讲  "异形"怪物死后处理    12 第五讲  玩家的制作    15 第六讲  玩家的行走控制(键盘)    16 第七讲  武器的切换(鼠标)     16 第八讲  摄像头的变化(鼠标)    19 第九讲  子弹预制体和特效的制作    20

微信开发回复消息收不到的最大罪魁祸首,微信公众账号为什么回复消息不成功的原因解决办法

上一篇文章讲到如何配置微信开发,以及.NET平台使用MVC做一个小DEMO的流程,还有常见收不到消息的问题,本篇文章讲的是一个很容易让人忽略但又是很重要的问题导致用户收不到响应的消息原因. 上一篇文章链接:[C#开发微信.NET平台MVC微信开发 发送普通消息Demo以及收不到消息的问题] (如果你是通过搜索引擎进来的建议你看下上篇文章,说不定就解决你的问题了) 这个问题出在代码 首先我们的C#代码是这么写的: 1 //接收/回复 消息接口 2 [HttpPost] 3 public Actio

微信公众平台开发(26) 消息回复总结

原文: http://www.cnblogs.com/imaker/p/5491433.html 一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个POST请求,开发者在响应包中返回特定xml结构,对该消息进行响应(现支持回复文本.图文.语音.视频.音乐). 三.文本回复 3.1 文本回复xml 结构 <xml> <ToUserName>

微信订阅号消息回复测试

最近在研究微信公众号开发,消息回复是订阅号基础的可获取的接口,因此先从这里开始练起. 我的服务端采用的是新浪的SAE平台,现在要想提交代码,是要每月上交10元的,有500M空间可用. 以腾讯云服务器为示例:腾讯云服务器购买入口,购买指导请参考快速入门linux云服务器. 学生党注意:腾讯公司为在读高校生提供了云+校园计划,1元/月即可使用腾讯云. 开始操作,进入微信公众开发平台后台,个人一般只能申请订阅号(限制主要功能),我这里使用的是微信的[公众平台测试帐号]. 流程: 下载微信php示例代码

微信公众号开发之自动消息回复和自定义菜单

(一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 上一篇我们大致讲解了下微信公众号开发的基本原理和流程概述.本章主要是对文本消息回复和自定义菜单做一个记录和分解 消息回复 处理请求,并响应 1)关注 也可参考官网文档:https://mp.weixin.qq.com/wiki 当微信用户关注公众账号时,可以给其适当的提示.可以是欢迎词,可以是帮助提示.示例代码如下: class EventHandler : IHandler

2014-07-24 .NET实现微信公众号的消息回复与自定义菜单

今天是在吾索实习的第12天.我们在这一天中,基本实现了微信公众号的消息回复与自定义菜单的创建. 首先,是实现消息回复,其关键点如下: 读取POST来的数据流:Stream 数据流变量 = HttpContext.Current.Request.InputStream,并把其存入数组:数据流变量.Read(数组变量, 0, (int)数据流变量.Length) 后,再转换为字符串:string 字符串变量 = Encoding.UTF8.GetString(数组变量) . 在数据流所转换成的字符串

微信公众平台开发(十) 消息回复总结——用其xml模板

一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个POST请求,开发者在响应包中返回特定xml结构,对该消息进行响应(现支持回复文本.图文.语音.视频.音乐). 三.文本回复 3.1 文本回复xml 结构 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <F

微信公众号消息回复

参照https://www.kancloud.cn/digest/wechat-java/123962 写了servlet并处理后,发现在服务器的 tomcat/logs/localhost_access.txt的日志里面 总是接收不到 微信端发送的post的请求,因为 微信的 文本消息回复原理是,用户发送消息给微信,微信把这些消息以及用户信息通过post请求发送给服务器.服务器提供post接口的URL,这个URL就是在开发者文档里配置的URL.如下所示 ,而自己为什么没有收到那? 最后发现是没