基于互联网开放平台的微信公众号构建
2017-06-22段任
段任
(云南财经大学 信息学院,昆明 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.