我們回複使用者的訊息類型有多種,可以是簡單的文字回複,也可以是音樂回複,或者是圖文資訊回複(不能只回複一張圖片,一定要夾帶著文字)。為什麼本篇我就只將圖文回複呢?原因有多個:
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