段任
(云南財(cái)經(jīng)大學(xué) 信息學(xué)院,昆明 650221)
[摘 要] 互聯(lián)網(wǎng)企業(yè)基于自身業(yè)務(wù)與技術(shù)優(yōu)勢(shì)向第三方開(kāi)發(fā)者、商戶等提供開(kāi)放平臺(tái),支持業(yè)務(wù)邏輯處理、數(shù)據(jù)存儲(chǔ)、計(jì)算能力等的開(kāi)放API接入,有效提高了互聯(lián)網(wǎng)生產(chǎn)力水平,促進(jìn)了業(yè)態(tài)創(chuàng)新,有力推動(dòng)了“互聯(lián)網(wǎng)+”的生態(tài)擴(kuò)展?;诖?,本文提出了一個(gè)基于互聯(lián)網(wǎng)開(kāi)放平臺(tái)的微信公眾號(hào)構(gòu)建方案,以提高公眾號(hào)開(kāi)發(fā)效率,降低其應(yīng)用成本。
[關(guān)鍵詞] 開(kāi)放平臺(tái);開(kāi)放API;微信公眾號(hào)構(gòu)建
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2017. 05. 086
[中圖分類號(hào)] TP311 [文獻(xiàn)標(biāo)識(shí)碼] A [文章編號(hào)] 1673 - 0194(2017)05- 0160- 03
1 背景及意義
微信公眾號(hào)被廣泛用于各種主題的宣傳與商業(yè)服務(wù),其構(gòu)建可采取編輯模式與開(kāi)發(fā)模式,前者通過(guò)圖形界面操作訂制公眾號(hào),限于簡(jiǎn)單功能,無(wú)法實(shí)現(xiàn)個(gè)性化及深入服務(wù)。開(kāi)發(fā)模式通過(guò)編程實(shí)現(xiàn),需要建立微信消息框架,通過(guò)標(biāo)準(zhǔn)的互聯(lián)網(wǎng)服務(wù)提供訪問(wèn),支持更多高級(jí)的個(gè)性化應(yīng)用,但開(kāi)發(fā)成本較高。
本文提出利用互聯(lián)網(wǎng)開(kāi)放平臺(tái)構(gòu)建微信公眾號(hào)的方案,可有效利用網(wǎng)絡(luò)服務(wù)商的富集資源,減少公眾號(hào)的數(shù)據(jù)存儲(chǔ)、服務(wù)實(shí)現(xiàn)成本,提高開(kāi)發(fā)效率。
2 系統(tǒng)架構(gòu)
微信開(kāi)放平臺(tái)通過(guò)公眾號(hào)與關(guān)注用戶間信息交換實(shí)現(xiàn)服務(wù)功能,公眾號(hào)能提供多媒體信息的規(guī)模推送、定向(如性別、地區(qū)、分組等)推送、對(duì)一互動(dòng)、智能回復(fù)等功能,有力支持客戶的宣傳、營(yíng)銷、客服、公共服務(wù)等應(yīng)用。公眾號(hào)功能服務(wù)通過(guò)微信開(kāi)放平臺(tái)開(kāi)發(fā)接口提供訪問(wèn),微信開(kāi)放平臺(tái)支持互聯(lián)網(wǎng)第三方服務(wù)的接入。因此,微信公眾號(hào)可以有效利用互聯(lián)網(wǎng)已有開(kāi)放平臺(tái)資源提供的豐富功能,據(jù)此構(gòu)建的公眾號(hào)可采用如下系統(tǒng)架構(gòu)。
微信用戶通過(guò)終端登錄微信,發(fā)出應(yīng)用請(qǐng)求到微信接入服務(wù)器,接入服務(wù)器將應(yīng)用請(qǐng)求轉(zhuǎn)發(fā)給公眾號(hào)服務(wù)器處理。公眾號(hào)服務(wù)器根據(jù)應(yīng)用請(qǐng)求向具體的第三方平臺(tái)請(qǐng)求服務(wù),將返回的服務(wù)結(jié)果發(fā)送給接入服務(wù)器,接入服務(wù)器再將結(jié)果發(fā)送到用戶終端的微信上。公眾號(hào)服務(wù)器是一個(gè)邏輯服務(wù)器,聚合第三方開(kāi)放平臺(tái)的多種服務(wù)形成,可以集成數(shù)據(jù)存儲(chǔ)、Web應(yīng)用以及其他業(yè)務(wù)功能。
為完成對(duì)用戶微信消息的接收及對(duì)應(yīng)事件處理,公眾號(hào)要在公眾號(hào)服務(wù)器上指定第三方開(kāi)放平臺(tái)上的服務(wù)接口URL,從而有效實(shí)現(xiàn)服務(wù)請(qǐng)求轉(zhuǎn)發(fā)與響應(yīng)接收。第三方平臺(tái)到微信開(kāi)放平臺(tái)的接口調(diào)用需要獲取訪問(wèn)憑證access_token。一個(gè)公眾號(hào)申請(qǐng)獲批后,會(huì)分配AppID(應(yīng)用ID)、AppSecret(應(yīng)用密鑰)作為第三方用戶接入的唯一憑證與憑證密鑰。在每次請(qǐng)求調(diào)用微信開(kāi)放平臺(tái)接口時(shí)驗(yàn)證AppID、AppSecret從而獲得接口訪問(wèn)憑證access_token。
因此,開(kāi)發(fā)公眾號(hào)需在微信上進(jìn)行接口配置,填寫(xiě)使用的服務(wù)器地址URL、Token及EncodingAESKey,其中Token由開(kāi)發(fā)者任意填寫(xiě),用作生成簽名,EncodingAESKey可手動(dòng)填寫(xiě)或隨機(jī)生成,用作消息體加解密的密鑰。
下面以一個(gè)提供周邊搜索的微信公眾號(hào)為例闡述開(kāi)放平臺(tái)的集成調(diào)用,該公眾號(hào)支持用戶發(fā)送位置信息查詢周邊興趣信息。其解決思路為:用戶上線時(shí)自動(dòng)采集其位置坐標(biāo),公眾服務(wù)器收到位置消息后,將用戶ID、位置信息存入公眾號(hào)的用戶服務(wù)記錄,當(dāng)用戶發(fā)送位置查詢要求時(shí),根據(jù)位置記錄調(diào)用第三方地圖的查詢服務(wù)返回要求的興趣信息。
在此選擇百度地圖位置查詢服務(wù),為便于集成,還采用了百度的一系列開(kāi)放服務(wù),數(shù)據(jù)存儲(chǔ)使用百度BAE的MySQL,Web服務(wù)器使用BAE的Tomecat 7.0,以War包形式部署作為公眾號(hào)服務(wù)器,開(kāi)發(fā)語(yǔ)言使用Java。
3 消息通信的實(shí)現(xiàn)
3.1 消息通信
構(gòu)建基于開(kāi)放平臺(tái)的公眾號(hào)工作包括:微信終端功能訂制、公眾號(hào)應(yīng)用數(shù)據(jù)存儲(chǔ)、第三方平臺(tái)與微信開(kāi)放平臺(tái)間的消息通信處理,其核心是消息通信。用戶終端與服務(wù)器的交互消息包括:請(qǐng)求消息、事件和響應(yīng)消息。其中請(qǐng)求消息是用戶發(fā)送給公眾號(hào)的消息,包括文字、語(yǔ)音、圖片、地理位置、鏈接和視頻;事件消息是因用戶對(duì)公眾賬號(hào)操作引發(fā)的公眾號(hào)發(fā)送給微信服務(wù)器消息,包括關(guān)注、取消關(guān)注、同意使用位置信息并進(jìn)入公眾賬號(hào)、點(diǎn)擊自定義菜單;響應(yīng)消息是指公眾賬號(hào)回復(fù)用戶的消息,消息內(nèi)容包括文本、圖片、語(yǔ)音、視頻、音樂(lè)及圖文。
微信終端、微信服務(wù)器與第三方服務(wù)器間的消息通信過(guò)程采用HTTP協(xié)議,消息封裝格式為XML,其通信過(guò)程過(guò)程如下:
(1)用戶通過(guò)微信終端向公眾號(hào)發(fā)送請(qǐng)求或事件消息,消息被送達(dá)公眾號(hào)服務(wù)器。
(2)公眾號(hào)服務(wù)器將收到的消息用XML封裝,根據(jù)接口配置指定的URL,通過(guò)HTTP POST方式將消息轉(zhuǎn)發(fā)給第三方服務(wù)器。
(3)第三方服務(wù)器對(duì)收到的消息進(jìn)行解析,將關(guān)鍵字、關(guān)鍵值與預(yù)置規(guī)則比對(duì)調(diào)用API,并將處理結(jié)果封裝為響應(yīng)消息回送。
(4)微信服務(wù)器收到響應(yīng)消息后,將處理結(jié)果轉(zhuǎn)發(fā)至用戶微信端的公眾號(hào)。
3.2 消息處理
根據(jù)上述消息通信過(guò)程,公眾號(hào)的消息處理模塊應(yīng)支持多種消息的請(qǐng)求與響應(yīng),通過(guò)微信后臺(tái)應(yīng)用接口與用戶通信,負(fù)責(zé)將微信服務(wù)器收到的用戶請(qǐng)求轉(zhuǎn)發(fā)至第三方開(kāi)放平臺(tái),并將處理結(jié)果進(jìn)行解析封裝,返回給微信終端。
使用XML對(duì)各類消息進(jìn)行定義,請(qǐng)求消息的XML定義如下:
不同類型數(shù)據(jù)格式
ToUserName、FromUserName、CreateTime分別是接收者、發(fā)送者、創(chuàng)建時(shí)間。MsgType是消息內(nèi)容的類型,其值CDATA包括text、image、voice、video、location及l(fā)ink等。響應(yīng)消息定義與之類似,但不需要MsgId,事件的XML定義則是用
使用標(biāo)準(zhǔn)的XML數(shù)據(jù)處理方法,在消息發(fā)送、接收兩端對(duì)消息進(jìn)行封裝和解析,可以實(shí)現(xiàn)有效的內(nèi)容交互。用戶端向公眾賬號(hào)發(fā)送請(qǐng)求消息、或做出操作時(shí),微信服務(wù)器會(huì)將消息或事件用XML格式通過(guò)doPOST發(fā)送到公眾賬號(hào)的入口URL,request中封裝了請(qǐng)求相關(guān)的所有內(nèi)容。公眾號(hào)服務(wù)器同樣適用XML封裝返回處理及響應(yīng)結(jié)果。
對(duì)request消息解析使用Java提供的XML API dom4j,在消息接收端,首先使用request對(duì)象的getInputStream()方法獲得輸入流句柄,再使用dom4j的元素遍歷方法解析XML請(qǐng)求消息,基本步驟如下:
public static Map
Map
SAXReader reader = new SAXReader();//讀取輸入流
Document document = reader.read(inputStream);
Element root = document.getRootElement();//獲取xml根元素
List
for (Element e : elementList)//遍歷所有子節(jié)點(diǎn)
map.put(e.getName(), e.getText());
inputStream.close();//釋放資源
inputStream = null;
return map;//返回結(jié)果}
request消息經(jīng)parseXml()方法解析后,結(jié)果存放在HashMap中,只要使用關(guān)鍵字MsgType便能從HashMap判斷是消息或事件,進(jìn)而查詢其對(duì)應(yīng)類型及內(nèi)容,并采取相應(yīng)處理。
響應(yīng)消息的封裝需要將java對(duì)象轉(zhuǎn)換為XML,使用Xstream開(kāi)源框架可以方便實(shí)現(xiàn)Java對(duì)象到XML的轉(zhuǎn)換。微信服務(wù)器的XML格式帶有CDATA塊,Xstream框架本身并不支持CDATA塊的生成,所以使用匿名內(nèi)部類實(shí)現(xiàn)Xstream擴(kuò)展,實(shí)例如下:
private static XStream xstream = new XStream(new XppDriver( ) {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
boolean cdata = true;
@SuppressWarnings("unchecked")
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]] >");}
else writer.write(text); }
};}});
將第三方服務(wù)器處理的響應(yīng)消息轉(zhuǎn)換為微信服務(wù)器所支持的XML格式需要對(duì)不同類型內(nèi)容分別定義轉(zhuǎn)換函數(shù)。以下是圖文消息轉(zhuǎn)化的方法,其他類型對(duì)象采取類似處理即可,在此不贅述。
public static String newsMessageToXml(NewsMessage newsMessage) {
xstream.alias("xml", newsMessage.getClass());
xstream.alias("item", new Article().getClass());
return xstream.toXML(newsMessage);}
4 開(kāi)放平臺(tái)的集成調(diào)用
由于百度在GCJ-2坐標(biāo)系的基礎(chǔ)上增加了BD-09二次加密措施,直接使用用戶端采集的GCJ-2坐標(biāo)信息進(jìn)行查詢誤差較大,必須對(duì)用戶位置信息進(jìn)行百度坐標(biāo)轉(zhuǎn)換糾偏。公眾號(hào)在采集用戶位置信息時(shí),調(diào)用百度坐標(biāo)轉(zhuǎn)換API將用戶位置坐標(biāo)轉(zhuǎn)換為百度地圖坐標(biāo),然后將“用戶OpenID、轉(zhuǎn)換前坐標(biāo),轉(zhuǎn)換后坐標(biāo)”存入數(shù)據(jù)庫(kù)。用戶發(fā)送“附近+關(guān)鍵字”查詢時(shí),公眾號(hào)的實(shí)現(xiàn)過(guò)程為:
(1)調(diào)用BEA的MySQL查詢API,根據(jù)“OpenID”查詢用戶對(duì)應(yīng)的百度地圖位置;
(2)根據(jù)用戶位置信息調(diào)用百度地圖Place API對(duì)用戶位置周邊圓形區(qū)域進(jìn)行查詢,解析查詢返回結(jié)果;
(3)調(diào)用百度地圖的JavaScript API處理導(dǎo)航頁(yè)面,將結(jié)果封裝成圖文信息發(fā)回客戶端
(4)客戶端公眾號(hào)收到圖文信息后在地圖頁(yè)面打開(kāi)顯示結(jié)果。
5 結(jié) 語(yǔ)
本文提出了利用互聯(lián)網(wǎng)開(kāi)放平臺(tái)快速構(gòu)建微信公眾號(hào)的系統(tǒng)解決方案,并以提供“周邊搜索”的公眾號(hào)為例闡述如何實(shí)現(xiàn)微信開(kāi)放平臺(tái)與第三方平臺(tái)的消息通信及開(kāi)放API調(diào)用。該方案為移動(dòng)社交網(wǎng)絡(luò)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”生態(tài)下的多方協(xié)作、利益共享提供了一個(gè)高效率、低成本的解決思路。
主要參考文獻(xiàn)
[1]Xiang Y, Chang D, Chen B. A Smart University Campus Information Dissemination Framework Based on Wechat Platform[M]// R Zhang,et al (Eds).LISS 2013,Springer,Berlin Heidelberg, 2015: 927-932.
[2]Zhao J, Huang X. The Application of WeChat to the University Laboratory Management Information System[C]//Proceedings of the 4th International Conference on Computer Engineering and Networks,Berlin:Springer International Publishing, 2015: 907-916.