王龍軍
(成都工業(yè)學(xué)院,四川 成都 611730)
隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展和移動(dòng)閱讀方式的改變,移動(dòng)閱讀的流行讓圖書館移動(dòng)業(yè)務(wù)的發(fā)展成為比較迫切的任務(wù),微信公眾平臺(tái)[1,2]擁有龐大的微信用戶群體,在高校圖書館進(jìn)行圖書館微信號(hào)的開發(fā)越來越有必要,建立圖書館微信號(hào)能讓圖書館的業(yè)務(wù)進(jìn)一步得到擴(kuò)展。選擇合適的語言來開發(fā)微信公眾號(hào)非常重要,Java和Kotlin作為目前比較流行的開發(fā)語言,具有性能穩(wěn)定、安全性高的特點(diǎn),用這兩種開發(fā)語言來開發(fā)微信公眾平臺(tái),能讓開發(fā)出來的系統(tǒng)具有高并發(fā)、高響應(yīng)、數(shù)據(jù)一致性等特點(diǎn),因此有必要引入這兩門語言來開發(fā)微信公眾平臺(tái)。
Kotlin[3,4]是JetBrains推出的一門靜態(tài)編程語言,Kotlin既能在JVM(Java虛擬機(jī))上運(yùn)行,又能在非JVM上運(yùn)行,主要原因在于Kotlin代碼可以編譯成Java字節(jié)碼,也可以編譯成JavaScript。Kotlin可以做到與Java[5]語言百分之百互通,并且Kotlin的代碼更加簡潔,代碼效率更高,能夠自由使用Java的全部框架和庫,Kotlin可以調(diào)用Java代碼,當(dāng)然Java也可以調(diào)用Kotlin代碼,兩門語言的代碼可以在同一項(xiàng)目中共存,同時(shí)Kotlin具有現(xiàn)代流行語言的高級(jí)特性——語法糖、函數(shù)式編程等。
由于Java和Kotlin程序都是按照J(rèn)VM規(guī)范進(jìn)行編譯,編譯后生成的字節(jié)碼完全兼容,因此Java調(diào)用Kotlin屬性和方法是非常方便和簡潔的,但是兩者之間在屬性和字段上還是有一些區(qū)別。其中Kotlin的屬性和Java 的成員變量是不同的,主要表現(xiàn)為一個(gè)Kotlin類中的屬性類似于Java定義一個(gè)類的屬性和getter、setter方法的總和,在默認(rèn)情況下Kotlin已經(jīng)實(shí)現(xiàn)了類中的getter和setter方法,也就是說Kotlin不需要再寫getter和setter方法,這對于常常進(jìn)行類封裝時(shí)要書寫大量的getter和setter方法無疑是一個(gè)好消息,能大大節(jié)省書寫代碼的工作量。
Kotlin定義屬性時(shí)可以不顯示指定屬性的類型,這主要是由于Kotlin語言能夠根據(jù)屬性來推斷其類型,Kotlin可以定義讀寫屬性和只讀屬性兩種類型。Kotlin使用var關(guān)鍵字來定義類的讀寫屬性,不需要定義getter方法,Kotlin編譯系統(tǒng)會(huì)為其隱含地生成getter方法;使用val定義類的只讀屬性,同樣也不需要書寫getter方法和setter方法,Kotlin編譯系統(tǒng)會(huì)為讀寫屬性生成getter和setter方法。
Java調(diào)用Kotlin代碼可以直接通過getter / setter方法對Kotlin類的屬性取值或賦值,以建立菜單類為例,用Kotlin封裝建立一個(gè)菜單類menu,內(nèi)容如下:
class Menu {
var MenuName: String? = null
var MenuType: String? = null
}
Java類調(diào)用Kotlin屬性和方法如下:
Menu xtcd=new Menu();
xtcd.setMenuName(“借閱歷史”);
xtcd.setMenuType(“click”);
2.1.1 自定義菜單介紹。自定義菜單是微信公眾平臺(tái)非常重要的一個(gè)功能,自定義菜單能讓用戶輕松地和公眾平臺(tái)實(shí)現(xiàn)交互,用戶只要點(diǎn)擊菜單項(xiàng)就能獲得一個(gè)相關(guān)的內(nèi)容。目前自定義菜單一級(jí)菜單可以是1~3個(gè),在一級(jí)菜單下的二級(jí)菜單有1~5個(gè),一級(jí)菜單包含1~8個(gè)字符(4個(gè)漢字),二級(jí)菜單有1~14個(gè)字符(7個(gè)漢字),多余14個(gè)字符的部分以“…”來顯示,這些規(guī)定都是微信公眾平臺(tái)自定義菜單開發(fā)的人為規(guī)定,開發(fā)者有必要了解一下。
2.1.2 自定義菜單分類。自定義菜單可以實(shí)現(xiàn)的功能也是多種多樣的,根據(jù)實(shí)現(xiàn)功能的不同,微信自定義菜單按鈕共分為10種類型,分別為click(點(diǎn)擊推事件)、view(跳轉(zhuǎn)URL)、scancode_push(掃碼推事件)、scancode_waitmsg(掃碼推事件且彈出“消息接受中”提示框)、pic_sysphoto(彈出系統(tǒng)拍照發(fā)圖)、pic_photo_or_album(彈出拍照或相冊發(fā)圖)、pic_weixin(彈出微信相冊發(fā)圖器)、location_select(彈出地理位置選擇器)、media_id(下發(fā)消息)、view_limited(跳轉(zhuǎn)圖文消息URL)。本系統(tǒng)用得最多的是click(點(diǎn)擊事件)和view(訪問網(wǎng)頁)兩種,主要介紹這兩種類型。
click:該類型表示被點(diǎn)擊后推送事件,具體為click按鈕被點(diǎn)擊后,微信服務(wù)器會(huì)給開發(fā)者通過消息接口來推送結(jié)構(gòu)為event的消息,并附上開發(fā)者在按鈕中填寫的自定義key值,開發(fā)者與用戶通過key值進(jìn)行交互。
view:該類型表示被點(diǎn)擊后跳轉(zhuǎn)到指定的URL地址上,具體為view按鈕被點(diǎn)擊后,開發(fā)者在該按鈕中設(shè)置的網(wǎng)頁URL將會(huì)在微信客戶端中打開,通過網(wǎng)頁授權(quán)獲取用戶基本信息接口與該操作相結(jié)合,可以在微信公眾平臺(tái)中獲取用戶基本信息。
圖書館微信公眾平臺(tái)的功能模塊一般需要通過自定義菜單的菜單項(xiàng)來實(shí)現(xiàn),自定義菜單模塊主要實(shí)現(xiàn)掛接系統(tǒng)多個(gè)模塊,本系統(tǒng)根據(jù)其功能的類別分為三大板塊:個(gè)人圖書館、服務(wù)與資源、資訊,對應(yīng)于圖書館微信公眾平臺(tái)3個(gè)一級(jí)菜單,每個(gè)板塊下面又有3~5個(gè)子板塊,對應(yīng)于圖書館微信公眾平臺(tái)二級(jí)菜單,具體如圖1所示。
圖1 系統(tǒng)三大板塊結(jié)構(gòu)
主界面包括3個(gè)一級(jí)菜單,分別為“個(gè)人圖書館”“服務(wù)與資源”和“資訊”,代表著公眾平臺(tái)三大主要的功能板塊。觸摸點(diǎn)擊一級(jí)菜單上,會(huì)彈出相應(yīng)的下拉菜單,下拉菜單對應(yīng)著圖書館公眾平臺(tái)具體的功能模塊。
創(chuàng)建菜單分兩步:
第一步:獲取接口憑證access_token。首先獲取AppID和AppSecret值,自定義菜單申請成功后,在開發(fā)模式中可以獲得AppID和AppSecret值。然后如果開發(fā)自定義菜單,那么微信公眾平臺(tái)開放菜單接口,開發(fā)者調(diào)用菜單接口需要傳入一個(gè)參數(shù)access_token,它是微信公眾號(hào)的全局唯一票據(jù),也是菜單接口的訪問憑證,微信公眾號(hào)可以使用AppID和AppSecret,以https 協(xié)議和get方式獲取訪問特殊接口所必需的憑證access_token。
獲取憑證接口的請求地址如下:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,接口調(diào)用成功的情況下,微信服務(wù)器會(huì)返回一個(gè)JSON數(shù)據(jù),該數(shù)據(jù)包含access_token和expires_in兩個(gè)元素,如下:{"access_token":"ACCESS_TOKEN","expires_in":7200}。
第二步:采用Kotlin和Java創(chuàng)建自定義菜單。本系統(tǒng)采用面向?qū)ο蟮木幊谭绞?,最終提交的JSON格式菜單數(shù)據(jù)由對象通過轉(zhuǎn)化而來,沒有采用在程序中拼湊JSON格式數(shù)據(jù)的方法,因此利用Kotlin類來封裝JSON格式的菜單結(jié)構(gòu),建立三個(gè)類,分別為Item類、ClickItem類、ViewItem類,由于一級(jí)菜單包含二級(jí)菜單,需要建立復(fù)合類型的按鈕類ComplexItem,最后是對整個(gè)菜單對象的封裝,其類為Menu。
class Item {var name: String? = null}
class ClickItem:Item() {
var type: String? = null
var key: String? = null}
根據(jù)封裝的類通過Java來創(chuàng)建菜單,最終得到JSON格式的菜單數(shù)據(jù),為了演示,展示部分Java關(guān)鍵代碼:
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("個(gè)人圖書館");
mainci1.setSub_button(new ClickItem[] { ci11, ci12});
得到JSON格式的菜單結(jié)構(gòu)之后,需要通過HTTPS POST請求將JSON菜單結(jié)構(gòu)提交給https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN,然后通過Java代碼來創(chuàng)建菜單,再通過判斷,菜單是從click類型還是view類型創(chuàng)建響應(yīng)的菜單事件。
筆者主要介紹了Kotlin、自定義菜單分類及Kotlin在自定義菜單的設(shè)計(jì)和實(shí)現(xiàn),充分利用Kotlin的優(yōu)點(diǎn)和通過Java調(diào)用Kotlin來進(jìn)行混合開發(fā),兩者的結(jié)合能大大提升開發(fā)的效率,開發(fā)出來的系統(tǒng)在實(shí)踐中證明性能穩(wěn)定、安全性高、具有高并發(fā)性。