微信作为APP客户端的图书馆公共服务平台
李文江1, 陈诗琴2
1重庆文理学院机电工程学院 重庆 402160
2重庆文理学院图书馆 重庆 402160
通讯作者: 李文江 E-mail: cqwulwj@126.com

作者贡献声明:

李文江: 提出研究思路、设计研究方案、程序开发实现, 论文起草;

陈诗琴: 论文最终版的修订。

摘要

【目的】利用微信公众平台, 扩展图书馆的信息服务渠道, 提升读者体验。【应用背景】作为时下最热门的社交工具, 微信成为一个很好的移动信息传播平台, 深受读者的关注。【方法】在开发模式下, 选择.NET作为开发环境, 基于开源SDK控件, 从微信公众平台发送的XML消息解析、与图书馆业务系统建立信息查询和将获取的查询信息进行XML封装等方面, 实现图书馆业务嵌入微信的应用。【结果】通过图书馆微信公众号, 读者凭指令可便捷获取图书馆资源和服务。【结论】本应用可以拓展图书馆的移动服务内容, 提高服务质量。

关键词: 开源软件; 图书馆服务; 微信公众平台; 开发模式; 读者互动
中图分类号:TP391.1
WeChat as Library Public Service Platform for the APP Client
Li Wenjiang1, Chen Shiqin2
1Faculty of Electromechanical Engineering, Chongqing University of Arts and Sciences, Chongqing 402160, China
2Library of Chongqing University of Arts and Sciences, Chongqing 402160, China
Abstract

[Objective] Extend the service channels of library and enhance patron experience by WeChat public platform. [Context] WeChat becomes a very popular mobile information communication platform, favors by readers. [Methods] In the development mode, the article selects the .NET as a development environment, realizes library business embedded the WeChat based on open source SDK by parsing XML messages sent from the public platform, building query with library operating system information and packaging the query results to XML. [Results] Readers can conveniently access the library resources and services with command interaction by WeChat public library. [Conclusions] This application can expand mobile library services and improve service quality.

Keyword: Open source software; Library service; WeChat public platform; Development mode; Patron interaction
1 引 言

随着移动互联网和智能手机日渐普及, 微信作为一款免费的社交软件, 其受众人数不断增加。微信公众平台方便快捷的信息传递方式契合了图书馆移动服务的需要。图书馆可以充分利用读者微信客户端作为APP终端, 将信息服务与微信公众平台[ 1]有效结合, 在读者交友娱乐的同时, 还可与图书馆进行信息交流, 扩展了图书馆信息服务渠道, 提升读者的应用体验[ 2, 3]

本文将详细介绍在微信公众平台的开发模式下, 如何设计并实现图书馆微信公众平台(简称“平台”)。

2 需求分析与设计思路
2.1 平台建设现状

(1) 平台功能

目前不少图书馆正在打造属于自己的微信公众平台。以“图书馆”为关键词能查找到很多微信公众号, 其中有少数公众号与图书馆业务系统对接, 实现了读者号的绑定、图书借阅查询、期刊查询等功能。其对接方式主要两种: 一种是在微信上输入指令或关键词进行查询的整合性对接, 如上海图书馆、重庆图书馆; 另一种是链接到图书馆Web系统上查询的形式性对接, 微信只充当浏览器功能, 如上海交通大学图书馆和广州图书馆。就多数公众号而言, 并未与图书馆业务系统对接, 提供的功能较为简单。

(2) 平台技术

从平台技术上看, 微信官网提供了详细的技术文档, 开发者根据自己熟悉的编程技术进行开发。在CNKI上, 以“微信”和“图书馆”为关键词进行检索, 检出文献中的平台设计多数直接按照技术文档进行原始开发。如文献[4]采用Dom4j解析XML消息, 文献[5]自建Java的Weixinservlet类来实现消息的接收解析等, 文献[6]自建PHP消息封装与回复函数reply($replytext)。这些文献的重点集中在如何按照技术文档一步步实现微信XML消息的解析、封装, 对于获取XML数据后如何处理或与图书馆业务系统如何对接介绍较少。

另外, 按照技术文档开发效率低下, 且编程难度较大。目前, 虽然微信官方提供了SDK, 但只有基于PHP环境的SDK。因此, 出现了很多第三方SDK, 如PHP环境的PHP SDK 增强版[ 7]和Wechat-php-sdk[ 8]; Java环境的Java SDK[ 9]和消息接口-java-jsp[ 10]; .NET环境的WeixinMpSdk[ 11]、Senparc.Weixin.MP SDK[ 12]和Loogn.WeiXinSDK[ 13]等。虽有这么多开源SDK, 但通过对CNKI中微信公众平台开发文献的检索, 并未发现开源SDK的应用设计。而且这些设计类文献, 主要基于Java、PHP两种环境进行设计开发, 没有基于.NET环境的相关文献。

