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