微信消息管理之被动回复用户消息

当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。


首先处理用户发过来的消息,然后根据消息服务器做出相应的响应。

public function responseMsg(){
	//get post data, May be due to the different environments
	$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];   //用户端发来的数据
	
	//if (!empty($postStr)){
	/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
	   the best way is to check the validity of xml by yourself */
	libxml_disable_entity_loader(true);
	//通过simplexml进行数据解析,转换为对象
	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);   
	
	
	switch($postObj->MsgType){              //用户发送的消息类型
		 case "event": 
			$this->_doEvent($postObj); 
			break;
		 case "text": 
			$this->_doText($postObj); 
			break;
		 case "image": 
			$this->_doImage($postObj); 
			break;
		 case "voice": 
			$this->_doVoice($postObj); 
			break;
		 case "music": 
			$this->_doMusic($postObj); 
			break;
		case "location": 
			$this->_doLocation($postObj); 
			break;
		 default: 
			break;
	}  
		   
}

1.文本消息

//文本消息
private function _doText($postObj){
	
	$fromUsername = $postObj->FromUserName;
	$toUsername = $postObj->ToUserName;
	$keyword = trim($postObj->Content);
	$time = time();
	$textTpl = "<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[%s]]></MsgType>
				<Content><![CDATA[%s]]></Content>
				<FuncFlag>0</FuncFlag>
				</xml>";             
	$msgType = "text";
	
	switch($keyword){
		case '初音科技':
			$contentStr = "提供一流的技术支持!!";
			break;
		case 'PHP':
			$contentStr = "最美的语言!!";
			break;
		case '图文':
			$newsArr = array(
					array(
					'Title'=>'初音科技,专为高端网络定制',
					'Description'=>'初音科技,做一个品牌影响一个行业!',
					'PicUrl'=>'http://edu.zbxiaochengxu.com/o_1b9pjfv6i1111gp69pp1m45sd7q.jpg',
					'Url'=>'http://mp.weixin.qq.com/s?__biz=MzA4NTkzMzI0Ng==&mid=2652036751&idx=2&sn=641c21e3831c094cdaf40e115c9eaee6&scene=0#wechat_redirect',
				),
				array(
					'Title'=>'初音科技,专为高端网络定制',
					'Description'=>'初音科技,做一个品牌影响一个行业!',
					'PicUrl'=>'http://qfenxiang.chuyin.net.cn/weixinopen/images/0.jpg',
					'Url'=>'http://mp.weixin.qq.com/s?__biz=MzA4NTkzMzI0Ng==&mid=2652036751&idx=2&sn=641c21e3831c094cdaf40e115c9eaee6&scene=0#wechat_redirect',
				)
			);
			$this->_replayNews($postObj,$newsArr); 
			break;
		default:
			$contentStr = "启军测试微信公众号响应!!";
			break;
	} 
	
	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
	echo $resultStr;	
}

2.图片消息

//回复图片消息
private function _doImage($postObj,$mediaId){
	
	//$contentStr = "您发送的是图片信息!消息类型为:".$postObj->PicUrl."\nMediaId为:".$postObj->MediaId;
	if( $postObj->MsgType == 'image'){
		$mediaId = $postObj->MediaId;
	}
	
	$fromUsername = $postObj->FromUserName;
	$toUsername = $postObj->ToUserName;
	$time = time();
	$imageTpl = "<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[%s]]></MsgType>
				<Image>
				<MediaId><![CDATA[%s]]></MediaId>
				</Image>
				</xml>";
	$msgType = "image";
	
	//$this->_replayText($postObj,$contentStr);
	$resultStr = sprintf($imageTpl,$fromUsername,$toUsername,$time,$msgType,$mediaId);
	echo $resultStr;
}

3.语音消息

//回复语音消息
private function _doVoice($postObj,$mediaId){
	
	
	if( $postObj->MsgType == 'voice'){
		//$mediaId = $postObj->MediaId;
		$contentStr = "您发送的是语音信息!\n你说的是:".$postObj->Recognition;
		$this->_replayText($postObj,$contentStr);
		exit();
	}
	
	$fromUsername = $postObj->FromUserName;
	$toUsername = $postObj->ToUserName;
	$time = time();
	$voiceTpl = "<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[%s]]></MsgType>
				<Voice>
				<MediaId><![CDATA[%s]]></MediaId>
				</Voice>
				</xml>";
	$msgType = "voice";
	
	$resultStr = sprintf($voiceTpl,$fromUsername,$toUsername,$time,$msgType,$mediaId);
	echo $resultStr;
	
}

4.音乐消息

//音乐消息
private function _doMusic($postObj){
	
	$fromUsername = $postObj->FromUserName;
	$toUsername = $postObj->ToUserName;
	$time = time();
	$musicTpl = "<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[%s]]></MsgType>
				<Music>
				<Title><![CDATA[%s]]></Title>
				<Description><![CDATA[%s]]></Description>
				<MusicUrl><![CDATA[%s]]></MusicUrl>
				<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
				</Music>
				</xml>";             
	$msgType = "music";
	$title = "还魂门";
	$desc = "电视剧<老九门>主题曲";
	$url = "http://qfenxiang.chuyin.net.cn/weixinopen/musics/music.mp3";
	$hqurl = "http://qfenxiang.chuyin.net.cn/weixinopen/musics/music.mp3";
		
	$resultStr = sprintf($musicTpl,$fromUsername,$toUsername,$time,$msgType,$title,$desc,$url,$hqurl,$contentStr);
	echo $resultStr;
}

5.图文消息

//[封装]图文回复
private function _replayNews($postObj,$newsArr){
	
	if( !is_array($newsArr) || sizeof($newsArr)<1 ){
		$newsArr = array(
			array(
				'Title'=>'全民创业蒙的就是你,来一盆冷水吧!',
				'Description'=>'全民创业已经如火如荼,然而创业是一个非常自我的过程,它是一种生活方式的选择。从外部的推动有助于提高创业的存活率,但是未必能够提高创新的成功率。',
				'PicUrl'=>'http://yun.topthink.com/Uploads/Editor/2015-07-30/55b991cad4c48.jpg',
				'Url'=>'http://www.topthink.com/topic/11991.html',
			)
		);
	}
	
	$itemStr = '';
	foreach($newsArr as $item){
		$newsData = '<item>
						<Title><![CDATA[%s]]></Title> 
						<Description><![CDATA[%s]]></Description>
						<PicUrl><![CDATA[%s]]></PicUrl>
						<Url><![CDATA[%s]]></Url>
					</item>';
		$itemStr .= sprintf($newsData,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
	}
	
	$fromUsername = $postObj->FromUserName;
	$toUsername = $postObj->ToUserName;
	$time = time();
	$newsTpl = '<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[%s]]></MsgType>
				<ArticleCount>%s</ArticleCount>
				<Articles>'.$itemStr.'</Articles>
				</xml>';
	$msgType = 'news';
	$count = count($newsArr);
	
	$resultStr = sprintf($newsTpl,$fromUsername,$toUsername,$time,$msgType,$count,$str);
	echo $resultStr;	
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值