范新龍 董奇
【摘要】在使用微信公眾號(hào)開發(fā)過程中,用戶經(jīng)常需要和服務(wù)器進(jìn)行對(duì)話,后臺(tái)需要知道用戶提交信息的上文是什么,在連接狀態(tài)下,可以通過整個(gè)頁(yè)面的提交,比較容易的得到用戶的請(qǐng)求信息并進(jìn)行相應(yīng)的處理。在微信公眾號(hào)的開發(fā)模式下,由于服務(wù)器收到的用戶信息是通過微信服務(wù)器轉(zhuǎn)發(fā)的,對(duì)話時(shí)這些上下文信息的處理就需要采取其他手段來(lái)保存。文中介紹了一種在非連接模式下用戶和服務(wù)器進(jìn)行對(duì)話的通用處理方法,通過較為簡(jiǎn)單的方法實(shí)現(xiàn)了上下文信息的保存和處理,并通過php為例進(jìn)行了實(shí)現(xiàn)。
【關(guān)鍵詞】微信公眾號(hào) ; 會(huì)話 ; php ; 上下文信息保存
資金項(xiàng)目:陜西省教育廳2018年科學(xué)研究專項(xiàng)項(xiàng)目《鋼軌焊縫探傷自動(dòng)化中通信及大數(shù)據(jù)分析模塊的研究與實(shí)現(xiàn)》,項(xiàng)目編號(hào)為18JK1113
一、問題的提出
利用微信公眾號(hào)進(jìn)行開發(fā)時(shí),通常會(huì)采用開發(fā)模式,在開發(fā)模式下,用戶提交的查詢信息會(huì)通過微信服務(wù)器與應(yīng)用服務(wù)器進(jìn)行交互。(見圖1)
在開發(fā)教學(xué)系統(tǒng)的課程信息查詢模塊時(shí),有這樣的需求:用戶在微信企業(yè)號(hào)中輸入課程的信息,會(huì)得到相關(guān)提示信息,用戶根據(jù)提示信息輸入相應(yīng)的編號(hào)或更進(jìn)一步的查詢信息,一步一步的輸入自己關(guān)注的信息,就可以查詢到所需的信息。微信企業(yè)號(hào)將這些信息傳遞到后臺(tái),后臺(tái)取出相應(yīng)的結(jié)果發(fā)給查詢用戶。在實(shí)現(xiàn)時(shí),產(chǎn)生了一個(gè)問題:因?yàn)榉?wù)器接口同時(shí)為很多用戶服務(wù),因此用戶輸入后續(xù)信息時(shí),服務(wù)器接口必須能判斷出來(lái)后續(xù)信息對(duì)應(yīng)的先導(dǎo)信息是哪個(gè),從上面的流程中,可以看出,如果僅僅用微信服務(wù)器的對(duì)話方式是無(wú)法滿足上述需求的。
例如:用戶想了解自己的某門課的開課情況,可以先輸入“單片機(jī)原理”,服務(wù)器給出對(duì)應(yīng)的提示信息后,用戶可以再次輸入“課表”,查詢單片機(jī)原理的排課情況,也可以輸入“教室”、“實(shí)驗(yàn)室”等查詢單片機(jī)原理在那間教室上課或做實(shí)驗(yàn),由于對(duì)話過程是通過用戶和服務(wù)器之間一問一答的方式進(jìn)行的,用戶和服務(wù)器之間又處于非連接狀態(tài),因此服務(wù)器必須能夠正確的判斷出“課表”到底是要查詢哪門課的課表,正確理解用戶輸入信息對(duì)應(yīng)的上文以及相應(yīng)的響應(yīng)就需要進(jìn)行上文分析,對(duì)有較多上文提示和經(jīng)常變化提示的應(yīng)用,這個(gè)處理過程就顯得很繁瑣??紤]到這些因素進(jìn)行編程,程序開發(fā)就顯得極為復(fù)雜,必須將操作流程的全過程進(jìn)行通盤考慮,邏輯上不能有任何疏漏,還要考慮用戶輸入了程序不能處理信息的情況流程,對(duì)用戶的使用也顯得不友好,另外,在程序維護(hù)時(shí),當(dāng)層次多時(shí),其邏輯組合關(guān)系會(huì)很富在,為維護(hù)帶來(lái)困難。
二、會(huì)話信息存儲(chǔ)處理方法
要保存上述中的會(huì)話信息,方法比較多,資料中也有稱此為自制Session或Cookite保存的,這些方法主要不外乎這么幾種:
(一)用文本文件保存:在收到用戶提交的信息后,將其進(jìn)行格式化后,以自定的一種格式,將其保存在文本文件中或.INI文件中。
(二)數(shù)據(jù)庫(kù)保存:在數(shù)據(jù)庫(kù)中專門開設(shè)一個(gè)表,在其中存放用戶與后臺(tái)交互的現(xiàn)狀及歷史信息。
(三)其他:存成Json或XML格式,這是類似文本的一種方法。
這些方法都能實(shí)現(xiàn)保存上下文的目的,主要存在的問題是,每次取出來(lái)的保存數(shù)據(jù)要進(jìn)行多種判斷處理才能搞清其輸入所對(duì)應(yīng)的上文,針對(duì)不同的應(yīng)用,要編寫不同的程序處理,降低了程序開發(fā)效率,那么能不能開發(fā)一個(gè)通用的程序解決這個(gè)問題呢?
通過多次測(cè)試,開發(fā)了一個(gè)通用處理類,將上下文現(xiàn)場(chǎng)數(shù)據(jù)和處理方法用類實(shí)現(xiàn),并通過類的字符序列化,將類數(shù)據(jù)連同處理方法一并存儲(chǔ),使用時(shí)恢復(fù)現(xiàn)場(chǎng),就好像類一直在工作一樣。
三、利用類實(shí)現(xiàn)會(huì)話
現(xiàn)代程序設(shè)計(jì)語(yǔ)言大都支持類操作,在類中可以保存用戶數(shù)據(jù),同時(shí)在類中提供處理數(shù)據(jù)的方法或函數(shù),這樣實(shí)現(xiàn)的好處是在不同的應(yīng)用中,只要進(jìn)行少量修改,就可以用在不同的應(yīng)用系統(tǒng)開發(fā)中,不需要為每個(gè)應(yīng)用重新開發(fā)一種上下文的處理程序,下面介紹具體實(shí)現(xiàn)思路。
(一)定義上下文數(shù)組
定義一個(gè)上下文提示信息數(shù)組,這個(gè)內(nèi)容在不同的應(yīng)用中可以是不同的,根據(jù)需要設(shè)置,數(shù)組中主要定義了需要與用戶輸入匹配的關(guān)鍵詞和對(duì)話的層級(jí),這個(gè)數(shù)組基本是一個(gè)樹形目錄,每次根據(jù)當(dāng)前所在層級(jí)和用戶信息決定分支,如(圖2)
上面的JSON數(shù)組定義了上下文的關(guān)系和處理方法,其中l(wèi)evel定義了對(duì)話級(jí)別,在微信對(duì)話過程中,如果對(duì)話在30分鐘內(nèi)(這個(gè)時(shí)間可以自己定義)沒有下文輸入,對(duì)話回到結(jié)束,在輸入的內(nèi)容將與上面的數(shù)組中定義的1級(jí)進(jìn)行比對(duì),輸入的,開啟新的對(duì)話;order定義了顯示的順序;msg定義了對(duì)話信息;next:定義了下一步要執(zhí)行的方法,如prompt則回顯一個(gè)提示信息;process(n)表示執(zhí)行程序n定義的函數(shù)。
(二)定義類變量及處理函數(shù):
這部分主要處理收到用戶信息后,進(jìn)行比較所需要的變量和函數(shù),包括了當(dāng)前會(huì)話的層級(jí)levelStep、正在處理的關(guān)鍵字SessionKeyWord以及處理函數(shù)getNextPrompt,用于根據(jù)用戶輸入的信息得到返回給用戶的提示并確定當(dāng)前所在的層級(jí)。(見圖三)
例如:當(dāng)?shù)玫接脩糨斎氲男畔r(shí),判斷其所在的層級(jí)(levelStep),從上述定義的內(nèi)容數(shù)組中,查到對(duì)應(yīng)的操作內(nèi)容,如輸入了“課表”,如果當(dāng)前l(fā)evelStep=1,則通過查找無(wú)法找到對(duì)應(yīng)的項(xiàng)目,getNextPrompt()就將levelStep=1的內(nèi)容都提取出來(lái)發(fā)送給用戶,顯示類似如下信息:(見圖4)
如果用戶輸入了“課表”,而當(dāng)前l(fā)evelStep=3時(shí),假設(shè)系統(tǒng)查到上文信息是“C語(yǔ)言”,則進(jìn)行“Process(31)”,程序進(jìn)行相應(yīng)處理即可。
(三)保存和恢復(fù)類對(duì)象
類在生成對(duì)象后,一般情況下,會(huì)初始化所有變量,那么如果每次收到用戶消息再進(jìn)行初始化,則無(wú)法得到用戶前期處理的上文消息,為此采用了對(duì)象字符序列化的方法保存和生成對(duì)象。在php中對(duì)象字符序列化和反序列化的函數(shù)為:serialize() 和unserialize() (其他編程語(yǔ)言請(qǐng)查詢相應(yīng)函數(shù)),每次處理完用戶發(fā)送的信息后,用serialize()函數(shù)將對(duì)象直接進(jìn)行字符序列化并保存,待下次收到消息時(shí)再用反序列化函數(shù)unserialize()得到已經(jīng)實(shí)例化對(duì)象,無(wú)需初始化,恢復(fù)到上次處理時(shí)的現(xiàn)場(chǎng)數(shù)據(jù)。
四、結(jié)束語(yǔ)
文中介紹了一種通用的保存對(duì)話時(shí)上下文關(guān)系的類的實(shí)現(xiàn)方法,最大的特點(diǎn)是通用性強(qiáng),通過對(duì)象字符序列化技術(shù)保存和恢復(fù)技術(shù),使得程序結(jié)構(gòu)簡(jiǎn)潔、清晰,通用性強(qiáng),使用時(shí)只需要修改會(huì)話的數(shù)組和最后的處理程序即可,希望能為同類開發(fā)提供借鑒。
參考文獻(xiàn):
[1]沈思瑩.交互設(shè)計(jì)在銀行產(chǎn)品開發(fā)中的應(yīng)用[J].中國(guó)金融電腦,2014(1):51-56.
[2]基于微信公眾平臺(tái)的分層教學(xué)模式的設(shè)計(jì)與研究[D].北京交通大學(xué).2016
[3]黃宇.SOAP消息交互安全機(jī)制的研究[D].華中科技大學(xué).2014
[4]謝軼.分布式消息總線中消息代理的設(shè)計(jì)與仿真[D].北京郵電大學(xué).2014
[5]趙敬,李貝.微信公眾平臺(tái)發(fā)展現(xiàn)狀初探[J].新聞實(shí)踐.2013(08)8-10.
作者簡(jiǎn)介:范新龍:男 碩士 副教授,研究方向:通信技術(shù)、通信網(wǎng)絡(luò)互聯(lián)。董奇:男 碩士 副教授 ,研究方向:鐵道通信信號(hào)、現(xiàn)代教育技術(shù)。