微信平臺(tái)技術(shù)實(shí)操(10):公眾賬號(hào)自定義回復(fù)

2017-02-24|HiShop
導(dǎo)讀:官方其實(shí)并不推薦經(jīng)常群發(fā)消息,更多的是希望用戶通過對(duì)話來自己獲取服務(wù)或者進(jìn)行搜索。今天我們就講下如何使用開發(fā)模式做自定義回復(fù)。 目前公眾賬號(hào)可以接收的用戶提交消息請(qǐng)...

  官方其實(shí)并不推薦經(jīng)常群發(fā)消息,更多的是希望用戶通過對(duì)話來自己獲取服務(wù)或者進(jìn)行搜索。今天我們就講下如何使用開發(fā)模式做自定義回復(fù)。

  目前公眾賬號(hào)可以接收的用戶提交消息請(qǐng)求有四種類型,分別是文字、圖片、地理位置和鏈接,而公眾賬號(hào)回復(fù)只有三種格式,文字、圖文和音樂,也就是說用戶互動(dòng)的模式最多也就是12種,我們今天先講三種即文字回復(fù)文字、文字回復(fù)圖文、文字回復(fù)音樂。

  這強(qiáng)調(diào)一下,微信的消息接口通訊有效時(shí)間是5秒,也就是說網(wǎng)絡(luò)不穩(wěn)定等原因很容易造成用戶在5秒內(nèi)接收不到回復(fù)消息,然后就通訊中斷了,這幾天有人反映關(guān)注ZTalk后沒有消息提示就是這個(gè)問題。

  一、文字回復(fù)文字之鸚鵡學(xué)舌

  鸚鵡學(xué)舌大家都知道,就是你說什么它跟著你說什么,咱們也可以在微信公眾平臺(tái)里玩一下,首先進(jìn)入SAE平臺(tái),打開代碼編輯,在之前的接口文件上進(jìn)行修改。代碼如圖:

  

微信平臺(tái)技術(shù)實(shí)操(10):公眾賬號(hào)自定義回復(fù)

 

  代碼添加位置是在“事件消息”的注釋前面,用戶消息賦值之后,實(shí)際添加的代碼是從圖上20行開始到41行。

  第21行是判斷用戶發(fā)送的消息類型是否文字消息,可以參考事件消息的判斷,變動(dòng)的只是消息類型標(biāo)示。

  第24行是判斷如果用戶發(fā)送了文字消息,那么獲取用戶發(fā)送的文字消息內(nèi)容賦值給變量$form_Content 。

  PS:這里有個(gè)函數(shù)“trim”,大家可以查下php的函數(shù)手冊(cè),這個(gè)函數(shù)作用是去除字符串首尾的空格,有時(shí)候用戶誤在頭尾多敲了空格,如果不去除的話就會(huì)出現(xiàn)關(guān)鍵字無法匹配,比如“你好 ”如果不去掉尾部空格就無法匹配關(guān)鍵字“你好”。

  第26行是判斷用戶發(fā)送的消息內(nèi)容是否為空,可以參照第9行的邏輯,empty($form_Content)在$form_Content不為空的時(shí)候返回0,為空的時(shí)候返回1,非(!)0即1表示條件成立,用戶發(fā)送的消息是有內(nèi)容的。

  第28行到第31行就是完成回復(fù)文字消息的功能,其中回復(fù)的內(nèi)容直接用了$form_Content,也就是把用戶發(fā)送的內(nèi)容又給回復(fù)回去。

  第34行是如果用戶發(fā)送的內(nèi)容為空白,則返回輸入提示。因此第37行的回復(fù)消息就是”請(qǐng)輸入些什么吧……”。

  好了現(xiàn)在去測(cè)試下,當(dāng)你向公眾賬號(hào)輸入文字時(shí),公眾賬號(hào)就會(huì)回復(fù)同樣的內(nèi)容給你,當(dāng)然你也可以把$form_Content改成直接的字符串,這樣就是自動(dòng)回復(fù)了。

  二、文字回復(fù)圖文之餐館菜單

  有多少人能馬上說出編輯模式里最多能設(shè)多少個(gè)關(guān)鍵字?估計(jì)不多,當(dāng)然用心看我教程的應(yīng)該知道,是200個(gè),到了開發(fā)模式這個(gè)關(guān)鍵字其實(shí)是無限的,前面舉了文字回復(fù)文字的簡(jiǎn)單例子,現(xiàn)在加點(diǎn)難度,可以識(shí)別關(guān)鍵字并且回復(fù)的是圖文消息,咱們就拿菜單來做例子吧,先做菜譜的類別,這個(gè)我們用文字回復(fù),代碼如圖下:

  

