用户消息接收、回复代码汇总

<?php
    /**
        *接收用户消息
    **/

    //define(常量名,常量值)
    define("TOKEN","weixin");

    //实例化 签名及接口验证
    $wechatObj = new wechatCallbackapiTest();
    //isset()判断变量是否已配置
    if(isset($_GET['echostr'])) {
        $wechatObj->valid();       
    }else{
        $wechatObj->responseMsg();
    }

    //签名及接口验证
    class wechatCallbackapiTest {
        //验证接口的方法
        public function valid() {
            $echoStr = $_GET["echostr"];
            if($this->checkSignature()) {
                echo $echoStr;
                exit;
            }
        }

        //签名验证程序
        private function checkSignature() {
            if(!defined("TOKEN")) {
                throw new Exception('TOKEN is not defined!');
            }

            $signature = $_GET["signature"];//用户端签名
            $timestamp = $_GET["timestamp"];//时间戳
            $nonce = $_GET["nonce"];//随机数

            $token = TOKEN;
            $tmpArr = array($token,$timestamp,$nonce);
            sort($tmpArr);//新键名排序
            $tmpStr = implode($tmpArr);//字典排序
            $tmpStr = shal($tmpStr);//shal加密

            //签名判断
            if($tmpStr == $signature) {
                return true;
            }else{
                return false;
            }
        }

        //消息返回
        public function responseMsg() {
            //将用户端发送的数据保存到$postStr中
            //由于,微信端发送的是XML的数据格式,使用$_POST无法解析
            //故用$GLOBALS得到xml数据包信息
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

            //用户端数据不为空时
            if(!empty($postStr)) {
                //安全防御用的
                //对于PHP,由于simplexml_load_string 函数的XML解析问题出现在libxml库上
                libxml_disable_entity_loader(true);
                //是PHP中一个解析XML的函数,参数SimpleXMLElement为新对象的类
                //LIBXML_NOCDATA表示将CDATA设置为文本节点,CDATA标签中的文本XML不进行解析
                //返回类 SimpleXMLElement 的一个对象,该对象的属性包含 XML 文档中的数据。如果失败,则返回 false。
                $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 "voice"://语音消息
                        $result = $this->receiveVoice($postObj);
                        break;
                    case "video"://视频消息
                        $result = $this->receiveVideo($postObj);
                        break;
                    case "location"://位置消息
                        $result = $this->receiveLocation($postObj);
                        break;
                    case "link"://链接消息
                        $result = $this->receiveLink($postObj);
                        break;
                    case "event":
                        $result = $this->receiveEvent($postObj);
                        break;
                    default:
                        $result = "unknow msg type: ".$RX_TYPE;
                        break;
                }
                echo $result;
            }else{
                echo "";
                exit;
            }
        }

        /**
        *   接收消息        
        **/
        private function receiveText($object) {
            $keyword = trim($object->Content);

            if($keyword == "文本") {
                $content = "文本";
                $result = $this->transmitText($object,$content);
            }else if($keyword == "图文" || $keyword == "单图文") {
                $content = array();
                $content[] = array("Title"=>"单图文标题",
                                    "Description"=>"单图文内容",
                                    "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
                                    "Url"=>"http://m.cnblogs.com/?u=txw1958");
                $result = $this->transmitNews($object, $content);
            }else if($keyword == "多图文") {
                $content = array();
                $content[] = array("Title"=>"多图文1标题",
                                    "Description"=>"",
                                    "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
                                    "Url"=>"http://m.cnblogs.com/?u=txwl958");
                $content[] = array("Title"=>"多图文2标题",
                                    "Description"=>"",
                                    "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
                                    "Url"=>"http://m.cnblogs.com/?u=txwl958");
                $content[] = array("Title"=>"多图文3标题",
                                    "Description"=>"",
                                    "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
                                    "Url"=>"http://m.cnblogs.com/?u=txwl958");
                $result = $this->transmitNews($object, $content);
            }else if($keyword == "音乐") {
                $content = array("Title"=>"最炫民族风",
                                "Description"=>"歌手:XXX",
                                "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3",
                                "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");
                $result = $this->transmitMusic($object, $content);
            }
            return $result;
        }
        private function receiveImage($object) {
            $content = array("MediaId"=>$object->MediaId);
            $result = $this->transmitImage($object, $content);
            return $result;
        }
        private function receiveVoice($object) {
            $content = array("MediaId"=>$object->MediaId);
            $result = $this->transmitVoice($object,$content);
            return $result;
        }
        private function receiveVideo($object) {
            $content = array("MediaId"=>$object->MediaId, 
                            "ThumbMediaId"=>$object->ThumbMediaId,
                            "Title"=>"",
                            "Description"=>"");
            $result = $this->transmitVideo($object,$content);
            return $result;
        }
        private function receiveLocation($object) {
            $content = "位置,纬度:".$object->Location_X.";经度:".$object->Location_Y."; 缩放级别: ".$object->Scale."; 位置:".$object->Label;
            $result = $this->transmitText($object,$content);
            return $result;
        }
        private function receiveLink($object) {
            $content = "链接, title:".$object->Title."; content:".$object->Description."; LinkURL:".$object->Url;
            $result = $this->transmitText($object,$content);
            return $result;
        }
        private function receiveEvent($object) {
            $content = "";
            switch ($object->Event) {
                case "subscribe"://关注
                    $content = "欢迎关注!";
                    break;
                case "unsubscribe"://取消关注
                    $content = "";
                    break;
                case 'intro':
                    $contentStr[] = array("Title"=>"intro",
                                            "Description"=>"Description",
                                            "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
                                            "Url"=>"http://m.cnblogs.com/?u=txw1958");
                    break;
                default:break;
            }
            $result =  $this->transmitText($object, $content);
            return $result;
        }

        //文本
        private function transmitText($object,$content) {
            $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></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 transmitVoice($object, $voiceArray) {
            $itemTpl = "<Voice>
                            <MediaId><![CDATA[%s]]></MediaId>
                        </Voice>";
            $item_str = sprintf($itemTpl, $voiceArray['MediaId']);
            $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            $item_str
                        </xml>";
            $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName,time());
            return $result;
        }
        //视频
        private function transmitVideo($object, $videoArray) {
            $itemTpl = "<Video>
                            <MediaId><![CDATA[%s]]></MediaId>
                            <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                        </Video>";
                        $item_str = sprintf($itemTpl, $videoArray['MediaId'], 
                                            $videoArray['ThumbMediaId'], 
                                            $videoArray['Title'], 
                                            $videoArray['Description']);
                        $textTpl = "<xml>
                                        <ToUserName><![CDATA[%s]]></ToUserName>
                                        <FromUserName><![CDATA[%s]]></FromUserName>
                                        <CreateTime>%s</CreateTime>
                                        <MsgType><![CDATA[%s]]></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;
        }
        //音乐
        private function transmitMusic($object, $musciArray) {
            $itemTpl = "<Music>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                            <MusicUrl><![CDATA[%s]]></MusicUrl>
                            <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
                        </Music>";

            $item_str = sprintf($itemTpl, $musciArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);

            $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[music]]></MsgType>
                            $item_str
                        </xml>";

            $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
            return $result;
        }
    }
?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值