【玩轉微信公眾平台之十】 圖文訊息回複講解

來源:互聯網
上載者:User

我們回複使用者的訊息類型有多種,可以是簡單的文字回複,也可以是音樂回複,或者是圖文資訊回複(不能只回複一張圖片,一定要夾帶著文字)。為什麼本篇我就只將圖文回複呢?原因有多個:
1、音樂回複我沒搞過;
2、文字回複前一篇說過;
3、圖文回複個人覺得偏難了點,所以重點講;
4、博主又要湊部落格篇數了...(沒錯,答對了)


--------------------------
1、在開始講解圖文訊息回複之前,我要補講一些東西:在範例程式碼講解的那篇部落格裡,我下面這段代碼跳過去了:

$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";

$textTpl這貨怎麼看起來如此眼熟?沒錯,我們在回複使用者的文字訊息( 注意是文字訊息)時,都會用到它,如下面這句:
$msgType = "text";$contentStr = "感謝您的關注,回複“1”查看博主ID;回複“2”查看博主愛好";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;

它的作用就是將我們要發給使用者的文字訊息合成為xml格式文本,這個文本裡包含使用者的OpenID,公眾號的ID,系統時間,訊息類型,回複的文字內容。那麼,什麼是xml格式呢?

XML是一種簡單的資料存放區語言,它要求每一個標籤都有開始和結束標記,可以進行嵌套,它裡面的每個欄位(就是每種資訊)都必須以<>開頭,</>結尾,如下:
<xml><content><id>博主ID</id><age>博主年齡</age></content></xml>
xml簡單分析到這裡, 下面回過頭來繼續看$textTpl這個變數
$textTpl = "<xml>//這裡表明是xml格式<ToUserName><![CDATA[%s]]></ToUserName>//儲存公眾號的ID<FromUserName><![CDATA[%s]]></FromUserName>//儲存使用者OpenID<CreateTime>%s</CreateTime>//儲存系統時間<MsgType><![CDATA[%s]]></MsgType>//儲存訊息類型<Content><![CDATA[%s]]></Content>//儲存要發送到訊息內容<FuncFlag>0</FuncFlag>//是否星標(別管這個)</xml>";

恩,上面的代碼注釋還算比較好理解吧, 可能唯一不理解的就是[CDATA[%S]]這貨是什麼玩意,CDATA表示不轉義,不理解也沒事,主要還是看%s,它表示要轉換成字串的資料類型。翻譯成白話文就是%s表示一個剛出生的嬰兒,這個嬰兒的類型的字串類型(可以理解為女的),我們都知道嬰兒剛出生時全部資訊都是一片空白,沒有姓名,沒有戶口之類的,這就是%s的含義,表示一片空白,等待你來開發,如下面這句:
<Content><![CDATA[%s]]></Content>
此時Content裡是沒有內容的,所以就需要我們來傳送內容進入,怎麼傳呢?用 sprintf()這個函數,它的格式如下:
sprintf(baby,$name,$country,...);
第一個參數baby表示將要被傳送內容的xml格式變數(嬰兒),將$name傳給baby中第一個出現%s的位置,將$country傳給第2個出現%s的位置,以此類推


最後我們再回過頭來看下這句:
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;
是不是知道怎麼回事了? $textTpl就是xml格式變數,接下來將$fromUsername傳給textTpl,然後是tuUsername,然後...,最後將全新的textTpl傳給resultStr這個變數,然後發送給使用者。

2、下面進入正題,如何回複圖文訊息。
下面是回複圖文訊息的一些格式:

        

也可以點擊這個連結查看:點擊開啟連結

上面描述的很詳細了, 這裡需要注意單圖的時候會顯示描述(Descripition),而多圖不會顯示描述。第一張為item大圖,像素為640x320,下面的item圖片為小圖,像素為80x80,Url為圖片的連結,所以在這之前我們需要事先將圖片上面到SAE伺服器上(要不然你圖片的連結哪來?)。
下面我先搞個回複單圖的模式,先配置圖文訊息的xml,類似簡訊的$textTpl。
$imageTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType>//訊息類型為news(圖文)<ArticleCount>1</ArticleCount>//圖文數量為1(單圖文)<Articles><item>//第一張圖文訊息<Title><![CDATA[%s]]></Title> //標題<Description><![CDATA[]]></Description>//描述為空白(懶得描述)<PicUrl><![CDATA[%s]]></PicUrl>//開啟前的圖片連結地址<Url><![CDATA[%s]]></Url>//點擊進入後顯示的圖片連結地址</item></Articles></xml> ";

好了,圖文訊息的回複模板已經搞好了,接下來就是將圖片訊息的標題,圖片等資訊填滿了,代碼如下:
$title = "哎呦我去,又下雨了";//標題$PicUrl = "http://1.star530.sinaapp.com/weather.jpg";//圖片連結$Url = "http://1.star530.sinaapp.com/weather.jpg";//開啟後的圖片連結$resultStr = sprintf($imageTpl, $fromUsername, $toUsername, $time, $title, $PicUrl,$Url);echo $resultStr;
運行效果如下:


恩,就是這樣,完整的代碼如下:
public function responseMsg()    {//get post data, May be due to the different environments$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];      //extract post dataif (!empty($postStr)){                              $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);                $fromUsername = $postObj->FromUserName;                $toUsername = $postObj->ToUserName;                $keyword = trim($postObj->Content);                $time = time();                $textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";     $imageTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType>//訊息類型為news(圖文)<ArticleCount>1</ArticleCount>//圖文數量為1(單圖文)<Articles><item>//第一張圖文訊息<Title><![CDATA[%s]]></Title> //標題<Description><![CDATA[]]></Description>//描述為空白(懶得描述)<PicUrl><![CDATA[%s]]></PicUrl>//開啟前的圖片連結地址<Url><![CDATA[%s]]></Url>//點擊進入後顯示的圖片連結地址</item></Articles></xml> ";if(!empty( $keyword ))                {$title = "哎呦我去,又下雨了";//標題$PicUrl = "http://1.star530.sinaapp.com/weather.jpg";//圖片連結$Url = "http://1.star530.sinaapp.com/weather.jpg";//開啟後的圖片連結$resultStr = sprintf($imageTpl, $fromUsername, $toUsername, $time, $title, $PicUrl,$Url);echo $resultStr;                }else{                echo "Input something...";                }        }else {        echo "";        exit;        }    }}

好了,就這樣。

本來是安排一周的時間將這個系列教程寫完的,結果因為各種原因只完成了十篇。所以呢,就先寫到這吧,等下次有抽出時間再繼續吧...

後會有期~~

尊重原創,轉載請註明來源:http://blog.csdn.net/star530/article/details/26139129

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.