微信平臺(tái)技術(shù)實(shí)操(10):公眾賬號(hào)自定義回復(fù)

 

  添加的代碼位置在判斷用戶發(fā)送消息不為空的條件判斷之后,默認(rèn)回復(fù)之前,這里大家注意下默認(rèn)回復(fù)其實(shí)就是將前面文字回復(fù)文字的變量用字符串代替了。增加的代碼從第29行開始到41行。

  第30行判斷用戶發(fā)送過來的消息是否為“菜譜”,這里注意判斷是否等于是用兩個(gè)“=”號(hào)。如果是則運(yùn)行該判斷條件下的代碼。

  第33行先賦值給$return_str一個(gè)初始字符串點(diǎn)菜提示“請(qǐng)輸入字母編碼瀏覽相應(yīng)菜品:”,我這里加了兩個(gè)表示空兩行。

  第34行是一個(gè)數(shù)組,數(shù)組的元素為菜譜的類別。

  數(shù)組在程序中使用非常普遍,它是一種把具有相同類型的若干變量、數(shù)字或者字符串,有序組織起來的一種形式,有點(diǎn)像咱們以前數(shù)學(xué)課教的集合概念。

  數(shù)組的每個(gè)元素都是由鍵和值關(guān)聯(lián)組成,我在例子里的定義方式鍵值會(huì)默認(rèn)生成,第一個(gè)元素的鍵值為0,元素值是“lc.冷菜”,數(shù)組的每個(gè)元素值可以使用“數(shù)組名[鍵值]”的方式獲取或者輸出,比如$return_arr[0]的值就是“lc.冷菜”。

  數(shù)組可以用來做數(shù)據(jù)的存儲(chǔ)、排序、檢索等,它的概念比較復(fù)雜但是很重要,希望大家能夠去看些資料認(rèn)真學(xué)習(xí)下。

  第35行是用implode函數(shù)將$return_arr轉(zhuǎn)化成字符串,然后加到之前賦值過的$return_str后面,其運(yùn)行結(jié)果為:

  “請(qǐng)輸入字母編碼瀏覽相應(yīng)菜品:lc.冷菜hb.杭幫菜sk.燒烤wp.外婆燒ml.麻辣rc.熱菜tp.甜品”。

  implode函數(shù)的使用方法為implode(分隔符,數(shù)組),將數(shù)組內(nèi)元素轉(zhuǎn)化成字符串,并將分隔符插入元素之間,我在例子里分隔符為空值,所以最后轉(zhuǎn)化的字符串是首尾相連中間沒有分隔符的。

  后面的就不解釋了,輸出文字消息同時(shí)退出運(yùn)行。

  接著我們來示例某個(gè)類別的詳細(xì)菜單,咱們用多圖文消息來做,靈光的朋友已經(jīng)想到了,呵呵,先寫一個(gè)判斷,然后把那段用戶關(guān)注回復(fù)多圖文消息的代碼拷貝過來修改下就好了。當(dāng)然我今天加了點(diǎn)料,示例如下:

  

微信平臺(tái)技術(shù)實(shí)操(10):公眾賬號(hào)自定義回復(fù)

 

  添加的代碼位置在菜譜的大括號(hào)后面。第42行到51行和之前的是一樣的,唯一不同的是ArticleCount我設(shè)置成了10,也就是圖文消息條數(shù)為10條(編輯模式里多圖文消息最多只有8條,開發(fā)模式里是10條),不清楚的可以看第十期教程,我直接講下改進(jìn)的部分。

  第53行到105行我定義了一個(gè)數(shù)組$return_arr,這個(gè)數(shù)組里共有10個(gè)元素,每個(gè)元素又是一個(gè)結(jié)構(gòu)相同的數(shù)組,這些數(shù)組都有三個(gè)元素分別對(duì)應(yīng)標(biāo)題、圖片和鏈接,為了偷懶,我9個(gè)列表消息只是換了標(biāo)題,沒有圖片和連接,不知道大家看明白沒有。

  這個(gè)數(shù)組其實(shí)就相當(dāng)于我把菜單的10道菜里不同的數(shù)據(jù)按照相同的結(jié)構(gòu)做了集合,然后使用一個(gè)循環(huán)讀取語句將這些數(shù)據(jù)拼接成將要輸出的圖文消息。

  第107行的foreach是一個(gè)將數(shù)組中每個(gè)元素按照鍵值順序遍歷一遍的函數(shù),通俗的說就是將$return_arr這個(gè)數(shù)組里的元素按照先后順序讀取出來,每次讀取一個(gè)元素,讀取出來的元素賦值給$value,所以這個(gè)$value的值會(huì)隨著每次循環(huán)改變。即第一次循環(huán)時(shí)$value=$return_arr[0],第二次循環(huán)時(shí)$value=$return_arr[1]……

  每次讀取的$value其實(shí)就是$return_arr一個(gè)元素,根據(jù)上面的數(shù)據(jù)結(jié)構(gòu)這個(gè)元素又是一個(gè)數(shù)組,里面有三個(gè)元素,分別對(duì)應(yīng)了標(biāo)題、圖片和鏈接,值是$value[0]、$value[1]、$value[2],將這三個(gè)數(shù)據(jù)拼接到圖文消息模板,同時(shí)與前一次的$resultStr拼接。這樣做的好處在于減少了代碼的長(zhǎng)度,把圖文消息模板復(fù)用了,另外這個(gè)數(shù)組的結(jié)構(gòu)其實(shí)跟數(shù)據(jù)庫里讀取出來的結(jié)構(gòu)是一樣的,所以也是想讓大家一點(diǎn)點(diǎn)熟悉起來。

  等循環(huán)結(jié)束就執(zhí)行第116行,完成最后的閉合拼接,然后輸出結(jié)果。公眾賬號(hào)就將這個(gè)包含10條菜品的圖文消息發(fā)送給了用戶。

  三、文字回復(fù)音樂之表情傳意

  很多人,真的很多人,幾乎每天都有人在公眾平臺(tái)上問我同一個(gè)問題,就是你怎么可以放超過60秒的歌曲,我的答案只有一個(gè),就是用開發(fā)模式的音樂消息回復(fù)接口實(shí)現(xiàn)的。今天就給大家介紹下如何使用音樂接口來回復(fù)用戶消息,讓用戶有好的欣賞體驗(yàn)。

  回復(fù)音樂消息里的音樂是以鏈接形式加載到回復(fù)數(shù)據(jù)模板里的,類似咱們回復(fù)圖文消息里的圖片鏈接,SO,我們音樂文件的鏈接獲取也參照?qǐng)D片連接方式,一種呢是找網(wǎng)上在線收聽的鏈接,不過真不是很保險(xiǎn),很多是防盜鏈的,比圖片還嚴(yán)格,另外一種呢就是放到云存儲(chǔ)平臺(tái)上,這里建議大家如果要把音樂做成常態(tài)功能,必須選擇專業(yè)的云存儲(chǔ)平臺(tái),比如又拍云、七牛。

  今天我圖個(gè)方便就還是上傳到了SAE的Storage里了,如下圖,我選了我的大愛曲婉婷成名曲《我的歌聲里》(偷偷顯擺下,曲婉婷跟我在微博上可是互相關(guān)注的噢,我是她第3729個(gè)粉絲!!)。

  

