PHP公眾開發筆記系列
日期:2014.9.1
需求分析:
在成功的開啟了開發人員服務之後,我們便需要開始做響應使用者操作的功能了。其實做公眾平台,當初的目的我就是想做成一個服務平台,因為剛大學畢業,同學各奔東西。有的時候可能我們會到一個陌生的城市去,那時可能就會想啊,這個城市有班上的同學在嗎?這時掏出手機,點開服務號輸入這個城市名,就會返回一串資訊,假如有同學在這個城市,就會列出聯絡資訊之類的。當然也許會說,既然是熟悉的同學,那麼肯定會知道連絡方式之類的,還需要這樣多此一舉麼。而我的考慮是,有的時候多一種提示也是有點用處的。扯多了,提一提我設想的功能需求吧:
1、菜單功能:
這裡提到的菜單並不是底部的幾個自訂菜單,因為那個是需要錢的,而我現在是想做一個免費的來練手用。所以我設想的菜單功能是,使用者輸入指定的文本資訊,公眾平台將會響應相應的操作,如發送查詢,公眾平台將會返回諸如查詢同學資訊請發送1,查詢xx資訊請發送2之類的。這就實現了一個簡單的菜單功能了。
2、資料處理:
因為我們需要查詢資訊,那麼就需要將資訊儲存下來,用的就是資料庫管理。將班上同學的各種資訊歸類處理好,儲存至資料庫,然後在響應查詢請求的時候就是直接對資料庫資訊進行處理,返回相應的資訊。
以上的這兩點也是我的初衷,簡單的做資訊查詢處理,在這兩個功能做好了之後,再擴充其他的功能。提出了功能需求之後,就是實現這些功能了。
實現需求:
1、實現菜單功能:
使用者發送相應的訊息,公眾平台響應響應的操作。這個就是處理使用者的發送訊息了,這裡就需要對使用者的發送訊息做處理了,我們跳轉到範例程式碼中處理訊息的函數:
這個函數就是處理使用者發送過來的訊息的函數了,我們要做的就是對這個函數進行擴充。
分析分析這個函數吧,函數名不去看了,直接看函數體,挑重點的來:
其實這些在的公眾開發人員文檔中都說得很清楚了,現在我用自己的廢話再來說一遍吧。
文檔中說了,當普通使用者向公眾帳號發送訊息時,伺服器將POST訊息的XML資料包到開發人員填寫的URL上,因此訊息是以XML格式的資料包發送的。
1)首先得到xml資料包資訊:
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
2)然後我們可以看到這個函數中有一個這樣的語句:
libxml_disable_entity_loader(true);
這個語句直接百度的時候,查到的資訊是做安全防禦用的:
對於PHP,由於simplexml_load_string 函數的XML解析問題出現在libxml庫上,所以載入實體前可以調用這樣一個函數,就是我們這提到的這個函數了( http://www.cnhonkerarmy.com/archiver/tid-214036.html),所以這一句也應該是考慮到了安全問題。
3)得到了資料之後,然後我們就是要解析伺服器發送過來的xml資料包了,這裡執行的是:
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
從文法來看,應該是對得到的postStr資料進行解析吧,解析之後就得到了我們需要的資訊了:
$fromUsername = $postObj->FromUserName; //這一句便是得到誰發給公眾號,我們之後處理回複資訊就需要這個;$toUsername = $postObj->ToUserName; //這一句得到使用者發送給誰,這裡這個指的就是我們這個公眾號了;$keyword = trim($postObj->Content); //這一句就是用來判斷使用者發送過來的資訊了,這裡有一個函數trim,這個函數是用來去除Content訊息左右兩邊的空格的,這樣就不會影響我們對訊息的判斷;我們有了keyword,就可以針對使用者發送過來的訊息做相應的響應操作了,即判斷keyword的內容,響應響應的操作;$time = time(); //這個是時間函數,得到時間資訊;$textTpl = //這個是一個xml格式的字串了,這個相關的知識通過對xml檔案格式進行一定的學習瞭解之後便可以知道這個裡面對應的資訊了。
有了上述的資訊之後,便可以響應相應的操作了,可以看到這個函數接著下去的內容:
$msgType = "text";$contentStr = "Welcome to wechat world!";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);echo $resultStr;
在判斷使用者是有發送訊息過來之後,公眾號就要響應對應的操作了,我們現在回複的訊息是簡訊,所以$msgType = "text",然後我們需要返回的訊息就是$contentStr = "",接下來一個函數是:
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 這裡有一個sprintf函數,將$textTpl 後面的那些參數寫入到 textTpl中,這個textTpl就是上文中提到的那個xml格式字串,我們可以看到那個字串中有:
第二行看到,[CDATA[%s]],前後還有,這是xml檔案的格式要求,這裡就不細說了。sprintf函數將textTpl 後面的那些參數資訊寫入到這個xml字串中,對應的ToUserName等資訊就這樣處理好了,然後echo 就不懂啥意思了,是php的文法吧,網上查到的是輸出一個或多個字串。這樣就實現了響應操作了。
所以需要實現我們的自訂菜單功能,就是在這雷根據keyword的內容做一定的處理了。在程式開發中,我也喜歡將一個功能點單獨提出來寫成單一的函數,所以我就是這樣做的:
這裡再補充一點,接受訊息有接收使用者發送的訊息,也有接收一些事件(如使用者關注、取消追蹤之類的),所以我們需要判斷訊息類型:
從這個開始,我就開始將訊息處理單獨抽離開了,單判讀為是事件的時候,執行相應的操作,是文本資訊的時候,執行相應的操作。 這裡又補充一個php文法吧:好像每個變數面前都需要加上$ 符號的,然後調用內部的函數是用$this-> 這是顯式的用this調用吧,在C++中可有可沒有,不知道PHP中能不能支援,下次試一試;將解析出來的資料包直接作為參數傳遞過去,然後我就能該幹嘛就幹嘛去了,balabala。
然後要做響應菜單,就是在對應的函數中去寫相關代碼了,所以第一步功能就是這樣實現的。下一步就是要實現資料庫操作了。
現在遇到的問題:
我們實現菜單的時候,首先會提示一個一級菜單,然後再去選擇二級菜單。現在遇到的問題是怎麼去記住一級菜單所選擇的資訊。網上查到的資料是說用緩衝在儲存資訊,明天有時間實現一下~~~