王龙军
(成都工业学院,四川 成都 611730)
随着移动互联网的发展和移动阅读方式的改变,移动阅读的流行让图书馆移动业务的发展成为比较迫切的任务,微信公众平台[1,2]拥有庞大的微信用户群体,在高校图书馆进行图书馆微信号的开发越来越有必要,建立图书馆微信号能让图书馆的业务进一步得到扩展。选择合适的语言来开发微信公众号非常重要,Java和Kotlin作为目前比较流行的开发语言,具有性能稳定、安全性高的特点,用这两种开发语言来开发微信公众平台,能让开发出来的系统具有高并发、高响应、数据一致性等特点,因此有必要引入这两门语言来开发微信公众平台。
Kotlin[3,4]是JetBrains推出的一门静态编程语言,Kotlin既能在JVM(Java虚拟机)上运行,又能在非JVM上运行,主要原因在于Kotlin代码可以编译成Java字节码,也可以编译成JavaScript。Kotlin可以做到与Java[5]语言百分之百互通,并且Kotlin的代码更加简洁,代码效率更高,能够自由使用Java的全部框架和库,Kotlin可以调用Java代码,当然Java也可以调用Kotlin代码,两门语言的代码可以在同一项目中共存,同时Kotlin具有现代流行语言的高级特性——语法糖、函数式编程等。
由于Java和Kotlin程序都是按照JVM规范进行编译,编译后生成的字节码完全兼容,因此Java调用Kotlin属性和方法是非常方便和简洁的,但是两者之间在属性和字段上还是有一些区别。其中Kotlin的属性和Java 的成员变量是不同的,主要表现为一个Kotlin类中的属性类似于Java定义一个类的属性和getter、setter方法的总和,在默认情况下Kotlin已经实现了类中的getter和setter方法,也就是说Kotlin不需要再写getter和setter方法,这对于常常进行类封装时要书写大量的getter和setter方法无疑是一个好消息,能大大节省书写代码的工作量。
Kotlin定义属性时可以不显示指定属性的类型,这主要是由于Kotlin语言能够根据属性来推断其类型,Kotlin可以定义读写属性和只读属性两种类型。Kotlin使用var关键字来定义类的读写属性,不需要定义getter方法,Kotlin编译系统会为其隐含地生成getter方法;使用val定义类的只读属性,同样也不需要书写getter方法和setter方法,Kotlin编译系统会为读写属性生成getter和setter方法。
Java调用Kotlin代码可以直接通过getter / setter方法对Kotlin类的属性取值或赋值,以建立菜单类为例,用Kotlin封装建立一个菜单类menu,内容如下:
class Menu {
var MenuName: String? = null
var MenuType: String? = null
}
Java类调用Kotlin属性和方法如下:
Menu xtcd=new Menu();
xtcd.setMenuName(“借阅历史”);
xtcd.setMenuType(“click”);
2.1.1 自定义菜单介绍。自定义菜单是微信公众平台非常重要的一个功能,自定义菜单能让用户轻松地和公众平台实现交互,用户只要点击菜单项就能获得一个相关的内容。目前自定义菜单一级菜单可以是1~3个,在一级菜单下的二级菜单有1~5个,一级菜单包含1~8个字符(4个汉字),二级菜单有1~14个字符(7个汉字),多余14个字符的部分以“…”来显示,这些规定都是微信公众平台自定义菜单开发的人为规定,开发者有必要了解一下。
2.1.2 自定义菜单分类。自定义菜单可以实现的功能也是多种多样的,根据实现功能的不同,微信自定义菜单按钮共分为10种类型,分别为click(点击推事件)、view(跳转URL)、scancode_push(扫码推事件)、scancode_waitmsg(扫码推事件且弹出“消息接受中”提示框)、pic_sysphoto(弹出系统拍照发图)、pic_photo_or_album(弹出拍照或相册发图)、pic_weixin(弹出微信相册发图器)、location_select(弹出地理位置选择器)、media_id(下发消息)、view_limited(跳转图文消息URL)。本系统用得最多的是click(点击事件)和view(访问网页)两种,主要介绍这两种类型。
click:该类型表示被点击后推送事件,具体为click按钮被点击后,微信服务器会给开发者通过消息接口来推送结构为event的消息,并附上开发者在按钮中填写的自定义key值,开发者与用户通过key值进行交互。
view:该类型表示被点击后跳转到指定的URL地址上,具体为view按钮被点击后,开发者在该按钮中设置的网页URL将会在微信客户端中打开,通过网页授权获取用户基本信息接口与该操作相结合,可以在微信公众平台中获取用户基本信息。
图书馆微信公众平台的功能模块一般需要通过自定义菜单的菜单项来实现,自定义菜单模块主要实现挂接系统多个模块,本系统根据其功能的类别分为三大板块:个人图书馆、服务与资源、资讯,对应于图书馆微信公众平台3个一级菜单,每个板块下面又有3~5个子板块,对应于图书馆微信公众平台二级菜单,具体如图1所示。
图1 系统三大板块结构
主界面包括3个一级菜单,分别为“个人图书馆”“服务与资源”和“资讯”,代表着公众平台三大主要的功能板块。触摸点击一级菜单上,会弹出相应的下拉菜单,下拉菜单对应着图书馆公众平台具体的功能模块。
创建菜单分两步:
第一步:获取接口凭证access_token。首先获取AppID和AppSecret值,自定义菜单申请成功后,在开发模式中可以获得AppID和AppSecret值。然后如果开发自定义菜单,那么微信公众平台开放菜单接口,开发者调用菜单接口需要传入一个参数access_token,它是微信公众号的全局唯一票据,也是菜单接口的访问凭证,微信公众号可以使用AppID和AppSecret,以https 协议和get方式获取访问特殊接口所必需的凭证access_token。
获取凭证接口的请求地址如下:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,接口调用成功的情况下,微信服务器会返回一个JSON数据,该数据包含access_token和expires_in两个元素,如下:{"access_token":"ACCESS_TOKEN","expires_in":7200}。
第二步:采用Kotlin和Java创建自定义菜单。本系统采用面向对象的编程方式,最终提交的JSON格式菜单数据由对象通过转化而来,没有采用在程序中拼凑JSON格式数据的方法,因此利用Kotlin类来封装JSON格式的菜单结构,建立三个类,分别为Item类、ClickItem类、ViewItem类,由于一级菜单包含二级菜单,需要建立复合类型的按钮类ComplexItem,最后是对整个菜单对象的封装,其类为Menu。
class Item {var name: String? = null}
class ClickItem:Item() {
var type: String? = null
var key: String? = null}
根据封装的类通过Java来创建菜单,最终得到JSON格式的菜单数据,为了演示,展示部分Java关键代码:
ClickItem ci11 = new ClickItem();
ci11.setName("绑定借阅卡");
ci11.setType("click");
ci11.setKey("11");
ClickItem ci12 = new ClickItem();
ci12.setName("借阅历史");
ci12.setType("click");
ci12.setKey("12");
ComplexItem mainci1 = new ComplexItem();
mainci1.setName("个人图书馆");
mainci1.setSub_button(new ClickItem[] { ci11, ci12});
得到JSON格式的菜单结构之后,需要通过HTTPS POST请求将JSON菜单结构提交给https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN,然后通过Java代码来创建菜单,再通过判断,菜单是从click类型还是view类型创建响应的菜单事件。
笔者主要介绍了Kotlin、自定义菜单分类及Kotlin在自定义菜单的设计和实现,充分利用Kotlin的优点和通过Java调用Kotlin来进行混合开发,两者的结合能大大提升开发的效率,开发出来的系统在实践中证明性能稳定、安全性高、具有高并发性。