微信平臺(tái)技術(shù)實(shí)操(10):公眾賬號(hào)自定義回復(fù)

 

  這個(gè)消息回復(fù)里支持的音樂格式目前我只測(cè)試過MP3、AAC兩個(gè),肯定是沒有問題的,這里需要注意的是上傳的文件名必須用英文或數(shù)字,文件名里不要有中文、空格、單雙引號(hào)等,大小寫無所謂。如果資源允許可以上傳一個(gè)低碼率的音樂文件,再上傳一個(gè)高碼率的音樂文件,因?yàn)槲⑿爬锫犚魳窌?huì)自動(dòng)識(shí)別網(wǎng)絡(luò)環(huán)境選擇不同音質(zhì)的版本。

  音樂文件準(zhǔn)備好后咱們就上代碼了吧!我這里給的例子是用戶發(fā)送表情,公眾賬號(hào)回復(fù)歌曲,如圖所示:

  

微信平臺(tái)技術(shù)實(shí)操(10):公眾賬號(hào)自定義回復(fù)

 

  增加的代碼加到前面菜單的代碼后面就行了,只要在那個(gè)默認(rèn)回復(fù)之前都可以。

  第124行代碼是判斷用戶發(fā)送的表情是不是微笑。就是微信表情第一排第一個(gè),這里大家肯定會(huì)很奇怪微笑表情符號(hào)不是“[微笑]”嗎,老賊我最早也犯過這個(gè)錯(cuò),折騰半天才發(fā)現(xiàn)其實(shí)微信接口發(fā)送過來的表情代碼是這樣的。

  第127行這里是消息類型,音樂消息的類型是music。

  第128行到137行就是調(diào)用wx_tpl.php里的音樂消息模板,用sprintf將格式化的數(shù)據(jù)寫入到變量中去。

  后面就是輸出到用戶手機(jī)上,用戶接收到的就是音樂播放器,點(diǎn)擊播放鍵就可以欣賞音樂了,是不是很簡(jiǎn)單?

  ZTalk秘籍

  如何收集所有表情的代碼呢?在第10期教程里有個(gè)秘籍是讓大家調(diào)試接口時(shí)可以把輸出結(jié)果文件保存到Storage上,然后查看文件檢查程序是否正常。咱們就用這個(gè)法子抓取所有表情的代碼。

  把抓取表情的代碼放到這個(gè)位置:

  

微信平臺(tái)技術(shù)實(shí)操(10):公眾賬號(hào)自定義回復(fù)

 

  然后到手機(jī)上往公眾平臺(tái)上發(fā)表情,按照順序從第一個(gè)一直輸入到最后一個(gè),然后一起發(fā)送,然后你到Storage就會(huì)看到有bq.txt,打開后就能看到如下圖:

  

微信平臺(tái)技術(shù)實(shí)操(10):公眾賬號(hào)自定義回復(fù)

 

  這些就是真正的表情符號(hào),我這里就發(fā)了第一屏幕的,大家抓取完就把代碼都刪除了吧,否則這里有個(gè)結(jié)束語句在那里,不去掉就不會(huì)執(zhí)行后面的程序。

TAGS:
推薦閱讀