<?php
// 定义函数, 配置微信公众号服务器
function checkSignature(){
// 获取微信平台通过 get 方式发送过来的 四个参数
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$echostr = $_GET["echostr"];
$token = 'maria';
// token, timestamp, nonce 合并成一个数组
$tmpArr = array($token, $timestamp, $nonce);
// token, timestamp, nonce 字典序排序
sort($tmpArr, SORT_STRING);
// 拼接成 字符串
$tmpStr = implode( $tmpArr );
// sha1 加密
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
// 说明消息来自微信
echo $echostr;
}
// 以上代码可由以下一行代码代替, 但是不是很安全
// echo $_GET['echostr'];
}
// 调用函数
//checkSignature();
/**
// empty() 方法用户检测数据是否为空, 如果为 空 返回 true, 否则 false.
if (empty($postStr) == false) {
// libxml_disable_entity_loader() 方法的作用是: 设置是否禁止外部加载 xml 实体, 设置为 true 就是禁止, 目的是防止xml被注入攻击
libxml_disable_entity_loader(true);
// 解析 xml 格式的数据
$postObj = simplexml_load_string($postStr, "simpleXMLElement", LIBXML_NOCDATA);
// 第一级分流
switch ($postObj -> MsgType) {
case 'event':
// 1, event
handleEvent($postObj);
break;
case 'text':
// 2, text
handleText($postObj);
break;
case 'image':
// 3, image
handleImage($postObj);
break;
case 'voice':
// 4, voice
handleVoice($postObj);
break;
case 'video':
// 5, video
handleVideo($postObj);
break;
case 'shortvideo':
// 6, shortvideo
handleShortVideo($postObj);
break;
case 'location':
// 7, location
handleLocation($postObj);
break;
case 'link':
// 8, link
handleLink($postObj);
break;
default:
echo "";
break;
}
}
// 1, 定义函数, 处理一级分流中的 event 类型
function handleEvent($postObj) {
}
// 2, 定义函数, 处理一级分流中的 text 类型
function handleText($postObj) {
// 获取当前时间
$time = time();
// 设置回复的消息
$relMsg = '收到:'.$postObj->Content;
// 回复消息
$str = <<<SSS
<xml>
<ToUserName><![CDATA[{$postObj->FromUserName}]]></ToUserName>
<FromUserName><![CDATA[{$postObj->ToUserName}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{$relMsg}]]></Content>
</xml>
SSS;
echo $str;
}
// 3, 定义函数, 处理一级分流中的 Image 类型
function handleImage($postObj) {
// 获取当前时间
$time = time();
// 回复消息
$str = <<<SSS
<xml>
<ToUserName><![CDATA[{$postObj->FromUserName}]]></ToUserName>
<FromUserName><![CDATA[{$postObj->ToUserName}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[{$postObj->MediaId}]]></MediaId>
</Image>
</xml>
SSS;
echo $str;
}
// 4, 定义函数, 处理一级分流中的 Voice 类型
function handleVoice($postObj) {
// 获取当前时间
$time = time();
// 回复消息
$str = <<<SSS
<xml>
<ToUserName><![CDATA[{$postObj->FromUserName}]]></ToUserName>
<FromUserName><![CDATA[{$postObj->ToUserName}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[{$postObj->MediaId}]]></MediaId>
</Voice>
</xml>
SSS;
echo $str;
}
// 5, 定义函数, 处理一级分流中的 video 类型
function handleVideo($postObj) {
// 获取当前时间
$time = time();
$media_id='这个视频很耐斯';
// 回复消息
$str = <<<SSS
<xml>
<ToUserName><![CDATA[{$postObj->FromUserName}]]></ToUserName>
<FromUserName><![CDATA[{$postObj->ToUserName}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<Video>
<MediaId><![CDATA[{$media_id}]]></MediaId>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
</Video>
</xml>
SSS;
echo $str;
}
// 6, 定义函数, 处理一级分流中的 shortvideo 类型
function handleShortVideo($postObj) {
// 获取当前时间
$time = time();
$media_id='zm322A7MCXtlj1oRSQd_yIcfzDbxY9A9bSopA6txapIu8e6pUSwVgquCnu-0T50i';
// 回复消息
$str = <<<SSS
<xml>
<ToUserName><![CDATA[{$postObj->FromUserName}]]></ToUserName>
<FromUserName><![CDATA[{$postObj->ToUserName}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<Video>
<MediaId><![CDATA[{$media_id}]]></MediaId>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
</Video>
</xml>
SSS;
echo $str;
}
// 7, 定义函数, 处理一级分流中的 location 类型
function handleLocation($postObj) {
// 获取当前时间
$time = time();
// 设置回复的消息
$relMsg = '地点:'.$postObj->Content;
// 回复消息
$str = <<<SSS
<xml>
<ToUserName><![CDATA[{$postObj->FromUserName}]]></ToUserName>
<FromUserName><![CDATA[{$postObj->ToUserName}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{$relMsg}]]></Content>
</xml>
SSS;
echo $str;
}
// 8, 定义函数, 处理一级分流中的 link 类型
function handleLink($postObj) {
// 获取当前时间
$time = time();
// 回复消息
$str = <<<SSS
<xml>
<ToUserName><![CDATA[{$postObj->FromUserName}]]></ToUserName>
<FromUserName><![CDATA[{$postObj->ToUserName}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{$postObj->Label}]]></Content>
</xml>
SSS;
echo $str;
}
?>