2.2 设计思路

图书馆与读者交互信息较多, 若通过微信APP客户端响应每个读者的需求, 只能通过开发模式与图书馆各类系统进行整合性对接, 利用微信公众平台自动回复消息功能, 完成读者与图书馆间信息交互[ 4, 14]

根据微信公众平台信息交互的特点, 平台运行过程为: 接收读者发送的查询需求, 将查询关键词传递给图书馆业务系统执行查询, 返回查询结果并发送给读者客户端, 从而完成信息的自动交互。整个平台框架如图1 所示:

其中Web应用系统(简称“应用系统”)是实现平台的唯一核心系统, 它需要完成微信公众平台发送的XML消息解析、与图书馆业务系统建立信息查询、将获取的查询信息进行XML封装等工作[ 4]

本文基于.NET环境, 选择开源SDK软件, 直接调用SDK相应功能完成XML消息的解析与封装等工作, 从而降低程序开发难度。开发的重点是开源SDK软件的应用和平台与图书馆业务系统的对接方式。

3 应用系统的具体设计

基于上述设计思路, 应用系统的具体流程如图2所示:

图2 应用系统的具体流程

主要实现以下功能:

(1) 当读者关注图书馆微信公众号时, 应用系统自动向读者发送欢迎词和查询指令。

(2) 关注成功后, 读者在微信客户端发送包含读者号和密码的指令, 应用系统接收并解析指令, 获取读者号、密码和微信ID, 存储在数据库中, 为信息查询模块调用读者号和密码做准备。

(3) 读者在微信客户端输入相应查询指令后, 应用系统接收并解析指令, 分析指令内容, 启动相应的信息查询模块, 与图书馆业务系统建立查询, 返回查询结果。最后封装查询结果信息, 并发送给微信公众平台服务器(简称“微信服务器”)。

(4) 若读者取消公众号的关注后, 将从数据库中删除存储的读者号相关信息。

4 应用系统的具体实现
4.1 开源微信公众平台SDK的选用

(1) 开源SDK的简介

.NET环境下的Senparc.Weixin.MP.dll开源SDK控件[ 12]集成了URL有效性验证、接收消息、发送消息和自定义菜单等主要功能, 在开发中调用相应功能即可。其中SDK包含的关键类如表1所示:

表1 Senparc.Weixin.MP关键类介绍

(2) 开源SDK调用流程

在程序中, 主要涉及“消息接口URL有效性验证”、“发送的XML消息接收与解析”、“解析后消息类型的判断”和“回复XML消息封装与转换”这4个环节, 对应SDK类或方法的调用[ 15]。其整个调用流程如图3所示:

图3 开源SDK类或方法的调用流程

4.2 消息接口配置与验证

在微信公众平台管理系统中, 填写消息接口URL和Token参数。验证URL时, 微信服务器向URL发送GET请求。获取请求的Signature、Times-tamp、Nonce和Echostr参数值, 并将值传递给CheckSignature.Check方法进行URL有效性检验, 若确认请求来自微信服务器, 则原样返回Echostr参数内容, 表示验证成功。

4.3 XML消息接收与解析

将微信服务器发送的XML数据包转换为XDocument对象。调用RequestMessageFactory. GetRequestEntity方法, 将XDocument对象转换为Entities.RequestMessageBase实例, 取得消息类型RequestMsgType的值, 根据不同的值执行不同的操作。以下是程序的主要执行过程:

Dim doc As XDocument
doc = XDocument.Parse(XML)
Dim requestMessage As RequestMessageBase =
_RequestMessageFactory.GetRequestEntity(doc)
   ’获取RequestMessageBase 基础类实体, 用于消息类型判断
Select Case requestMessage.MsgType
   Case RequestMsgType.Event ’事件推送
      Dim requestMessageevent As
         RequestMessageEventBase =_RequestMessageFactory.GetRequestEntity(doc)
      Select Case requestMessageevent.Event
        Case [Event].subscribe ’关注事件
        … … ’向读者发送欢迎词和查询指令菜单
      Case [Event].unsubscribe ’取消关注事件
 		… …’解除读者号与微信ID的绑定
   End Select
