微信公眾號最佳實踐 ( 3.2) 被動回覆使用者訊息
阿新 • • 發佈:2019-02-16
<?php
//
// 響應使用者訊息
// 微信公眾賬號響應給使用者的不同訊息型別
//
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET ["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$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;
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://dq095.applinzi.com/1.jpg",
"Url" =>"http://dq095.applinzi.com/1.jpg");
$result = $this->transmitNews($object, $content);
}
else if($keyword == "多圖文"){ //回覆多圖文訊息
$content = array();
$content[] = array("Title"=>"多圖文1標題", "Description"=>"", "PicUrl"=>"http://dq095.applinzi.com/3.png", "Url" =>"http://dq095.applinzi.com/3.png");
$content[] = array("Title"=>"多圖文2標題", "Description"=>"", "PicUrl"=>"http://dq095.applinzi.com/4.png", "Url" =>"http://dq095.applinzi.com/4.png");
$content[] = array("Title"=>"多圖文3標題", "Description"=>"", "PicUrl"=>"http://dq095.applinzi.com/6.png", "Url" =>"http://dq095.applinzi.com/6.png");
$result = $this->transmitNews($object, $content);
}
else if($keyword == "音樂"){ //回覆音樂訊息
$content = array("Title"=>"歡樂頌",
"Description"=>"貝多芬",
"MusicUrl"=>"http://dq095.applinzi.com/歡樂頌.mp3",
"HQMusicUrl"=>"http://dq095.applinzi.com/歡樂頌.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 transmitText($object, $content)
{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></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><![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[voice]]></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[video]]></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, $musicArray)
{
$itemTpl = "<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";
$item_str = sprintf($itemTpl, $musicArray['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;
}
}
?>