段任

(云南財經大學 信息學院,昆明 650221)
[摘 要] 互聯網企業基于自身業務與技術優勢向第三方開發者、商戶等提供開放平臺,支持業務邏輯處理、數據存儲、計算能力等的開放API接入,有效提高了互聯網生產力水平,促進了業態創新,有力推動了“互聯網+”的生態擴展。基于此,本文提出了一個基于互聯網開放平臺的微信公眾號構建方案,以提高公眾號開發效率,降低其應用成本。
[關鍵詞] 開放平臺;開放API;微信公眾號構建
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2017. 05. 086
[中圖分類號] TP311 [文獻標識碼] A [文章編號] 1673 - 0194(2017)05- 0160- 03
1 背景及意義
微信公眾號被廣泛用于各種主題的宣傳與商業服務,其構建可采取編輯模式與開發模式,前者通過圖形界面操作訂制公眾號,限于簡單功能,無法實現個性化及深入服務。開發模式通過編程實現,需要建立微信消息框架,通過標準的互聯網服務提供訪問,支持更多高級的個性化應用,但開發成本較高。
本文提出利用互聯網開放平臺構建微信公眾號的方案,可有效利用網絡服務商的富集資源,減少公眾號的數據存儲、服務實現成本,提高開發效率。
2 系統架構
微信開放平臺通過公眾號與關注用戶間信息交換實現服務功能,公眾號能提供多媒體信息的規模推送、定向(如性別、地區、分組等)推送、對一互動、智能回復等功能,有力支持客戶的宣傳、營銷、客服、公共服務等應用。公眾號功能服務通過微信開放平臺開發接口提供訪問,微信開放平臺支持互聯網第三方服務的接入。因此,微信公眾號可以有效利用互聯網已有開放平臺資源提供的豐富功能,據此構建的公眾號可采用如下系統架構。
微信用戶通過終端登錄微信,發出應用請求到微信接入服務器,接入服務器將應用請求轉發給公眾號服務器處理。公眾號服務器根據應用請求向具體的第三方平臺請求服務,將返回的服務結果發送給接入服務器,接入服務器再將結果發送到用戶終端的微信上。公眾號服務器是一個邏輯服務器,聚合第三方開放平臺的多種服務形成,可以集成數據存儲、Web應用以及其他業務功能。
為完成對用戶微信消息的接收及對應事件處理,公眾號要在公眾號服務器上指定第三方開放平臺上的服務接口URL,從而有效實現服務請求轉發與響應接收。第三方平臺到微信開放平臺的接口調用需要獲取訪問憑證access_token。一個公眾號申請獲批后,會分配AppID(應用ID)、AppSecret(應用密鑰)作為第三方用戶接入的唯一憑證與憑證密鑰。在每次請求調用微信開放平臺接口時驗證AppID、AppSecret從而獲得接口訪問憑證access_token。
因此,開發公眾號需在微信上進行接口配置,填寫使用的服務器地址URL、Token及EncodingAESKey,其中Token由開發者任意填寫,用作生成簽名,EncodingAESKey可手動填寫或隨機生成,用作消息體加解密的密鑰。
下面以一個提供周邊搜索的微信公眾號為例闡述開放平臺的集成調用,該公眾號支持用戶發送位置信息查詢周邊興趣信息。其解決思路為:用戶上線時自動采集其位置坐標,公眾服務器收到位置消息后,將用戶ID、位置信息存入公眾號的用戶服務記錄,當用戶發送位置查詢要求時,根據位置記錄調用第三方地圖的查詢服務返回要求的興趣信息。
在此選擇百度地圖位置查詢服務,為便于集成,還采用了百度的一系列開放服務,數據存儲使用百度BAE的MySQL,Web服務器使用BAE的Tomecat 7.0,以War包形式部署作為公眾號服務器,開發語言使用Java。
3 消息通信的實現
3.1 消息通信
構建基于開放平臺的公眾號工作包括:微信終端功能訂制、公眾號應用數據存儲、第三方平臺與微信開放平臺間的消息通信處理,其核心是消息通信。用戶終端與服務器的交互消息包括:請求消息、事件和響應消息。其中請求消息是用戶發送給公眾號的消息,包括文字、語音、圖片、地理位置、鏈接和視頻;事件消息是因用戶對公眾賬號操作引發的公眾號發送給微信服務器消息,包括關注、取消關注、同意使用位置信息并進入公眾賬號、點擊自定義菜單;響應消息是指公眾賬號回復用戶的消息,消息內容包括文本、圖片、語音、視頻、音樂及圖文。
微信終端、微信服務器與第三方服務器間的消息通信過程采用HTTP協議,消息封裝格式為XML,其通信過程過程如下:
(1)用戶通過微信終端向公眾號發送請求或事件消息,消息被送達公眾號服務器。
(2)公眾號服務器將收到的消息用XML封裝,根據接口配置指定的URL,通過HTTP POST方式將消息轉發給第三方服務器。
(3)第三方服務器對收到的消息進行解析,將關鍵字、關鍵值與預置規則比對調用API,并將處理結果封裝為響應消息回送。
(4)微信服務器收到響應消息后,將處理結果轉發至用戶微信端的公眾號。
3.2 消息處理
根據上述消息通信過程,公眾號的消息處理模塊應支持多種消息的請求與響應,通過微信后臺應用接口與用戶通信,負責將微信服務器收到的用戶請求轉發至第三方開放平臺,并將處理結果進行解析封裝,返回給微信終端。
使用XML對各類消息進行定義,請求消息的XML定義如下:
不同類型數據格式
ToUserName、FromUserName、CreateTime分別是接收者、發送者、創建時間。MsgType是消息內容的類型,其值CDATA包括text、image、voice、video、location及link等。響應消息定義與之類似,但不需要MsgId,事件的XML定義則是用
使用標準的XML數據處理方法,在消息發送、接收兩端對消息進行封裝和解析,可以實現有效的內容交互。用戶端向公眾賬號發送請求消息、或做出操作時,微信服務器會將消息或事件用XML格式通過doPOST發送到公眾賬號的入口URL,request中封裝了請求相關的所有內容。公眾號服務器同樣適用XML封裝返回處理及響應結果。
對request消息解析使用Java提供的XML API dom4j,在消息接收端,首先使用request對象的getInputStream()方法獲得輸入流句柄,再使用dom4j的元素遍歷方法解析XML請求消息,基本步驟如下:
public static Map
Map
SAXReader reader = new SAXReader();//讀取輸入流
Document document = reader.read(inputStream);
Element root = document.getRootElement();//獲取xml根元素
List
for (Element e : elementList)//遍歷所有子節點
map.put(e.getName(), e.getText());
inputStream.close();//釋放資源
inputStream = null;
return map;//返回結果}
request消息經parseXml()方法解析后,結果存放在HashMap中,只要使用關鍵字MsgType便能從HashMap判斷是消息或事件,進而查詢其對應類型及內容,并采取相應處理。
響應消息的封裝需要將java對象轉換為XML,使用Xstream開源框架可以方便實現Java對象到XML的轉換。微信服務器的XML格式帶有CDATA塊,Xstream框架本身并不支持CDATA塊的生成,所以使用匿名內部類實現Xstream擴展,實例如下:
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); }
};}});
將第三方服務器處理的響應消息轉換為微信服務器所支持的XML格式需要對不同類型內容分別定義轉換函數。以下是圖文消息轉化的方法,其他類型對象采取類似處理即可,在此不贅述。
public static String newsMessageToXml(NewsMessage newsMessage) {
xstream.alias("xml", newsMessage.getClass());
xstream.alias("item", new Article().getClass());
return xstream.toXML(newsMessage);}
4 開放平臺的集成調用
由于百度在GCJ-2坐標系的基礎上增加了BD-09二次加密措施,直接使用用戶端采集的GCJ-2坐標信息進行查詢誤差較大,必須對用戶位置信息進行百度坐標轉換糾偏。公眾號在采集用戶位置信息時,調用百度坐標轉換API將用戶位置坐標轉換為百度地圖坐標,然后將“用戶OpenID、轉換前坐標,轉換后坐標”存入數據庫。用戶發送“附近+關鍵字”查詢時,公眾號的實現過程為:
(1)調用BEA的MySQL查詢API,根據“OpenID”查詢用戶對應的百度地圖位置;
(2)根據用戶位置信息調用百度地圖Place API對用戶位置周邊圓形區域進行查詢,解析查詢返回結果;
(3)調用百度地圖的JavaScript API處理導航頁面,將結果封裝成圖文信息發回客戶端
(4)客戶端公眾號收到圖文信息后在地圖頁面打開顯示結果。
5 結 語
本文提出了利用互聯網開放平臺快速構建微信公眾號的系統解決方案,并以提供“周邊搜索”的公眾號為例闡述如何實現微信開放平臺與第三方平臺的消息通信及開放API調用。該方案為移動社交網絡實現“互聯網+”生態下的多方協作、利益共享提供了一個高效率、低成本的解決思路。
主要參考文獻
[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.