微信平臺技術(shù)實(shí)操(8)用微信開發(fā)模式做歡迎詞
在教程開始前建議朋友們可以先注冊一個新的公眾賬號,或者用非主賬號當(dāng)做開發(fā)測試賬號,因?yàn)殚_發(fā)調(diào)試過稱中可能會經(jīng)常出現(xiàn)賬號無法正常回復(fù)用戶的情況,影響正常使用,所以在學(xué)習(xí)期間以及后期開發(fā)過程中最好有一個測試公眾賬號,等開發(fā)完成了再切換到主賬號上,也是非常方便的。
一、微信公眾平臺與SAE對接通訊
我們先回到微信公眾平臺上來,點(diǎn)擊高級功能進(jìn)入,選擇開發(fā)模式進(jìn)入開發(fā)模式的頁面,使用開發(fā)模式前記得先把編輯模式關(guān)閉,如下圖:
先不著急點(diǎn)開關(guān),點(diǎn)了也沒用,會提示必須先成為開發(fā)者,但第一步也不是點(diǎn)擊“成為開發(fā)者”按鈕,而是點(diǎn)擊查看文檔按鈕,我們要去下載一個文件,進(jìn)入開發(fā)指南頁面后點(diǎn)擊左側(cè)菜單的“消息接口指南”,如下圖:
然后在右邊打開的頁面導(dǎo)航里點(diǎn)擊“示例代碼”,如下圖:
頁面直接會跳到最底部,當(dāng)然直接拉到頁面最下也可以,可以看到示例代碼下載,如圖:
點(diǎn)擊下載后會得到一個“wx_sample.php”的文件,這個就是微信接口的SDK文件,首先我們將該文件改個名字,比如“wx_interface.php”,這里強(qiáng)調(diào)下文件的注意事項(xiàng):1、后綴必須是.php;2、名字不能用中文,盡量是全小寫字母,或者字母+下劃線+字母組成;3、名字要便于記憶;4、不要把名字設(shè)成“index.php”、“weixin.php”、“admin.php”這些。
讓大家改名的原因是為了安全,因?yàn)檫@是一個和微信公眾平臺通訊的接口文件,原則上要隱蔽,以免被人惡意攻擊。改完名字后打開SAE,進(jìn)入到咱們的應(yīng)用,點(diǎn)擊編輯代碼進(jìn)入編輯后臺,把文件上傳到SAE里,如下圖:
雙擊上傳的文件,進(jìn)入該文件的編輯模式,可以看到密密麻麻的一片代碼,朋友們不要被嚇到,咱們一步步來,首先修改第7行的通訊秘鑰,如圖:
那些斜杠和星號的是注釋,可以看到第6行的注釋英文是“define your token”,也就是說第7行的代碼功能是定義微信公眾平臺與SAE應(yīng)用通訊時約定的一個秘鑰。
這里解釋下define(“TOKEN”, “weixin”)這段代碼:
define是用來給常量賦值的函數(shù),這句話的意思是賦予“TOKEN”這個常量值為“weixin”。
PS:常量和變量,是每一種編程語言中都存在的,常量值被定義后,在腳本的其他任何地方都不能被改變。一個常量的名稱可以由英文字母、下劃線、和數(shù)字組成,但數(shù)字不能作為首字母出現(xiàn)。變量被定義后隨時可以重新賦值,其命名規(guī)則與常量一樣,區(qū)別是變量最前面還要加“$”符號,而常量直接使用它的名稱就可以了,如代碼第67行,就是給變量$token賦值,值為之前定義的常量TOKEN,可以看到變量和常量的賦值方式也是不同的,變量賦值很簡單不需要define函數(shù)。
扯了那么多咱們先把秘鑰改了吧,這個秘鑰其實(shí)有點(diǎn)像設(shè)置一個密碼,微信公眾平臺對秘鑰設(shè)置有要求是3位以上的字母或數(shù)字,我這里是測試所以改個“123456”,如圖:
修改保存后,回到微信公眾平臺的開發(fā)模式,點(diǎn)擊“成為開發(fā)者”按鈕,然后會到“接口配置信息”頁面,如下圖:
輸入各位在SAE上的應(yīng)用地址+反斜杠+改名后的SDK文件,比如我這里輸入的是
http://weixincourse.sinaapp.com/wx_interface.php
要注意的是前面不要忘記加http://,域名就是咱們應(yīng)用的域名,上傳的SDK文件名要寫完整,包括.php的后綴名。
這里就是填寫在SDK文件里設(shè)置的秘鑰,我這里填寫的是“123456”,大家根據(jù)自己設(shè)置的填寫。
填寫完后點(diǎn)擊提交,如果一切順利就會提示成功并跳轉(zhuǎn)頁面到開發(fā)者頁面,如下圖:
接口配置信息。這里可以看到咱們設(shè)定的那些接口信息都清楚的顯示出來,如果接口的地址或者token改變的話點(diǎn)擊修改按鈕可以重新設(shè)置。
接口權(quán)限表。打鉤的就是咱們可以使用的接口權(quán)限,關(guān)于這些接口的權(quán)限介紹可以查看《微信公眾平臺入門到精通Vol.7》,有些朋友如果已經(jīng)拿到自定義菜單內(nèi)測資格的,那么自定義菜單也會有打鉤。
最重要的一步就是打開開發(fā)模式的開關(guān),現(xiàn)在公眾賬號進(jìn)入開發(fā)模式了!
這個時候你會發(fā)現(xiàn)你的公眾賬號無論是關(guān)注還是輸入都沒有提示了,原來編輯模式下設(shè)置的東西都不管用了,因?yàn)楣娰~號已經(jīng)對接到了你的SAE接口,SO,我們開始下一步吧,先來個歡迎詞!
二、開發(fā)模式下的歡迎詞
先控訴下微信開發(fā)模式的設(shè)置不合理,接口校驗(yàn)和接口服務(wù)用同一個文件,而校驗(yàn)時這個文件必須直接返回echostr參數(shù)內(nèi)容,當(dāng)接口要啟動正式服務(wù)時又得修改同個文件……好了這些跟大家無關(guān),抱怨一下而已!
前面接口對接成功后,公眾賬號無法再與用戶互動了,那么我們先把訂閱歡迎這個功能恢復(fù)吧,回到SAE平臺上,在編輯平臺新建一個文件,我們把它命名為“wx_tpl.php”,這個文件的目的是存放微信輸出內(nèi)容的模板,細(xì)心的朋友會發(fā)現(xiàn)這就是目前接口可以給用戶回復(fù)的三種消息格式,分別是文本、圖文、音樂。內(nèi)容如圖:
然后把前面的那個SDK文件內(nèi)容全部清空,沒錯就是全部清空,因?yàn)楣俜侥莻€SDK除了用來做接口校驗(yàn)幾乎沒有什么用處。然后換上自己的代碼,如圖:
下載本地 保存到信息圖冊
2013-11-23 21:45 上傳給大家解釋下這一大段代碼:
第3行,include_once是用來加載其他php文件的函數(shù),在這里加載了wx_tpl.php,加載文件是可以設(shè)置路徑的,由于現(xiàn)在兩個文件在同一目錄下,因此沒有加路徑。這樣做的好處是有利于代碼復(fù)用,一些經(jīng)常用到的類、函數(shù)和變量可以放在其他文件統(tǒng)一加載,讓代碼簡潔輕便。
第6行,接收微信公眾平臺發(fā)送過來的用戶消息,該消息數(shù)據(jù)結(jié)構(gòu)為XML,不是php默認(rèn)的識別數(shù)據(jù)類型,因此這里用了$GLOBALS['HTTP_RAW_POST_DATA']來接收,同時賦值給了$postStr,這里強(qiáng)調(diào)一個php的鐵律就是php對大小寫是敏感的,也就是變量也好函數(shù)也好,大小寫不同是表示不同的變量或者函數(shù),即$Q1和$q1是兩個不同的變量,大家在寫代碼時千萬注意。
第9行,一個條件語句,empty是判斷變量是否為空的函數(shù),如果是空返回0否則返回1,感嘆號在這里是運(yùn)算符表示非(not的意思),非0就是1,非1就是0,可能有點(diǎn)繞,意思就是如果$postStr不為空(接收到了數(shù)據(jù))就繼續(xù)執(zhí)行下面的語句,如果為空就跳轉(zhuǎn)到39行執(zhí)行(這里就執(zhí)行了兩句代碼,第一句是輸出空字符串,第二句是退出)。
PS:
1、php的邏輯運(yùn)算符有“&&”表示與(并且的意思),“||”標(biāo)示或(或者的意思)“!”表示非(不是的意思),記住并且理解這些符號對后面寫代碼很有好處……
2、所有的編程語言都有if…else..語句,php的規(guī)則是if(條件){執(zhí)行語句}else{執(zhí)行語句},這里else可以沒有,或者可以多重判定,if(條件1){執(zhí)行語句}elseif(條件2){執(zhí)行語句}else{執(zhí)行語句}。判斷條件用“()”包含,執(zhí)行語句用“{}”包含,相鄰最近的一對括號標(biāo)示一段腳本,大家在編寫的時候不要漏掉后面的半個括號。我在這段代碼里括號標(biāo)示的比較清楚,大家可以仔細(xì)參照一下。
第12行,使用simplexml_load_string() 函數(shù)將接收到的XML消息數(shù)據(jù)載入對象$postObj中。這個嚴(yán)謹(jǐn)?shù)膶懛ê竺孢€得加個判斷是否載入成功的條件語句,不過不寫也沒事。
第14行,將對象$postObj中的發(fā)送消息用戶的OPENID賦值給$fromUsername變量,這里的“->”是指針,大家了解下就行了。
第16行,將對象$postObj中的公眾賬號的ID賦值給$toUsername變量。
第18行,將對象$postObj中的消息類型賦值給$form_MsgType變量。
第21行,判斷消息是否為事件消息,現(xiàn)在微信公眾賬號的用戶關(guān)注和取消訂閱都是通過事件消息發(fā)送,因此咱們要?dú)g迎用戶關(guān)注首先得判斷來接收的消息類型是否為事件。這里要強(qiáng)調(diào)的是在php里一個“=”用來賦值,“==”用來比較是否相等,大家千萬注意在判斷語句時如果少寫一個“=”號這個判斷會永遠(yuǎn)成立。
第24行,如果接收到的消息是事件消息,判斷事件類型是否為訂閱,在事件消息里“subscribe”表示訂閱,“unsubscribe”表示取消訂閱。
第29到32行,完成的是歡迎詞回復(fù)的輸出:
第29行是設(shè)定回復(fù)消息類型為文本;
第30行是設(shè)定回復(fù)消息的內(nèi)容,其中可以使用表情符號的文本方式,換行使用“”,這里要注意的是字符串里如果要使用雙引號或者單引號一般用中文符號,如果一定要用英文符號,要在引號前面加反斜杠比如“echo “”";”輸出的是一個雙引號;
第31行,使用sprintf這個函數(shù)將格式化的數(shù)據(jù)寫入到變量中去,其中“$textTpl”這個就是我們在wx_tpl.php里定義過的文本消息模板變量,后面的“$fromUsername, $toUsername, time(), $msgType, $contentStr”分別順序替換模板里“%s”位置,也即是“$resultStr”這個變量最后實(shí)際為:
time()
0
PS:time()是php里的時間函數(shù),返回當(dāng)前時間的 Unix 時間戳(格林威治時間 1970 年 1 月 1 日 00:00:00)到當(dāng)前時間的秒數(shù)。
第32行就是把回復(fù)消息輸出。
第33行是退出整個程序,在php里exit可以放置在任何地方,當(dāng)程序運(yùn)行到這里就直接退出,否則還將繼續(xù)運(yùn)行,即使已經(jīng)有結(jié)果輸出在頁面。