Java与Kotlin在图书馆微信公众平台消息交互的应用

2021-12-31 08:55王龙军
内蒙古科技与经济 2021年4期
关键词:字段开发者消息

王龙军

(成都工业学院,四川 成都 611730)

微信公众平台[1]在高校图书馆中应用越来越广泛,读者通过关注图书馆微信公众号,可以能使得读者方便可以实时查询到馆藏书目和电子资源等信息,同时也能够通过微信公众平台了解最新的新闻、通知、讲座等信息,当然,还有跟其他平台整合的功能,比如读者利用公众平台实时查询进馆人数,可以实时查询图书馆座位使用情况和剩余数量。

1 微信公众平台交互原理与开发语言的选择

1.1 微信公众平台交互原理

微信公众平台能够与读者进行消息交互,主要是由于微信公众平台消息接口的功劳,它为开发者提供了与读者进行消息交互的能力。对于成功接入消息接口的公众账号,当读者发消息给公众账号时,微信公众平台服务器会使用HTTP请求对接入的URL地址进行消息推送,公众号服务器可通过响应包返回个性的回复,从而达到回复消息的目的。总的来说,就是微信公众号可以使用自己的程序来和读者对话。

图书馆微信公众平台交互详细过程如下:①公众平台要与读者进行交互,读者要在微信客户端发送消息给微信服务器,微信服务器接收到用户的消息处理之后,通过开发者配置的URL和Token 来找到公众号服务器,并以XML形式向公众号服务器发送消息;②公众号服务器获取这些消息之后,需要按照微信服务器传过来的XML的语言进行解析,获取到信息之后,根据读者的内容和自己的服务器逻辑;③然后以XML形式封装消息,传回到微信服务器上去;④微信服务器解析这些消息,并把相应的内容还回给用户。

1.2 开发语言的选择

Kotlin[2~3]是JetBrains在2011年推出的一门全新的编程语言,可运行在JVM(Java 虚拟机)上。Kotlin 程序可以编译成字节码文件,字节码文件可以直接在 JVM 上运行,因此 Kotlin非常适合开发后端Web应用程序。Kotlin 与现有的 Java[4]语言包保持完全兼容,它完全可以利用Java领域现有的各种技术框架。

微信公众平台的处理程序实质上是一个Web项目,主要对微信服务器发送的HTTP请求进行接收和响应,支持微信公众平台开发的语言有Java、PHP、ASP.NET等。选择Java与Kotlin,主要原因在于Java在开发服务器方面具有无可比拟的安全性、稳定性,而Kotlin可以与现有的Java 语言保持100% 的兼容性,而且 Kotlin 代码比 Java代码更简洁、更富有表现力。 简单来说,微信公众平台每个分类的消息都有至少4个及以上的字段,用Java来封装消息时就会大量书写getter和setter方法,而此时采用Kotlin来封装消息,只需要定义字段属性,而Kotlin会默认生成getter和setter方法,这样会减少不必要的相似代码的重复,提高开发效率。

2 基于Java与Kotlin的消息接收与回复

2.1 消息的分类与封装

2.1.1 消息的分类。 微信服务器与公众号服务器交互的消息[5]可以分为三大类:请求消息、事件和响应消息。在这里,微信服务器传递给公众号服务器是请求信息、事件,而公众号服务器返回信息给微信公众号服务器是响应消息。

请求消息指的是当普通用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,即这里定义的是用户能够发送哪些类型的消息、消息有哪些字段、消息被微信服务器以什么方式转发给我们的公众号服务器。

事件指的是当用户对公众平台做出某种操作后,微信服务器会将相应的事件消息以XML格式通过POST方式发送到我们填写的URL上,事件也可以说成“接收事件推送”。在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许。

响应消息指的是公众号服务器在接收到用户发送的消息后,会产生一个POST请求,可以通过返回特定的XML结构对消息进行响应,现支持回复文本、图片、图文、语音、视频、音乐,严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。

2.1.2 消息的封装。 微信公众平台官方文档对于消息类型都指定为XML数据格式,要用Java语言对消息中的字段进行封装,由于请求消息、事件和响应消息具有共有的字段,可以使用Java类对三者的公共字段进行封装,形成一个公共的基类Message,这个基类具有3种消息的公共字段,包括ToUserName(开发者微信号)、FromUserName(发送方账号,OPEN_ID)、CreateTime(消息的创建时间)、MsgType(消息类型)。采用Kotlin来封装这个消息,Message类内容如下:

open class Message {

var ToUserName:String?=null; //开发者微信号

var FromUserName:String?=null; //发送方账号(OpenID)

var CreateTime:int=0;//消息创建时间(整型)

var MsgType:String?=null; //消息类型

}

请求消息可以细分为文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息、链接消息七类,用Java类封装请求信息时,让请求信息类RequestMessage继承消息基类Message,这七类请求消息都添加一个共同的字段MsgId(消息ID)。Message类内容如下:

open class RequestMessage:Message(){

MsgID:int=0;//消息ID

}