Case RequestMsgType.Text ’文本类信息
   Dim requestMessagetxt As RequestMessageText = RequestMessageFactory.GetRequestEntity(doc) ’获取请求
   RequestMessageText类实体
   Dim content As String =requestMessagetxt.Content
   ’获取文本消息
   … … ’对文本内容分析, 识别查询指令类型, 启动相应的信息查询模块程序
End Select
4.4 获取图书馆查询信息

(1) 信息获取方式

图书馆业务系统中有自建系统、也有第三方的系统, 针对不同类型的业务系统建立不同的信息查询方式。本文主要采用以下三种方式:

①从FAQ知识库获取信息

将图书馆网站上常见的FAQ信息进行整理并建立知识库, 其字段如表2所示。当平台接收到查询命令后, 直接从知识库中返回查询结果, 节约查询响应时间。

表2 FAQ知识库

②从业务系统查询接口获取信息

针对自建业务系统和第三方预留数据查询接口的业务系统, 建立调用接口程序, 获取查询信息。

③从业务系统Web页面获取信息

针对第三方且未预留数据查询接口的业务系统, 从Web页面提取数据。引用Winista.HtmlParser.net开源控件, 建立模拟登录程序, 执行相关查询, 解析查询结果页面内容, 获取相关信息。

(2) 指令编码与查询控制

整个平台的查询指令主要分为三类:

①数字指令查询。由0-9构成单一指令, 主要针对FAQ知识库中的Inst字段进行查询。

②关键词查询。输入关键词进行查询, 主要针对FAQ知识库的FAQ标题和内容进行全文检索。

③复合指令查询。由a-z单个字母+#+关键词构成的字母复合指令, 主要针对图书馆业务系统信息查询。字母对应图书馆业务系统, “#”为分隔符。该类指令对应信息查询模块较多, 为减少主程序代码过长和提高执行效率, 将指令字母部分与对应的信息查询模块名称储存在数据库中, 其字段如表3所示:

表3 指令与信息查询模块关联

将①和③的指令存储在数据库中的优势: 具有良好的可扩展性, 在不调整指令分析控制程序的前提下, 可按照指令规则任意新增查询功能。

根据读者发送指令的类型, 启动相应信息查询模块, 其控制流程如图4所示。

图4 信息查询模块控制流程

4.5 XML消息封装与回复

调用ResponseMessageBase.CreateFromRequest-Message方法, 创建查询结果的ResponseMessage*实例, 通过EntityHelper.ConvertEntityToXmlString方法将其实例转换为文本并回复读者。以下是针对读者requestMessage会话回复文本消息的程序代码:

	Dim xmlString As String = Nothing
	Dim responseMessage As ResponseMessageText = _
	ResponseMessageBase.CreateFromRequestMessage
		(requestMessage, _ResponseMsgType.Text)
	responseMessage.Content ="回复文本内容"
	xmlString = EntityHelper.ConvertEntityToXmlString
		(responseMessage)
	Response.Write(xmlString)

在上述程序中, 将ResponseMessageText、Res-ponseMsgType.Text、responseMessage.Content三项作相应修改, 即可实现其他类型消息的回复。

5 实现效果

以读者“j00600”借阅情况查询为例, 在图书馆业务系统上查询结果如图5所示。在微信上查询, 首次需发送“f#j00600&123456”指令(读者号和密码)绑定读者号。当绑定成功后, 发送“g”借阅查询指令, 则收到借阅书目信息如图6所示。从两种查询方式来看结果是一致的, 实现了设计目标, 满足了读者对信息快速查询的需求。

图5 图书馆系统中的借阅情况

图6 借阅情况查询

6 结 语

本文设计并实现了基于Senparc.Weixin.MP开源控件的平台, 系统地介绍了设计思路、具体实现和最终实现效果。平台获取图书馆信息查询部分还可以进一步优化查询方式和查询效率, 缩短程序执行响应时间。为使其发挥更大的作用, 可将平台与现有的图书馆业务系统进行深度整合, 提供更多的信息查询服务; 并对公众号进行认证, 增加自定义菜单权限, 将查询指令方式转换为菜单向导方式, 从而提升读者应用体验, 为读者提供更多便捷服务。

