这篇文章要讲的是微信中的接收普通消息;
接收普通消息:顾名思义,它的作用就是接收普通用户发送的消息,并根据接收消息类型的不同,分为了六大接收接口;
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;}}}?>
这样文本接口就算测试成功了;其他几个接口类型用法一样,在这里就不多做解释了.