请求消息中文本消息主要展示文本消息内容,即用户向微信公众平台发送一段文字时,微信服务器会向公众号服务器发送XML格式的消息,用Java对其进行消息封装,建立文字消息类TextMessage,继承请求消息基类RequestMessage,增加一个表示文本消息的内容字段Content,增加Content字段的getter、setter方法。请求消息中图片消息、语音消息、视频消息等消息的封装跟文本消息封装类似,就不再一一赘述。

事件消息包括关注/取消关注事件、扫描带参数二维码事件、上报地理位置事件、自定义菜单事件五类消息,跟封装请求消息一样,建立事件消息EventMessage,继承于Message,该类添加一个字段Event,其内容不再展示。事件消息的子方法跟请求消息的子方法在建立时类似,这里就不再一一阐述。

响应消息也可称为回复消息,包括回复文本消息、回复图片消息、回复语音消息、回复视频消息、回复音乐消息、回复图文消息五类消息,跟前面两类消息一样,建立响应消息ResponseMessage,继承于Message,其子消息的封装跟请求消息类似。响应消息的子方法跟请求消息的子方法在建立时类似,这里就不再一一阐述。

2.1.3 Java与Kotlin相互调用。 Kotlin和Java是两种不同的语言,所以在互相调用的时候,会有一些特殊的语法。Kotlin中对象属性默认就带有setter和getter方法,所以在Kotlin中调用Java时直接变量名点属性就可获取到属性的setter和getter的一些操作。Kotlin可以自动识别Java中的getter/setter方法;在Java中可以过getter/setter操作Kotlin属性。

举个简单的例子来说明,现在系统要用Java调用Kotlin封装的消息Message类,代码如下:

Message message=new Message();

message.setToUserName(“zhangsan”);

message.getToUserName();

如果Kotlin在类中封装其他方法,那么在Java中可以同样的调用,本系统主要以Java为主的Web项目,辅助Kotlin对消息进行封装,当然在系统中可以让Kotlin对消息进行各种处理,然后Java调用Kotlin的方法。

2.2 消息的接收与回复

接收消息和回复消息是相互关联的动作,在一个交互场景中接收消息、回复消息,一般情况就是公众平台通过分析接收到的消息,会给出对应的回复。具体到项目实践中是这样的,当图书馆读者向图书馆公众账号发消息时,微信服务器会先接收到用户发送的消息,然后将读者消息按照指定的XML格式组装好数据,最后POST消息的XML数据包到开发者填写的URL上。

接收消息的过程其实就是获取微信服务器通过post请求的发送给我们公众号服务器的XML数据,然后我们的公众号服务器再对这个XML进行解析处理的过程。具体过程如下:在request对象中封装微信服务器发来的请求消息,可以从request对象中取出请求中包含的数据,使用request对象的getInputStream()方法获取请求中的参数。为了方便解析XML数据,使用Kotlin写一个函数xmlToMap(request),读取输入流,解析XML消息,最后将处理的消息放到HashMap中。在处理微信请求的入口servlet的doPost方法中调用xmlToMap(request)方法来解析微信请求信息,然后根据消息类型返回相应的方法。

回复消息的过程刚好跟接收消息的过程相反,对于每个POST请求,需要返回XML结构,对该消息进行响应。Kotlin将各种类型的响应消息封装成对象,现在需要把响应的对象转换成XML字符串,写一个函数messageToXml(textMessage)实现这个功能。

部分关键代码如下:

fun buildResponseMessage(map:Map):String {

var responseMessage = "" //响应消息

val msgType = map.get("MsgType").toString()//得到消息类型

println("MsgType:$msgType")

//消息类型

val messageEnumType = MessageType.valueOf(MessageType::class.java,msgType.toUpperCase())

when (messageEnumType) {

TEXT -> responseMessage = handleTextMessage(map) //处理文本消息

IMAGE -> responseMessage = handleImageMessage(map) //处理图片消息

VOICE -> responseMessage = handleVoiceMessage(map)//处理语音消息

VIDEO -> responseMessage = handleVideoMessage(map)//处理视频消息

SHORTVIDEO ->responseMessage = handleSmallVideoMessage(map)//处理小视频消息

LOCATION -> responseMessage = handleLocationMessage(map)//处理位置消息

LINK -> responseMessage = handleLinkMessage(map)//处理链接消息

EVENT -> responseMessage = handleEventMessage(map)//处理事件消息

}

return responseMessage//返回响应消息

}

3 结束语

笔者详细介绍了微信公众平台交互原理,选择Java与Kotlin作为开发语言的理由,以及如何利用Java与Kotlin实现图书馆微信公众平台消息的接收和回复,该平台能够为图书馆提供实时交互服务、拓展服务空间、提高读者的满意程度以及增加读者的黏度。

猜你喜欢
字段开发者消息
带钩或不带钩选择方框批量自动换
一张图看5G消息
浅谈台湾原版中文图书的编目经验
晚步见道旁花开
“85后”高学历男性成为APP开发新生主力军
16%游戏开发者看好VR
无正题名文献著录方法评述
无正题名文献著录方法评述