php微信公眾平台互動與介面詳解

來源:互聯網
上載者:User
這篇文章主要為大家詳細介紹了php公眾平台開發,互動與介面,具有一定的參考價值,感興趣的小夥伴們可以參考一下

本文分為三大部分為大家進行介紹,具體內容如下

1、使用者、伺服器和後台伺服器的互動

例:使用者向公眾號發送一條簡訊,這條訊息會首先傳給伺服器,伺服器處理這條資訊並將其以xml資料格式傳遞給後台伺服器,後台伺服器接受到資料後會對資料進行處理,再響應資料以xml資料格式傳遞給伺服器,伺服器再響應到使用者介面。
使用者與後台伺服器之間的互動過程就是資料傳遞過程,只不過需要需要通過伺服器這個中轉站。

那麼伺服器這個中轉站到底有什麼用?
對xml資料進行加工封裝後展現在手機螢幕上。我們接受的圖文訊息,如下:

單圖文:

多圖文

你會發現上幾乎所有的圖文都是這種格式,板式、大小都是一樣,這就是經過伺服器封裝後的結果。

2、互動的資料類型

使用者可以發送的資料類型
1、文本型(text)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";

2、語音(voice)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[voice]]></MsgType><Format><![CDATA[amr]]></Format><MsgId>5836982871638042400</MsgId><MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId><Recognition><![CDATA[]]></Recognition>//recognition表示語音辨識的結果</xml>

3、圖片( img)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/L4qjYtOibummHn90t1mnaibYiaR8ljyicF3MW7XX3BLp1qZgUb7CtZ0D]]></PicUrl><MsgId>5836982871638042400</MsgId><MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId></xml>

每一條訊息傳給伺服器後都會被標記一個MsgId,上傳的圖片、視頻、語音等也會被標記一個mediaId。

4、視頻(video)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[vedio]]></MsgType><MsgId>5836982871638042400</MsgId><MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId><ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzIclCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]></ThumbMediald>;//視頻靜止時顯示那張圖片地址</xml>

5、地理位置訊息(location)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[location]]></MsgType><MsgId>5836982871638042400</MsgId><Location_X>22.539968</Location_X><Location_Y>113.954980</Location_Y><Scale>16</Scale><Label><![CDATA[中國廣東省深圳市南山區深南大道9001號 郵遞區號: 518053]]></Label></xml>

6、連結訊息(link)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[link]]></MsgType><MsgId>5836982871638042400</MsgId><Title><![CDATA[公眾平台開發人員的江湖]]></Title><Description><![CDATA[陳坤的公眾號這段時間大火,大家...]]></Description><Url><![CDATA[http://www.cnblogs.com/txw1958/]]></Url><MsgId>5839907284805129867</MsgId></xml>

後台伺服器響應的訊息類型
1、文本型(text)
2、語音(voice)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[voice]]></MsgType><MsgId>5836982871638042400</MsgId><Voice><MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId></Voice></xml>

3、圖片( img)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[image]]></MsgType><MsgId>5836982871638042400</MsgId><Image><MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId></Image></xml>

4、視頻(video)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[vedio]]></MsgType><MsgId>5836982871638042400</MsgId><video><MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId><ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzIclCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]></ThumbMediald>;//視頻靜止時顯示那張圖片地址</video></xml>

