这篇文章要讲的是微信中的接收普通消息;
接收普通消息:顾名思义,它的作用就是接收普通用户发送的消息,并根据接收消息类型的不同,分为了六大接收接口;
- 1 文本消息
- 2 图片消息
- 3 语音消息
- 4 视频消息
- 5 小视频消息
- 6 地理位置消息
- 7 链接消息
- 视频和小视频同属一类;
它们都是通过接收xml文档接收,根据分析xml文档后根据类型判断并回复相应消息;
一:文本消息;
文本消息是我们在开发中使用特别多的类型,用户发送的文字都可以归入此类;
下面的代码就是文本消息的基本语法;
- <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位整型
如果用户发送过来的xml数据中,MsgType接点为text,就代表用户发送的就是文本消息;
在实际开发中我们该如何来识别用户发送的消息,并编写代码?;下面来打开我们之前讲过的开发工具;并打开demo接口文档
我们知道,其实这个接口文档中最重要的的就是自动回复功能
- <?php
- /**
- * wechat php test
- */
-
- //define your token
- define("TOKEN", "weixin444");
- $wechatObj = new wechatCallbackapiTest();
- $wechatObj->valid();
-
- class wechatCallbackapiTest
- {
- public function valid()
- {
- $echoStr = $_GET["echostr"];
-
- //valid signature , option
- if($this->checkSignature()){
- echo $echoStr;
- $this->responseMsg();
- exit;
- }
- }
-
- public function responseMsg()
- {
- <span style="color:#FF0000;">//get post data, May be due to the different environments
- $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
-
- //extract 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);
- $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
- $fromUsername = $postObj->FromUserName;
- $toUsername = $postObj->ToUserName;
- $keyword = trim($postObj->Content);
- $time = time();</span>//以上为接收用户的消息;可以看到,并没有接收用户消息类型,也就是MsgType;
①接收用户消息类型
- $msgType=$postObj->MsgType;//注意大小写;
-
-
- $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>";
- <h4>②对相关数据进行判断,这里是MsgType</h4> <pre name="code" class="html">if ($msgType=='text'){
- $contentStr = "您发送的是文本类型";
- $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,$contentStr);
- echo $resultStr;
- }else if(!empty( $keyword ))
{ if($keyword=="img"){ $imgTpl ="<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"; $mediaId='qS7GKu_Mhkpt0y7-BEcTR_B2FrpuBZXFTZqCcszOOll9z8PWmBSaoYo7VpVBQlmc'; $resultStr = sprintf($imgTpl, $fromUsername, $toUsername, $time, $msgType, $mediaId); echo $resultStr; }else{ $msgType = "text"; $contentStr = "阁下何不乘风起,随风直上九万里"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } }else{ echo "Input something..."; } }else { echo ""; exit; } }private function checkSignature(){ // you must define TOKEN by yourself 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); // use SORT_STRING rulesort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );return true;if( $tmpStr == $signature ){return true;}else{return false;}}}?>

这样文本接口就算测试成功了;其他几个接口类型用法一样,在这里就不多做解释了.