用户消息接收、回复代码汇总
2016-02-17 13:50
519 查看
<?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> c6ee ;<![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; } } ?>
相关文章推荐
- 社交巨头三国杀:微信、WhatsApp、Line到底有啥区别?
- 微信悄悄升级群聊功能:个人微信营销号的福音
- 突击部队拼多多
- 我是运营,我没有假期
- 如何做到日消息量100万的微信公众号?
- 论微信取消推送功能的可能性(原创)
- 微信的成功,靠的是QQ导流吗?
- 「Linux 中国」2018 微信文章排行榜
- 交换机升级排障实例
- 微信服务号推送模板消息接口
- sql2008启动代理未将对象应用到实例解决方案
- PHP限制页面只能在微信自带浏览器访问的代码
- HTML5实现微信拍摄上传照片功能
- 微信小程序去哪里找 小程序到底如何使用(附小程序名单)
- 初识JQuery 实例一(first)
- JQuery入门基础小实例(1)
- 使用jQuery.wechat构建微信WEB应用