夏文忠 單長(zhǎng)吉
(昭通學(xué)院,云南 昭通 657000)
移動(dòng)手持設(shè)備的發(fā)展給傳統(tǒng)圖書(shū)館業(yè)務(wù)帶來(lái)了巨大的挑戰(zhàn),如何讓讀者在大量的信息資源中快速方便準(zhǔn)確的找到所需信息是圖書(shū)館界所面臨的問(wèn)題。據(jù)筆者對(duì)本校在校學(xué)生統(tǒng)計(jì),2014年在校學(xué)生99%都使用了智能手機(jī),這些智能手機(jī)中,安卓系統(tǒng)占90%以上,有少量的IOS和其它手機(jī)系統(tǒng)。騰訊公司于2011年推出微信服務(wù),用于為智能手機(jī)用戶免費(fèi)收發(fā)多媒體信息,目前微信支持跨通信運(yùn)營(yíng)商、跨操作系統(tǒng)平臺(tái),通過(guò)網(wǎng)絡(luò)快速發(fā)送免費(fèi)語(yǔ)音短信、視頻、圖片和文字等信息。截至2013年11月注冊(cè)用戶量已經(jīng)突破6億,是亞洲地區(qū)最大用戶群體的移動(dòng)即時(shí)通訊軟件。高校圖書(shū)館現(xiàn)已擁有各種功能豐富的數(shù)據(jù)庫(kù)系統(tǒng),本文從方便讀者查詢利用圖書(shū)館藏資源角度,給出一種微信公眾平臺(tái)與現(xiàn)有圖書(shū)館WEB應(yīng)用系統(tǒng)之間實(shí)現(xiàn)無(wú)縫集成的方式。
經(jīng)過(guò)多年的發(fā)展,現(xiàn)各高校圖書(shū)館都實(shí)現(xiàn)了資源的數(shù)字化計(jì)算機(jī)管理,但要使用這些數(shù)據(jù)必須要使用相應(yīng)的校園網(wǎng)絡(luò)或者使用圖書(shū)館指定的OPAC系統(tǒng)。當(dāng)前,許多讀者已經(jīng)轉(zhuǎn)變傳統(tǒng)的閱讀習(xí)慣,從閱讀傳統(tǒng)的紙質(zhì)圖書(shū)資源轉(zhuǎn)變?yōu)殚喿x電子圖書(shū)。而各高校圖書(shū)館現(xiàn)在的各種期刊庫(kù)、博碩士論文庫(kù)和電子圖書(shū)庫(kù)等電子資源都只能使用PC客戶端進(jìn)行閱讀和使用。對(duì)于利用智能手機(jī)為讀者服務(wù),國(guó)內(nèi)的數(shù)據(jù)庫(kù)提供商如中國(guó)知網(wǎng)、超星等公司提供了各自的Android版和IOS版閱讀器,pdf格式也可以使用相應(yīng)的閱讀器來(lái)閱讀。但閱讀前都必須下載安裝龐大的閱讀軟件,微信的跨平臺(tái)、跨運(yùn)營(yíng)商的特性可以方便的集成圖書(shū)館各個(gè)數(shù)據(jù)提供商紛繁各異的系統(tǒng),統(tǒng)一使用微信公眾號(hào)為讀者提供信息資源的扁平化多媒體服務(wù)。
對(duì)于各高校圖書(shū)館,移動(dòng)業(yè)務(wù)有手機(jī)短信支持、WAP網(wǎng)站等服務(wù)。對(duì)于手機(jī)短信服務(wù),因目前移動(dòng)、聯(lián)通和電信三家運(yùn)營(yíng)商的關(guān)系,不但短信業(yè)務(wù)收費(fèi),還不能同時(shí)支持三家運(yùn)營(yíng)商的業(yè)務(wù),這也造成圖書(shū)館手機(jī)短信業(yè)務(wù)受限的現(xiàn)狀。WAP網(wǎng)站雖然可以為讀者提供手機(jī)網(wǎng)絡(luò)訪問(wèn)的功能,但由于制作維護(hù)不便,目前也只有少量的高校圖書(shū)館使用。
微信公眾號(hào)的免費(fèi)開(kāi)放使用,為解決圖書(shū)館館藏資源的查詢、利用,提供了新媒體的解決方式和手段。通過(guò)圖書(shū)館WEB2.0系統(tǒng)把圖書(shū)館現(xiàn)有系統(tǒng)進(jìn)行資源整合,然后通過(guò)微信公眾號(hào)的推拉模式把多媒體資源信息從圖書(shū)館系統(tǒng)中提取通過(guò)微信公眾號(hào)再推送到讀者微信號(hào)上,從而實(shí)現(xiàn)信息資源的移動(dòng)媒體應(yīng)用,提高館藏資源的利用率。
基于微信公眾平臺(tái)的系統(tǒng)設(shè)計(jì)是構(gòu)建在現(xiàn)有圖書(shū)館WEB2.0信息系統(tǒng)之上的系統(tǒng),具體原理結(jié)構(gòu)如圖1所示。圖書(shū)館系統(tǒng)開(kāi)發(fā)人員向騰訊公司申請(qǐng)微信公眾平臺(tái)公眾號(hào),申請(qǐng)成功后,搭建自己的WEB應(yīng)用服務(wù)器,設(shè)置好微信公眾號(hào)的接口調(diào)用。通過(guò)指令解析模塊具體解析微信公眾號(hào)接收讀者發(fā)送的請(qǐng)求信息,解析后使用圖書(shū)館WEB服務(wù)器處理數(shù)據(jù),得到具體結(jié)果后返回給微信公眾號(hào),通過(guò)公眾號(hào)把具體查詢結(jié)果返回給微信讀者用戶,實(shí)現(xiàn)讀者使用微信公眾號(hào)獲取信息,圖書(shū)館利用微信公眾號(hào)推送數(shù)據(jù)。(圖附后)
微信公眾號(hào)現(xiàn)支持主流的程序開(kāi)發(fā)語(yǔ)言,本文采用JAVA語(yǔ)言實(shí)現(xiàn)具體功能。因微信公眾號(hào)開(kāi)發(fā)使用HTTP的GET方法來(lái)實(shí)現(xiàn)微信公眾號(hào)服務(wù)器與具體業(yè)務(wù)數(shù)據(jù)服務(wù)器間進(jìn)行連接建立,用POST方法來(lái)收發(fā)數(shù)據(jù)信息,為了具體區(qū)別HTTP的請(qǐng)求與響應(yīng),系統(tǒng)結(jié)構(gòu)采用JSP+Servlet+Spring-MVC實(shí)現(xiàn)具體業(yè)務(wù)處理與消息的傳遞與收發(fā)。
微信公眾平臺(tái)為了兼容各開(kāi)發(fā)語(yǔ)言,POST方法傳遞的數(shù)據(jù)采用XML格式封裝,把封裝后的數(shù)據(jù)推送到開(kāi)發(fā)者指定的應(yīng)用服務(wù)器,具體應(yīng)用服務(wù)器解析收到的XML數(shù)據(jù),獲取相應(yīng)的用戶請(qǐng)求,作用戶指定的操作后,返回操作結(jié)果數(shù)據(jù),通過(guò)WEB應(yīng)用服務(wù)器再把數(shù)據(jù)封裝為微信服務(wù)器能識(shí)別的XML數(shù)據(jù),并傳遞給微信公眾號(hào)服務(wù)器,經(jīng)微信公眾號(hào)服務(wù)器處理后轉(zhuǎn)發(fā)給請(qǐng)求服務(wù)的用戶。

