微信公眾平臺開發接口PHP SDK完整版

官方提供的SDK只有一個文本消息功能,我們將所有消息的消息類型及事件響應都整理了進來,并且加入日志記錄,代碼如下:

?

更新日志:

2013-01-01 版本1.0
2014-03-15 增加圖片、視頻、語音的內容回復
2014-04-09 增加菜單鏈接事件
2014-04-10 修改文本回復的判定方法

<?php
/*方倍工作室CopyRight 2014 All Rights Reserved
*/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, SORT_STRING);$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)){$this->logger("R ".$postStr);$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType);switch ($RX_TYPE){case "event":$result = $this->receiveEvent($postObj);break;case "text":$result = $this->receiveText($postObj);break;case "image":$result = $this->receiveImage($postObj);break;case "location":$result = $this->receiveLocation($postObj);break;case "voice":$result = $this->receiveVoice($postObj);break;case "video":$result = $this->receiveVideo($postObj);break;case "link":$result = $this->receiveLink($postObj);break;default:$result = "unknow msg type: ".$RX_TYPE;break;}$this->logger("T ".$result);echo $result;}else {echo "";exit;}}//接收事件消息private function receiveEvent($object){$content = "";switch ($object->Event){case "subscribe":$content = "歡迎關注方倍工作室 ";$content .= (!empty($object->EventKey))?("\n來自二維碼場景 ".str_replace("qrscene_","",$object->EventKey)):"";break;case "unsubscribe":$content = "取消關注";break;case "SCAN":$content = "掃描場景 ".$object->EventKey;break;case "CLICK":switch ($object->EventKey){case "COMPANY":$content = "方倍工作室提供互聯網相關產品與服務。";break;default:$content = "點擊菜單:".$object->EventKey;break;}break;case "LOCATION":$content = "上傳位置:緯度 ".$object->Latitude.";經度 ".$object->Longitude;break;case "VIEW":$content = "跳轉鏈接 ".$object->EventKey;break;default:$content = "receive a new event: ".$object->Event;break;}$result = $this->transmitText($object, $content);return $result;}//接收文本消息private function receiveText($object){switch ($object->Content){case "文本":$content = "這是個文本消息";break;case "圖文":case "單圖文":$content = array();$content[] = array("Title"=>"單圖文標題",  "Description"=>"單圖文內容", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");break;case "多圖文":$content = array();$content[] = array("Title"=>"多圖文1標題", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");$content[] = array("Title"=>"多圖文2標題", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");$content[] = array("Title"=>"多圖文3標題", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");break;case "音樂":$content = array("Title"=>"最炫民族風", "Description"=>"歌手:鳳凰傳奇", "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3", "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");break;default:$content = date("Y-m-d H:i:s",time());break;}if(is_array($content)){if (isset($content[0]['PicUrl'])){$result = $this->transmitNews($object, $content);}else if (isset($content['MusicUrl'])){$result = $this->transmitMusic($object, $content);}}else{$result = $this->transmitText($object, $content);}return $result;}private function receiveImage($object){$content = array("MediaId"=>$object->MediaId);$result = $this->transmitImage($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 receiveVoice($object){if (isset($object->Recognition) && !empty($object->Recognition)){$content = "你剛才說的是:".$object->Recognition;$result = $this->transmitText($object, $content);}else{$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 receiveLink($object){$content = "你發送的是鏈接,標題為:".$object->Title.";內容為:".$object->Description.";鏈接地址為:".$object->Url;$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[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, $newsArray){if(!is_array($newsArray)){return;}$itemTpl = "    <item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item>
";$item_str = "";foreach ($newsArray 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($newsArray));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;}private function logger($log_content){if(isset($_SERVER['HTTP_APPNAME'])){   //SAEsae_set_display_errors(false);sae_debug($log_content);sae_set_display_errors(true);}else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL$max_size = 10000;$log_filename = "log.xml";if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);}}
}?>

?

轉載于:https://www.cnblogs.com/joshua317/articles/3713376.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273759.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ3570 : DZY Loves Physics I