参考文献
[1] 百度百科. 微信公众平台[EB/OL]. [2014-02-10]. http: //baike. baidu. com/view/9212662. htm.
(Baidu Wikipedia. WeChat Public Platform [EB/OL]. [2014-02-10]. http://baike.baidu.com/view/9212662.htm [本文引用:1]
[2] 肖金华, 黄丽红. 基于微信的图书馆信息服务模式研究[J]. 现代情报, 2013, 33(6): 55-57.
(Xiao Jinhua, Huang Lihong. Research on Information Service Mode of the Library Based on WeChat[J]. Journal of Modern Information, 2013, 33(6): 55-57. ) [本文引用:1]
[3] 张楠, 边丽梅. 微信在图书馆信息服务中的应用探析[J]. 图书馆研究, 2013, 43(5): 83-85.
(Zhang Nan, Bian Limei. The Application of Micro Message in Library Information Services[J]. Library Research, 2013, 43(5): 83-85. ) [本文引用:1]
[4] 张蓓, 窦天芳, 张成昱, . 开发模式下图书馆微信公众平台服务的设计与实现[J]. 现代图书情报技术, 2014 (1): 87-91.
(Zhang Bei, Dou Tianfang, Zhang Chengyu, et al. Design and Implementation of Library WeChat Public Platform Service in Development Mode[J]. New Technology of Library and Information Service, 2014 (1): 87-91. ) [本文引用:2] [CJCR: 1.073]
[5] 孔云, 廖寅, 资芸, . 图书馆微信服务平台的设计与实现[J]. 图书馆论坛, 2014, 34(2): 90-95.
(Kong Yun, Liao Yin, Zi Yun, et al. Design and Implementation of Weixin Service Platform for Library[J]. Library Tribune, 2014, 34(2): 90-95. ) [本文引用:1] [CJCR: 2.213]
[6] 叶海智, 刘强, 尹丹丹. 基于微信的图书馆移动信息服务设计与实现[J]. 软件导刊, 2013, 12(11): 88-90.
(Ye Haizhi, Liu Qiang, Yin Dand an. Design and Implementation of Library Mobile Information Service Based on WeChat[J]. Software Guide, 2013, 12(11): 88-90. ) [本文引用:1]
[7] 微信公共平台PHP SDK增强版[EB/OL]. [2014-02-10]. http: //www. blogjava. net/chenglu/archive/2013/08/24/403271. html.
( WeChat Public Platform PHP SDK Enhanced[EB/OL]. [2014-02-10]. http://www.blogjava.net/chenglu/archive/2013/08/24/403271.html [本文引用:1]
[8] dodgepudding/wechat-php-sdk• github[EB/OL]. [2014-02-10]. https://github.dodgepudding/wechat-php-sdk. [本文引用:1]
[9] 微信公共平台开发模式(JAVA) SDK[EB/OL]. [2014-02-10]. http: //www. oschina. net/p/wechat-java-sdk.
( WeChat Public Platform Development Mode(JAVA) SDK[EB/OL]. [2014-02- 10]. http://www.oschina.net/p/wechat-java-sdk [本文引用:1]
[10] 微信公众平台消息接口-java-jsp[EB/OL]. [2014-02-10]. http: //blog. csdn. net/wangqianjiao/article/details/8469780.
( WeChat Public Platform Message Interface-java-jsp[EB/OL]. [2014-02-10]. http://blog.csdn.net/wangqianjiao/article/details/8469780 [本文引用:1]
[11] 微信公众平台SDK-微信公众号导航[EB/OL]. [2014-02-10]. http: //www. qq8384. com/index. php?m=article&a=index&id=139.
( WeChat Public Platform SDK -WeChat Public Navigation [EB/OL]. [2014-02-10]. http://www.qq8384.com/index.php?m=article&a=index&id=139 [本文引用:1]
[12] Senparc. Weixin. MP-微信公众平台SDK[EB/OL]. [2014-02- 10]. http: //weixin. senparc. com/.
( Senparc. Weixin. MP-WeChat Public Platform SDK[EB/OL]. [2014-02-10]. http://weixin.senparc.com/ [本文引用:2]
[13] 微信公众平台SDK [EB/OL]. [2014-02-10]. http: //www. cnblogs. com/loogn/p/3525449. html.
( WeChat Public Platform SDK[EB/OL]. [2014-02-10]. http://www.cnblogs.com/loogn/p/3525449.html [本文引用:1]
[14] 江波, 覃燕梅. 基于微信的移动图书馆APP服务系统设计与实现[J]. 现代情报, 2013, 33(6): 41-44.
(Jiang Bo, Qin Yanmei. Design and Implementation of Mobile Library APP Service System Based on WeChat[J]. Journal of Modern Information, 2013, 33(6): 41-44. ) [本文引用:1]
[15] Senparc. Weixin. MP SDK微信公众平台开发教程索引[EB/OL]. [2014-02-10]. http: //www. cnblogs. com/szw/archive/2013/05/14/weixin-course-index. html.
(Senparc. Weixin. MP SDK WeChat Public Platform Development Tutorial Indexes [EB/OL]. [2014-02-10]. http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html [本文引用:1]