圖1 圖書(shū)館微信系統(tǒng)結(jié)構(gòu)原理圖
現(xiàn)微信公眾平臺(tái)開(kāi)發(fā)要求開(kāi)發(fā)人員申請(qǐng)服務(wù)號(hào)或者訂閱號(hào),對(duì)于圖書(shū)館應(yīng)用,本館申請(qǐng)了訂閱號(hào)。要完成微信公眾平臺(tái)開(kāi)發(fā),需要作如下幾步:
一、開(kāi)放80端口的WEB服務(wù)器,本系統(tǒng)因采用JSP+Servlet開(kāi)發(fā),WEB服務(wù)器采用Tomcat;
二、驗(yàn)證服務(wù)器地址的有效性;
三、依據(jù)接口文檔實(shí)現(xiàn)業(yè)務(wù)邏輯。
服務(wù)器配置微信定義了服務(wù)器URL、Token和EncodingAESKey三個(gè)基本參數(shù),Token是由用戶自定義的接口參數(shù),EncodingAESKey由開(kāi)發(fā)者手動(dòng)填寫(xiě)或隨機(jī)生成,將用作消息體加解密密鑰。
驗(yàn)證服務(wù)器地址的有效性:
開(kāi)發(fā)者提交信息后,微信服務(wù)器發(fā)送GET請(qǐng)求到指定的服務(wù)器地址,GET請(qǐng)求攜帶四個(gè)參數(shù),如表1所示:

