zoukankan      html  css  js  c++  java
  • 微信公众平台开发【接收消息】接收普通消息

    当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。服务器在解析此数据包,获取相关参数的值从而做出回复。接收普通消息主要包括:文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息、链接消息。XML数据包结构和相关参数如下:

    1、文本消息

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName> 
     <CreateTime>1348831860</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[this is a test]]></Content>
     <MsgId>1234567890123456</MsgId>
     </xml>
    参数				描述
    ToUserName		开发者微信号
    FromUserName	 发送方帐号(一个OpenID)
    CreateTime	 	消息创建时间 (整型)
    MsgType	 		text
    Content	 		文本消息内容
    MsgId	 		消息id,64位整型

    那么这些参数该如何获取呢,示例代码如下:

    index.php(完整代码下载

    <?php
    /**
      * 作者:smalle
      * 网址:http://blog.csdn.net/oldinaction
      * 微信公众号:smallelife
      */
    
    //定义 token
    define("TOKEN", "smalle");
    //实例化对象
    $wechatObj = new wechatCallbackapiTest();
    //调用函数
    if (isset($_GET['echostr'])) {
    	$wechatObj->valid();
    }else{
    	$wechatObj->responseMsg();
    }
    
    class wechatCallbackapiTest
    {
    	public function valid()
    	{
    		$echoStr = $_GET["echostr"];
    		if($this->checkSignature()){
    			echo $echoStr;
    			exit;
    		}
    	}
    
    	public function responseMsg()
    	{
    		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
    
    		if (!empty($postStr)){  
    			libxml_disable_entity_loader(true);//安全防护  
    			$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);  
    			$fromUsername = $postObj->FromUserName;  
    			$toUsername = $postObj->ToUserName;
    			$createTime = $postObj->CreateTime;
    			$msgType = $postObj->MsgType;
    			$content = $postObj->Content;
    			$msgId = $postObj->MsgId;
    			if($msgType == 'text'){
    				$textTpl = "<xml>  
    						<ToUserName><![CDATA[%s]]></ToUserName>  
    						<FromUserName><![CDATA[%s]]></FromUserName>  
    						<CreateTime>%s</CreateTime>  
    						<MsgType><![CDATA[text]]></MsgType>  
    						<Content><![CDATA[%s]]></Content>  
    						<FuncFlag>0</FuncFlag>  
    						</xml>";
    				$time = time();
    				$contentStr = "您发的是消息包含以下信息:
    发信人OpenID:".$fromUsername."
    收信人微信号:".$toUsername."
    发信时间:".$createTime."
    消息类型:".$msgType."
    消息内容:".$content."
    消息ID:".$msgId;  
    				$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);  
    				echo $resultStr;  
    			}else{
    				$textTpl = "<xml>  
    						<ToUserName><![CDATA[%s]]></ToUserName>  
    						<FromUserName><![CDATA[%s]]></FromUserName>  
    						<CreateTime>%s</CreateTime>  
    						<MsgType><![CDATA[text]]></MsgType>  
    						<Content><![CDATA[%s]]></Content>  
    						<FuncFlag>0</FuncFlag>  
    						</xml>";
    				$time = time();
    				$contentStr = "您发的消息类型不是文本。而是".$msgType;
    				$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);  
    				echo $resultStr;  
    			}
    
    		}
    	}
    		
    	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, SORT_STRING);
    		$tmpStr = implode( $tmpArr );
    		$tmpStr = sha1( $tmpStr );
    		
    		if( $tmpStr == $signature ){
    			return true;
    		}else{
    			return false;
    		}
    	}
    }
    
    ?>

    效果预览:


    代码分析:

    • 第32-42行【$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];......$msgId = $postObj->MsgId;】:实现获取用户发送过来的消息数据。
    • 第43-55行【if($msgType == 'text'){......echo $resultStr;】:实现的是被动回复文本消息给用户

    2、图片消息

    使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName>
     <CreateTime>1348831860</CreateTime>
     <MsgType><![CDATA[image]]></MsgType>
     <PicUrl><![CDATA[http://blog.csdn.net/oldinaction]]></PicUrl>
     <MediaId><![CDATA[media_id]]></MediaId>
     <MsgId>1234567890123456</MsgId>
     </xml>
    参数				描述
    ToUserName		开发者微信号
    FromUserName	发送方帐号(一个OpenID)
    CreateTime		消息创建时间 (整型)
    MsgType	 		image
    PicUrl	 		图片链接
    MediaId	 		图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
    MsgId	 		消息id,64位整型

    3、语音消息

    使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <MediaId><![CDATA[media_id]]></MediaId>
    <Format><![CDATA[Format]]></Format>
    <MsgId>1234567890123456</MsgId>
    </xml>
    参数				描述
    ToUserName		开发者微信号
    FromUserName	发送方帐号(一个OpenID)
    CreateTime		消息创建时间 (整型)
    MsgType	 		语音为voice
    MediaId	 		语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
    Format	 		语音格式,如amr,speex等
    MsgID	 		消息id,64位整型

    请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段(注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启语音识别后的语音XML数据包如下:

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <MediaId><![CDATA[media_id]]></MediaId>
    <Format><![CDATA[Format]]></Format>
    <Recognition><![CDATA[腾讯微信团队]]></Recognition>
    <MsgId>1234567890123456</MsgId>
    </xml>

    多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。

    4、视频消息

    使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType><![CDATA[video]]></MsgType>
    <MediaId><![CDATA[media_id]]></MediaId>
    <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
    <MsgId>1234567890123456</MsgId>
    </xml>
    参数				描述
    ToUserName		开发者微信号
    FromUserName	发送方帐号(一个OpenID)
    CreateTime		消息创建时间 (整型)
    MsgType	 		视频为video
    MediaId	 		视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
    ThumbMediaId		视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
    MsgId	 		消息id,64位整型

    5、小视频消息

    使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType><![CDATA[shortvideo]]></MsgType>
    <MediaId><![CDATA[media_id]]></MediaId>
    <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
    <MsgId>1234567890123456</MsgId>
    </xml>
    参数				描述
    ToUserName		开发者微信号
    FromUserName	发送方帐号(一个OpenID)
    CreateTime		消息创建时间 (整型)
    MsgType	 		小视频为shortvideo
    MediaId	 		视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
    ThumbMediaId		视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
    MsgId	 		消息id,64位整型

    6、地理位置消息

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1351776360</CreateTime>
    <MsgType><![CDATA[location]]></MsgType>
    <Location_X>23.134521</Location_X>
    <Location_Y>113.358803</Location_Y>
    <Scale>20</Scale>
    <Label><![CDATA[位置信息]]></Label>
    <MsgId>1234567890123456</MsgId>
    </xml> 
    参数				描述
    ToUserName		开发者微信号
    FromUserName	发送方帐号(一个OpenID)
    CreateTime		消息创建时间 (整型)
    MsgType	 		location
    Location_X		地理位置维度
    Location_Y		地理位置经度
    Scale	 		地图缩放大小
    Label	 		地理位置信息
    MsgId	 		消息id,64位整型

    当用户给公众账号发送位置时,便可以获取相应的地理位置信息。部分示例代码如下:

    index.php(完整代码下载

    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
    
    if (!empty($postStr)){  
    	libxml_disable_entity_loader(true);//安全防护  
    	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);  
    	$fromUsername = $postObj->FromUserName;  
    	$toUsername = $postObj->ToUserName;
    	$msgType = $postObj->MsgType;
    	$j = $postObj->Location_Y;//经度
    	$w = $postObj->Location_X;//纬度
    	$label = $postObj->Label;//地理位置信息
    	if($msgType == 'location'){
    		$textTpl = "<xml>  
    				<ToUserName><![CDATA[%s]]></ToUserName>  
    				<FromUserName><![CDATA[%s]]></FromUserName>  
    				<CreateTime>%s</CreateTime>  
    				<MsgType><![CDATA[text]]></MsgType>  
    				<Content><![CDATA[%s]]></Content>  
    				<FuncFlag>0</FuncFlag>  
    				</xml>";
    		$time = time();
    		$contentStr = "您的位置信息如下:
    经度:".$j."
    纬度:".$w."
    地理位置信息:".$label;
    		$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);  
    		echo $resultStr;  
    	}else{
    		echo '';
    	}
    
    }

    效果展示:

    现在你可能觉得这一小串数字没什么用,到后面我会分享一些关于位置信息的小案例,那个时候就起作用了。


    7、链接消息

    使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1351776360</CreateTime>
    <MsgType><![CDATA[link]]></MsgType>
    <Title><![CDATA[公众平台官网链接]]></Title>
    <Description><![CDATA[公众平台官网链接]]></Description>
    <Url><![CDATA[url]]></Url>
    <MsgId>1234567890123456</MsgId>
    </xml>
    参数				描述
    ToUserName		接收方微信号
    FromUserName	发送方微信号,若为普通用户,则是一个OpenID
    CreateTime		消息创建时间
    MsgType	 		消息类型,link
    Title	 			消息标题
    Description		消息描述
    Url	 			消息链接
    MsgId	 		消息id,64位整型




    ===================================微笑微笑微笑===================================

    关注【Smalle】【微信公众号:smallelife】              微笑             捐赠【Smalle】【微信公众号:smallelife】

    关注就有豪礼相送哦,羡慕源码、羡慕工具、羡慕文档应有尽有      微笑       你的扫码便是我前进的动力,羡慕扫码、羡慕扫码、羡慕扫码

    ===================================微笑微笑微笑===================================

     

                                         


  • 相关阅读:
    asp.net BS拖拽工作流设计及研发(附Demo源码)
    分享NOSQL开发实战
    jQuery插件开发实战
    asp.net搜索引擎(网络爬虫)设计及研发
    asp.net 统一认证及单点登录平台解决方案系列<一>
    ubuntu安装python的psycopg2库时报错
    记一次工作中的小坑(关于celery)
    ssh错误 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    使用nobody运行redis
    安装python图像处理库PIL
  • 原文地址:https://www.cnblogs.com/oldinaction/p/5167464.html
Copyright © 2011-2022 走看看