您的位置:首页 > 编程语言

用户消息接收、回复代码汇总

2016-02-17 13:50 519 查看
<?php
/**
*接收用户消息
**/

//define(常量名,常量值)
define("TOKEN","weixin");

//实例化 签名及接口验证
$wechatObj = new wechatCallbackapiTest();
//isset()判断变量是否已配置
if(isset($_GET['echostr'])) {
$wechatObj->valid();
}else{
$wechatObj->responseMsg();
}

//签名及接口验证
class wechatCallbackapiTest {
//验证接口的方法
public function valid() {
$echoStr = $_GET["echostr"];
if($this->checkSignature()) {
echo $echoStr;
exit;
}
}

//签名验证程序
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);//新键名排序
$tmpStr = implode($tmpArr);//字典排序
$tmpStr = shal($tmpStr);//shal加密

//签名判断
if($tmpStr == $signature) {
return true;
}else{
return false;
}
}

//消息返回
public function responseMsg() {
//将用户端发送的数据保存到$postStr中
//由于,微信端发送的是XML的数据格式,使用$_POST无法解析
//故用$GLOBALS得到xml数据包信息
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

//用户端数据不为空时
if(!empty($postStr)) {
//安全防御用的
//对于PHP,由于simplexml_load_string 函数的XML解析问题出现在libxml库上
libxml_disable_entity_loader(true);
//是PHP中一个解析XML的函数,参数SimpleXMLElement为新对象的类
//LIBXML_NOCDATA表示将CDATA设置为文本节点,CDATA标签中的文本XML不进行解析
//返回类 SimpleXMLElement 的一个对象,该对象的属性包含 XML 文档中的数据。如果失败,则返回 false。
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
//将用户微信发来的消息类型去空格后赋予变量
$RX_TYPE = trim($postObj->MsgType);

//用户发送消息类型判断
switch($RX_TYPE) {
case "text"://文本消息
$result = $this->receiveText($postObj);
break;
case "image"://图片消息
$result = $this->receiveImage($postObj);
break;
case "voice"://语音消息
$result = $this->receiveVoice($postObj);
break;
case "video"://视频消息
$result = $this->receiveVideo($postObj);
break;
case "location"://位置消息
$result = $this->receiveLocation($postObj);
break;
case "link"://链接消息
$result = $this->receiveLink($postObj);
break;
case "event":
$result = $this->receiveEvent($postObj);
break;
default:
$result = "unknow msg type: ".$RX_TYPE;
break;
}
echo $result;
}else{
echo "";
exit;
}
}

/**
*   接收消息
**/
private function receiveText($object) {
$keyword = trim($object->Content);

if($keyword == "文本") {
$content = "文本";
$result = $this->transmitText($object,$content);
}else if($keyword == "图文" || $keyword == "单图文") {
$content = array();
$content[] = array("Title"=>"单图文标题",
"Description"=>"单图文内容",
"PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
"Url"=>"http://m.cnblogs.com/?u=txw1958");
$result = $this->transmitNews($object, $content);
}else if($keyword == "多图文") {
$content = array();
$content[] = array("Title"=>"多图文1标题",
"Description"=>"",
"PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
"Url"=>"http://m.cnblogs.com/?u=txwl958");
$content[] = array("Title"=>"多图文2标题",
"Description"=>"",
"PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
"Url"=>"http://m.cnblogs.com/?u=txwl958");
$content[] = array("Title"=>"多图文3标题",
"Description"=>"",
"PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
"Url"=>"http://m.cnblogs.com/?u=txwl958");
$result = $this->transmitNews($object, $content);
}else if($keyword == "音乐") {
$content = array("Title"=>"最炫民族风",
"Description"=>"歌手:XXX",
"MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3",
"HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");
$result = $this->transmitMusic($object, $content);
}
return $result;
}
private function receiveImage($object) {
$content = array("MediaId"=>$object->MediaId);
$result = $this->transmitImage($object, $content);
return $result;
}
private function receiveVoice($object) {
$content = array("MediaId"=>$object->MediaId);
$result = $this->transmitVoice($object,$content);
return $result;
}
private function receiveVideo($object) {
$content = array("MediaId"=>$object->MediaId,
"ThumbMediaId"=>$object->ThumbMediaId,
"Title"=>"",
"Description"=>"");
$result = $this->transmitVideo($object,$content);
return $result;
}
private function receiveLocation($object) {
$content = "位置,纬度:".$object->Location_X.";经度:".$object->Location_Y."; 缩放级别: ".$object->Scale."; 位置:".$object->Label;
$result = $this->transmitText($object,$content);
return $result;
}
private function receiveLink($object) {
$content = "链接, title:".$object->Title."; content:".$object->Description."; LinkURL:".$object->Url;
$result = $this->transmitText($object,$content);
return $result;
}
private function receiveEvent($object) {
$content = "";
switch ($object->Event) {
case "subscribe"://关注
$content = "欢迎关注!";
break;
case "unsubscribe"://取消关注
$content = "";
break;
case 'intro':
$contentStr[] = array("Title"=>"intro",
"Description"=>"Description",
"PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg",
"Url"=>"http://m.cnblogs.com/?u=txw1958");
break;
default:break;
}
$result =  $this->transmitText($object, $content);
return $result;
}

//文本
private function transmitText($object,$content) {
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>"
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
//图片
private function transmitImage($object, $imageArray) {
$itemTpl = "<Image>
<MediaId><![CDATA[%s]]></MediaId>
</Image>";
$item_str = sprintf($itemTpl, $imageArray['MediaId']);

$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName>
c6ee
;<![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
//语音
private function transmitVoice($object, $voiceArray) {
$itemTpl = "<Voice>
<MediaId><![CDATA[%s]]></MediaId>
</Voice>";
$item_str = sprintf($itemTpl, $voiceArray['MediaId']);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName,time());
return $result;
}
//视频
private function transmitVideo($object, $videoArray) {
$itemTpl = "<Video>
<MediaId><![CDATA[%s]]></MediaId>
<ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
</Video>";
$item_str = sprintf($itemTpl, $videoArray['MediaId'],
$videoArray['ThumbMediaId'],
$videoArray['Title'],
$videoArray['Description']);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName,
$object->ToUserName, time());
return $result;
}
//图文
private function transmitNews($object, $arr_item) {
if(!is_array($arr_item))
return;
$itemTpl = "<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>";
$item_str = "";
foreach ($arr_item as $item)
$item_str .= sprintf($itemTpl, $item['Title'],
$item['Description'], $item['PicUrl'],
$item['Url']);

$newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str
</Articles>
</xml>";
$result = sprintf($newsTpl, $object->FromUserName,
$object->ToUserName, time(),
count($arr_item));
return $result;
}
//音乐
private function transmitMusic($object, $musciArray) {
$itemTpl = "<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";

$item_str = sprintf($itemTpl, $musciArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);

$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";

$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
}
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  实例 微信