微信的消息推送方式是客户操作微信发生一系列事件,然后腾讯微信服务器发送一个XML数据POST请求把事件描述发送到你填写的服务器URL上,你的服务器处理完结果后,将数据输出给微信服务器。
<?php
class Response {
/*
* 自动回复类
*
* @param string $openid
*
*/
public function responseMsg($openid) {
/*
* 在最新版本PHP里面去掉了全局post的数据
* 所以我们用
* file_get_contents ( 'php://input', 'r' )
* 方法来获取xml数据
*/
@$postStr = file_get_contents ( 'php://input', 'r' );
if (! empty ( $postStr )) {
//设置时区
date_default_timezone_set ( "PRC" );
$date = date ( "Y-m-d h:i:s" );
//加载解析xml数据
libxml_disable_entity_loader ( true );
$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
//读出xml树里面的节点对象
//取得发送方的id
$fromUsername = $postObj->FromUserName;
//取得接收方的id(你的公众号id)
$toUsername = $postObj->ToUserName;
//取得消息类型
$type = $postObj->MsgType;
//取得服务器当前时间
$time = time ();
//判断消息类型
switch ($type) {
//文本消息
case "text" :
//这里也可以用case或者是数据库模糊匹配人工智能等筛选并返回回答数据
//取得用户发送的文本消息
$keyword = htmlspecialchars ( trim ( $postObj->Content ) );
if ($keyword == "你好") {
$contentStr = "你也好哟";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
break;
} else {
$contentStr = "啥?你说啥?";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
break;
}
//图片消息
case "image" :
$contentStr = "谢谢哟,我会好好保存的";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
//获取用户发送的图片
$img = file_get_contents ( $postObj->PicUrl );
break;
//声音消息
case "voice" :
$contentStr = "我现在听不懂说话的啦";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
break;
//位置消息
case "location" :
//取得用户发送的地址信息,并且返回消息加上用户地址给用户
$contentStr = "原来你在 " . $postObj->Label . "呀";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
break;
//小视频
case "shortvideo" :
//取得视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
$vimg = $postObj->ThumbMediaId;
//取得视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
$video=$postObj->MediaId ;
$contentStr = "这啥小视频???";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
break;
//视频消息
case "video" :
//取得视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
$vimg = $postObj->ThumbMediaId;
//取得视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
$video=$postObj->MediaId ;
$contentStr = "这啥视频???";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
break;
//链接消息
case "link":
$titel=$postObj->Title;
$Description=$postObj->Description;
$Url=$postObj->Url;
$contentStr ="链接标题是->{$titel} 描述是{$Description} 链接地址是{$Url}";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
break;
case "event":
$contentStr ="这是事件";
echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
break;
}
}
}
/*
* 构造发送数据的方法
*
* @param String $toU 公众号的id
*
* @param String $fromU 用户的ID
*
* @param int $time 服务器当前时间
*
* @param String $msg 文本消息内容
*
* @return 返回xml数据
*
*/
public function SendText($toU, $fromU, $time, $msg) {
$xml = "<xml>
<ToUserName><![CDATA[{$toU}]]></ToUserName>
<FromUserName><![CDATA[{$fromU}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{$msg}]]></Content>
</xml>";
return $xml;
}
}
在后面我们可以构造一个xml类来合成处理各种消息的推送方法。