表1 GET請(qǐng)求參數(shù)
開(kāi)發(fā)者通過(guò)檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)。若確認(rèn)此次GET請(qǐng)求來(lái)自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容,則接入生效,成為開(kāi)發(fā)者成功,否則接入失敗。對(duì)于加密/校驗(yàn)流程如下:第一.將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序;第二.將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密;第三.開(kāi)發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信。實(shí)現(xiàn)與微信公眾平臺(tái)連接的關(guān)鍵代碼如下:
//微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫(xiě)的URL上,這里需要判定是否為GET請(qǐng)求
boolean isGet=request.getMethod().toLowerCase().equals("get");
System.out.println("獲得微信請(qǐng)求:"+request.get-Method()+"方式");
if(isGet){ //驗(yàn) 證URL真實(shí)性
String signature=request.getParameter("signature");//微信加密簽名
String timestamp=request.getParameter ("timestamp");//時(shí)間戳
String nonce=request.getParameter("nonce");//隨機(jī)數(shù)
String echostr=request.getParameter("echostr");//隨機(jī)數(shù)字串
List
params.add(token);
params.add(timestamp);
params.add(nonce);
//1.將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序列排序
Collections.sort(params,new Comparator
public int compare(Stringo1,String o2){
return o1.compareTo(o2); }});
//2.將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
String temp=SHA1.encode(params.get(0)+params.get(1)+params.get(2));
if(temp.equals(signature)){ response.getWriter().write(echostr); }
}else{ //處理接收消息 }
上述代碼實(shí)現(xiàn)了微信公眾號(hào)的接口配置,為了響應(yīng)用戶進(jìn)行收發(fā)消息,還需要在主要Servlet中完成doPost方法的編程,下面是本系統(tǒng)實(shí)現(xiàn)消息回復(fù)的部分關(guān)鍵代碼:
//將請(qǐng)求、響應(yīng)的編碼均設(shè)置為Utf_8(防止中文亂碼)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//調(diào)用核心業(yè)務(wù)類(lèi)接收消息、處理消息
String respMessage=CoreService.processRequest(request);
//響應(yīng)消息
PrintWriter out=response.getWriter();
out.print(respMessage);
out.close();
通過(guò)CoreService核心方法來(lái)完成讀者用戶的具體要求,得到結(jié)果后使用PrintWriter對(duì)象的response方法返回給請(qǐng)求用戶,從而實(shí)現(xiàn)消息的回復(fù)。CoreService對(duì)象負(fù)責(zé)具體實(shí)現(xiàn)圖書(shū)館資源的查詢、處理、續(xù)借操作。
基于微信公眾平臺(tái)的系統(tǒng)開(kāi)發(fā)使用了J2EE架構(gòu)中的部分內(nèi)容來(lái)完成開(kāi)發(fā),在系統(tǒng)開(kāi)發(fā)中面臨異構(gòu)系統(tǒng)部數(shù)據(jù)的轉(zhuǎn)換。為了兼容各個(gè)系統(tǒng),微信采用XML格式來(lái)封裝數(shù)據(jù)。本系統(tǒng)采用DOM4J框架[4]來(lái)完成微信息發(fā)送XML數(shù)據(jù)信息的解析,把微信傳送數(shù)據(jù)由XML數(shù)據(jù)轉(zhuǎn)換為Java對(duì)象來(lái)處理,當(dāng)請(qǐng)求處理完成后,再使用開(kāi)源的Xstream框架完成從Java對(duì)象到XML格式數(shù)據(jù)的轉(zhuǎn)換。因XML的數(shù)據(jù)描述性,傳送數(shù)據(jù)時(shí)采用CDATA格式完成特殊字符的數(shù)據(jù)傳送。下面以文本數(shù)據(jù)為例,描述具體數(shù)據(jù)格式:
以微信公眾號(hào)為基礎(chǔ)的圖書(shū)館應(yīng)用拓展了高校圖書(shū)館服務(wù)讀者的形式,提高了圖書(shū)館服務(wù)讀者的水平,讓讀者可以不受時(shí)空限制,任意訪問(wèn)學(xué)校圖書(shū)館的電子資源,為提升圖書(shū)館館藏資源利用率作出具有實(shí)際意義的探索。在提升服務(wù)質(zhì)量,服務(wù)水平的同時(shí)提升了圖書(shū)館的社會(huì)效應(yīng),具有一定的社會(huì)意義。
[1]微信,百度百科[EB/OL].http://baike.baidu.com/link?url=Vvcog4yYt6DXokWZsqiUks2YCamAIdRXFYOcmuufF8W671QCaogHv0wH4cZpLhd41HOAdUn1l4p8lMJMOzGIkKbpERJhUJbb4iJn8O6xLLi.
[2]移動(dòng)互聯(lián)網(wǎng)入口呈現(xiàn)多元化發(fā)展[EB/OL].中國(guó)互聯(lián)網(wǎng)數(shù)據(jù)平臺(tái).http://h.cnnicresearch.cn/.
[3]牟燕.新一代OPAC 系統(tǒng)在高校圖書(shū)館中的應(yīng)用研究[D].濟(jì)南:山東理工大學(xué),2010.
[4]周強(qiáng),李宇等.基于dom4j 轉(zhuǎn)換XML 為XHTML 頁(yè)面的方法[J].計(jì)算機(jī)技術(shù)與發(fā)展,2010,1:43-45.
[5]Xstream 框 架,Xstream 框 架 介 紹 [EB/OL].http://xstream.codehaus.org/.