5、音樂(music)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[voice]]></MsgType><MsgId>5836982871638042400</MsgId><Music><Title><![CDATA[最炫民族風]]></Title><Description><![CDATA[鳳凰傳奇]]></Description><MusicUrl><![CDATA[http://zj189.cn/zj/download/music/zxmzf.mp3]]></MusicUrl><HQMusicUrl><![CDATA[http://zj189.cn/zj/dodownload/music/zxmzf.mp3]]></HQMusicUrl></Music></xml>

6、圖文(news)

<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType><MsgId>5836982871638042400</MsgId><Content><![CDATA[]]></Content><ArticleCount>%s</ArticleCount><Articles><item><Title><![CDATA[ 【深圳】實況 溫度:6℃ 濕度:62﹪ 風速:東北風2級]]></Title><Description><![CDATA[]]></Description><PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl><Url><![CDATA[]]></Url></item><item><Title><![CDATA[ 【深圳】實況 溫度:6℃ 濕度:62﹪ 風速:東北風2級]]></Title><Description><![CDATA[]]></Description><PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl><Url><![CDATA[]]></Url></item></Articles></xml>

上面代碼在資料填寫方面只做參照。以上代碼在需要的時候調用即可,這裡只是為大家展現以下資料格式。
CDATA是一個標記,被其標記的文本資料中不會被xml解析器進行解析。一個 CDATA 組件以"

ToUserName 接收方帳號
FromUserName 發送方帳號
CreateTime 發送事件
MsgType 資料類型
Content 常值內容
ArticleCount 圖文數量
MsgId 資料id
MediaId 媒介id
Title 標題
Description 描述
MusicUrl 音樂串連地址
HQMusicUrl 高品質音樂串連地址

2、具體的互動步驟即代碼

在上一章圖2中,我們為測試號定義了url和token。url就是與伺服器進行通訊的後台伺服器位址,而token一個相當於一個令牌。伺服器與後台伺服器進行通訊時會出示該令牌,如果後台伺服器探索服務器與自己攜帶的令牌相同才會進行通訊,不相同則拒絕通訊 。這個過程叫做token驗證(這個令牌不是token的值)。
上面比較形象的說話,下面我通過代碼來解釋
例如:url為http://weixinceshi111111.applinzi.com/index2.php
token:weixin
index2.php代碼

<?php//// 響應使用者訊息// 公眾帳號響應給使用者的不同訊息類型//伺服器要和後台伺服器進行通訊首先要進行token驗證,會通過get方式發送signature(加密簽名)、nonce(隨機數)、timestamp(時間戳記)、echostr(隨機字串)。後台伺服器擷取之後會將timestamp、nonce與自身定義的TOKEN按照一定的順序拼接成字串,通過shal加密後獲得的結果與signature進行對比,如果相同則把echostr返回給伺服器。 表示驗證成功。header("content-type:text;charset=utf8");define("TOKEN", "weixin");//token驗證是通過get傳輸資料,使用者發送的資料通過post方式發送。先進行get請求,再進行post請求。$wechatObj = new wechatCallbackapiTest();//判斷是get請求還是post請求。$_GET['echostr']如果存在,表示是進行token驗證的get請求。反之是傳輸資料的post請求。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', );//把xml字串載入到一個SimpleXMLelement對象中。simplexml_load_string()是一種xml解析器。 $RX_TYPE = trim($postObj->MsgType);//trim去掉字串兩端kongge。 //使用者發送的訊息類型判斷 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://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=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"); $result = $this->transmitNews($object, $content); } else if($keyword == "音樂"){ //回複音樂訊息 $content = array("Title"=>"最炫民族風",  "Description"=>"歌手:鳳凰傳奇",  "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; }  /* * 回複簡訊,將要回複的xml訊息進行封裝。 */ 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);//sprintf()這個函數的作用還是比較有意思的,可以搜尋看看。 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; }}?>

3.介面

3.1 介面是什麼

介面就相當於一個工具,具備特定的功能。比如你在建造房子的時候需要在牆上鑽孔,你就會使用鑽機工具來鑽孔。從調來工具到鑽孔完成,你要完成插電、校準、鑽孔等一系列步驟,最終實現你的目標。鑽機就是我們的介面,插電、校準、鑽孔就是我們調用工具完成目的步驟。

的建立菜單介面舉例。

調用介面的步驟:
1、獲得菜單介面的串連地址,通過curl函數與這個介面建立對話。
2、把建立菜單資料發送給這個介面。
介面調用完成,這個介面會自動把這些資料進行處理並在公眾好頁面產生菜單。

介面的調用方式請看下一章:公眾平台開發(三):進階介面的調用。

以上就是本文的全部內容,希望對大家的學習有所協助。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.