考慮兩個質量均為m&#xff0c;速度分別v1、v2的小球發生完全彈性碰撞的影響&#xff1a; 由動能守恒得&#xff1a; $\frac{1}{2}mv_1^2\frac{1}{2}mv_2^2\frac{1}{2}mv_1^2\frac{1}{2}mv_2^2$$v_1^2v_2^2v_1^2v_2^2$ 由動量守恒得&#xff1a; $mv_1mv_2mv_1mv_2$$v_1v_2v_1v…

數據庫---主鍵約束

1、設置主鍵約束(1)、方式一&#xff1a;創建表時&#xff0c;在字段在描述處聲明指定字段為主鍵&#xff1b; CREATE TABLE 表名(字段 類型(長度) PRIMARY KEY,字段 類型(長度) );CREATE TABLE STUDENT(STU_ID INT PAIMARY KEY,STU_NAME VARCHAR(255) );(2)、方式二&#xff1…

關于VS2010幫助文檔的使用和VC6.0在Win7 64位下的使用

由于購置了新的電腦&#xff0c;安裝的是Win7 64位的操作系統&#xff0c;這兩天我在重新安裝編程環境的時候遇到一些問題&#xff0c;現在都解決掉了&#xff0c;分享出來以供需要的人參考。 一、以前使用的是VS2008&#xff0c;從VC6到2008這么多年了一只使用的MSDN是帶索引的…

數據庫---聚合查詢

聚合查詢&#xff1a;縱向查詢&#xff0c;它是對一列的值進行計算&#xff0c;然后返回一個單一的值&#xff1b;另外聚合查詢是忽略空值。 ?count&#xff1a;統計指定列不為NULL的記錄行數&#xff1b;?sum&#xff1a;計算指定列的數值和&#xff0c;如果指定列類型不是數…

【記憶法】心智繪圖

心智繪圖方法 1.提出具體、明確的記憶任務(以30min為單位) 記憶25min休息5min2.及時復習&#xff0c;減少遺忘(記憶關鍵字) 看到關鍵詞能夠回想起全部的內容。看到關鍵詞能夠產生生動的圖像。3.平時多背誦 有時間多記一些小東西、小片段4.復述和再現 聽到或看到什么好的故事要及…

數據庫---分組查詢

一、分組查詢&#xff1a;指使用group by字句對查詢信息進行分組。格式&#xff1a; SELECT 字段1,字段2... FROM 表名 GROUP BY 分組字段 HAVING 分組條件; 分組操作中的having子語句&#xff0c;是用于在分組后對數據進行過濾的&#xff0c;作用類似于where條件。 1、having與…

centos安裝coreseek

安裝依賴 yum install make gcc g gcc-c libtool autoconf automake imake mysql-devel libxml2-devel expat-devel 下載coreseek 4.1 $ wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz $ tar xzvf coreseek-4.1-beta.tar.gz $ cd coreseek-4.1-beta…

HTML---HTML簡介

1、HTML簡介&#xff1a;*什么事HTML&#xff1f; -HypperText Markup Language&#xff1a;超文本標記語言&#xff0c;網頁語言。**超文本&#xff1a;超出文本的范疇&#xff0c;使用HTML可以輕松實現簡單操作。**標記&#xff1a;HTML所有的操作都是通過標記實現的&…

谷歌Android各版本的代號變遷

簡單回顧下Android發展歷程2003年10月&#xff0c;Andy Rubin&#xff08;安迪魯賓&#xff09;等人創建Android公司&#xff0c;并組建Android團隊。2005年8月17日&#xff0c;Google低調收購了成立僅22個月的高科技企業Android及其團隊。安迪魯賓成為Google公司工程部副總裁&…

HTMLL---HTML中常用標簽(文字、注釋標簽)

1、文字標簽和注釋標簽*文字標簽和注釋標簽- <font></font>-屬性* size:文字的大小&#xff0c;取值范圍1-7&#xff0c;超出7默認為7* color:文字的顏色-兩種表示方式**英文單詞&#xff1a; red, green, blue, black, white, yellow, gray**使用十六進制數表示&a…

Map.Entry

如何簡便的遍歷Map 你是否已經對每次從Map中取得關鍵字然后再取得相應的值感覺厭倦&#xff1f; 使用JDK5的增強for循環&#xff0c;來遍歷Map,簡單多了&#xff0c;比Map.Entry還方便。 看代碼&#xff1a; Java代碼 for (String key : map.keySet()) { System.out.pri…

HTML---HTML中常用的標簽(標題,水平,特殊標簽)

1、標題標簽、水平標簽和特殊字符*標題標簽- <h1>... </h1>、 <h2>... </h2>、 <h3>... </h3>、... <h6>... </h6>-特點&#xff1a;從h1到h6字體由大到小、同時 自動換行。*水平標簽- <hr/>-屬性** size&#xff1a;水…

圖解SQL的inner join(join)、left join、right join、full outer join、union、union all的區別...

對于SQL的Join&#xff0c;在學習起來可能是比較亂的。我們知道&#xff0c;SQL的Join語法有很多inner的&#xff0c;有outer的&#xff0c;有left的&#xff0c;有時候&#xff0c;對于Select出來的結果集是什么樣子有點不是很清楚。Coding Horror上有一篇文章,通過文氏圖 Ven…

數據庫---四中連接查詢(交叉、左連接、右連接、完整查詢)

個人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思遠Y 1、交叉連接查詢 : (基本不適用---得到的是兩張表數據的乘積) 語法&#xff1a;SELECT * FROM 表1,表2; PS&#xff1a;與表關系無關 示例&#xff…

如何用C#語言構造蜘蛛程序

"蜘蛛"&#xff08;Spider&#xff09;是Internet上一種很有用的程序&#xff0c;搜索引擎利用蜘蛛程序將Web頁面收集到數據庫&#xff0c;企業利用蜘蛛程序監視競爭對手的網站并跟蹤變動&#xff0c;個人用戶用蜘蛛程序下載Web頁面以便脫機使用&#xff0c;開發者利…

數據庫---練習題(45道)

準備工作 CREATE DATABASE STUDENTS; CREATE TABLE STUDENT( SNO VARCHAR(32) PRIMARY KEY NOT NULL, SNAME VARCHAR(32) NOT NULL, SSEX VARCHAR(32) NOT NULL, SBIRTHDAY DATETIME, CLASS VARCHAR(20) ); CREATE TABLE COURSE( CNO VARCHAR(20) PRIMARY KEY NOT NULL, CNAM…

LeetCode OJ - Populating Next Right Pointers in Each Node II

題目&#xff1a; Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solution still work? Note: You may only use constant extra space.For example,Given the fo…

數據庫---JDBC

1.1 JDBC概述JDBC&#xff08;Java DataBase Connectivity,java數據庫連接&#xff09;是一種用于執行SQL語句的Java API。JDBC是Java訪問數據庫的標準規范&#xff0c;可以為不同的關系型數據庫提供統一訪問&#xff0c;它由一組用Java語言編寫的接口和類組成。 JDBC需要連接驅…

23種設計模式之簡單工廠

簡單工廠模式描述的是&#xff0c;通過類的繼承關系&#xff0c;父類&#xff08;工廠類&#xff09;與子類&#xff08;產品類&#xff09;&#xff0c;調用父類中的方法&#xff0c;實際干活兒的是子類中的方法&#xff1b;封裝需求的不確定性&#xff0c;做出通用的編程&…

原生JDBC操作數據庫流程

1、class.forName()加載數據驅動 2、DriverManager.getConnection()獲取數據庫連接對象。 3、根據SQL或sql會話對象&#xff0c;有兩種方式Statement、PreparedStatement。 4、執行sql處理結果集&#xff0c;如果有參數就設置參數。 5、關閉結果集&#xff0c;關閉會話&#xf…