微信公眾帳號(hào)自定義菜單創(chuàng)建及事件響應(yīng)開發(fā)教程附j(luò)ava源代碼0002_第1頁
微信公眾帳號(hào)自定義菜單創(chuàng)建及事件響應(yīng)開發(fā)教程附j(luò)ava源代碼0002_第2頁
微信公眾帳號(hào)自定義菜單創(chuàng)建及事件響應(yīng)開發(fā)教程附j(luò)ava源代碼0002_第3頁
微信公眾帳號(hào)自定義菜單創(chuàng)建及事件響應(yīng)開發(fā)教程附j(luò)ava源代碼0002_第4頁
微信公眾帳號(hào)自定義菜單創(chuàng)建及事件響應(yīng)開發(fā)教程附j(luò)ava源代碼0002_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、微信5. 0發(fā)布2013年8月5 h ,伴隨著微信5. 0 iphone版的發(fā)布,公眾平臺(tái)也進(jìn)行了重要的 更新,主要包括:1. 運(yùn)營主體為組織,町選擇成為服務(wù)號(hào)或者訂閱號(hào);2. 服務(wù)號(hào)可以申請自定義菜單;3. 使用qq登錄的公眾號(hào),可以升級(jí)為郵箱登錄;4. 使用郵箱登錄的公眾號(hào),可以修改登錄郵箱;5. 編輯圖文消息對選填作者;6. 群發(fā)消息可以同步到騰訊微廨。其屮,大家議論最多的當(dāng)屬前兩條,就是關(guān)于帳號(hào)類型和自定義菜單的更新, 我這里做幾點(diǎn)補(bǔ)充說明:1. 目前公眾號(hào)類型分為兩種:服務(wù)號(hào)和訂閱號(hào),8月5 h平臺(tái)更新后所有的帳 號(hào)默認(rèn)為訂閱號(hào),有一次轉(zhuǎn)換成服務(wù)號(hào)的機(jī)會(huì);2. 服務(wù)號(hào)主要而向企業(yè)、政

2、府和其他纟r織,而訂閱號(hào)主要面向媒體和個(gè)人;3. 只有服務(wù)號(hào)可以中請自定義菜單,訂閱號(hào)不能中請;4服務(wù)號(hào)每月只能群發(fā)一條消息,而訂閱號(hào)每天能群發(fā)一條消息。平臺(tái)更新后,讓很多人糾結(jié)的是自定義菜單和每天群發(fā)一條消息不可兼得,對 此,我不想過多評(píng)論。引言及內(nèi)容概要在微信5.0以前,口定義菜單是作為一種內(nèi)測資格使用的,只有少數(shù)公眾帳號(hào) 擁有菜單,因此出現(xiàn)很多企業(yè)為了弄到菜單不惜重金求購?,F(xiàn)如今,一大批帳號(hào)從訂 閱號(hào)轉(zhuǎn)為服務(wù)號(hào),很多都是奔著自定義菜單去的。而冃,經(jīng)測試發(fā)現(xiàn),微信最近的審 核放松很多,只要申請服務(wù)號(hào)、自定義菜單的基木都成功了,根木不管填寫的資料真 偽。不知道以后微信會(huì)不會(huì)翻臉,要求補(bǔ)全企業(yè)

3、資料,那將會(huì)是一種給小孩一顆糖吃 再把他打哭的感覺。自定義菜單是中請到了,到底該怎么創(chuàng)建、怎么使用呢?最近幾天不管是微信 官方交流群,還是在我博客留言里,都能夠看到不少開發(fā)者都在為這個(gè)發(fā)愁。木篇文 章就為大家解決這個(gè)難題。門定義菜單的創(chuàng)建步驟1. 找到appld和appsecret??诙x菜單中請成功后,在高級(jí)功能-開發(fā)模 式-接口配直信息的最后兩項(xiàng)就是;2. 根據(jù)apptd和appsecret,以https get方式獲取訪問特殊接口所必須的憑 證 access_token;3. 根據(jù)access token,將json格式的菜單數(shù)據(jù)通過https post方式提交。 分析創(chuàng)建菜單的難點(diǎn)原來

4、創(chuàng)建菜單這么簡單,三步就能搞定?跟把人象放冰箱差不多。呵呵,當(dāng)然 沒有這么簡單,那我們一步步來看,到底難在哪里?首先,第1步肯定都沒有問題,只要成功中請了自定義菜單,一定能拿到appld 和appsecret這兩個(gè)值。再來看第2步,由于是get方式獲取access_token,很多人直接把拼好的url 放在瀏覽器里執(zhí)行,access_token就拿到了。拋開是不是用編程方式實(shí)現(xiàn)的來說, 這真是個(gè)好辦法,顯然大家在第二步上也沒有問題。最后再看第3步,拼裝json格式的菜單數(shù)據(jù),雖然繁鎖一點(diǎn),但基本上也都沒 有什么問題的,因?yàn)楣俜浇o了個(gè)例子,照貓畫虎就行了。那問題一定就出現(xiàn)在https post捉

5、交上了。結(jié)論:不知道如何創(chuàng)建自定義菜單的朋友,大都可以歸為以下三種悄況:1. 根本不看或者沒看懂公眾平臺(tái)api文檔中關(guān)于通丿ij接口、定義菜單接 丨1和使用限制部分的說明;2. 不知道如何發(fā)起https請求(平時(shí)的http請求,直接使用httpurlconnection就町以輕松搞定,但https請求要復(fù)雜一點(diǎn));3. 不知道如何通過post方式提交json格式的菜單數(shù)據(jù)。正在看文章的你,不知道是加于哪一種,或者幾種情況都有,不妨留言說出來, 也口j以做個(gè)調(diào)查。不管屬于哪一種情況,既然看到了這篇文章,相信一定會(huì)讓你弄明 口的。解讀通川接u文檔-一憑證的獲取我們先來看通用接口文檔的簡介部分,如下

6、圖所示。通用接口文檔簡介通用接口是使用http請求,讓開發(fā)者直接與微信月艮務(wù)器交互,實(shí)現(xiàn)媒體文件上傳、媒體文件獲取等 視頻等媒體文件的目的。調(diào)用接口所需要的access_token必須通過獲取憑證接口獲取。通俗點(diǎn)講,這段簡介可以這么理解:公眾平臺(tái)還有很多特殊的接口,像口定義菜單的創(chuàng)建、語音文件的獲取、主動(dòng)發(fā)送消息等,如果開發(fā)者想通過http請求訪問這些特殊接口,就必須要有訪問憑證,也就是access_tokeno那么,乂該如何獲取接口訪問憑證access_token呢?讓我們繼續(xù)往下看。http請求方式:get &appid 二 appid&se<2t 二 appsecr

7、et參數(shù)說明是否逐說明grant_type是獲取 dccess_tokeri 填寫 die nt_cedentialappid是第三方用戶唯一憑證secret第三方用戶唯一憑證言鑰,既appsecet返回說明正確的json返回結(jié)果:access_token:access_token-r"expires_in-:7200圖中已經(jīng)表達(dá)的很清楚了,獲取access_token是通過get方式訪問如下鏈接: nt_type=client_credential&appid=appid&s ecret=appsecret鏈接中有三個(gè)參數(shù),分別是grant_type> app

8、id和secret。根據(jù)圖中的參數(shù)說 明,grant_type傳固定值client_credential,而appid和secret就是申請完自定 義菜單后微信分配給我們的。請求發(fā)送成功后,微信服務(wù)器會(huì)返冋一個(gè)json串,包含access token和 expires_in兩個(gè)元素。其中,access_token就是我們最終需要的憑證,而expires_in 是憑證的有效期,單位是秒,7200秒也就是2個(gè)小時(shí)。這就意味著,不是毎次訪問 特殊接口,都需要重新獲取一次access_token,只要access_token還在有效期內(nèi), 就一直可以使用。解讀自定義菜單接口文檔還是-樣,先來看看自定義

9、菜單接口的簡介部分,如下圖所示。簡介開發(fā)者獲取使用憑證(如何獲取憑證)后,可以使用該憑證對公眾賬的自走義菜單進(jìn)行創(chuàng)建、蔚s 接口可實(shí)現(xiàn)以下類型按鈕:click (點(diǎn)擊事件):用戶點(diǎn)擊click類型按鈕后,微信服務(wù)器會(huì)通過消息接口(“ent類型)推送點(diǎn)擊事1牛給開發(fā)者,并且帝上按鈕中開發(fā)雯進(jìn)行消息回復(fù)。創(chuàng)建目走義菜單后,由于微信客戶端緩存,需要24小時(shí)微信喜戶端才會(huì)展現(xiàn)出來。建議測試時(shí)可以住 次關(guān)注,則可以看到創(chuàng)建后的效果。從圖屮我們能夠獲取到以下信息:1. 拿到憑證access_token后,我們能對菜單執(zhí)行三種操作:創(chuàng)建、查詢和刪 除;2. 自定義菜單目前只支持click 一種事件,即用戶點(diǎn)

10、擊示回復(fù)某種類型的消 息;不能夠?qū)崿F(xiàn)點(diǎn)擊菜單項(xiàng)直接打開頁面(type二view未開放,11前只是微 生活冇);3. 由于微信客戶端緩存的原因,菜單創(chuàng)建后并不會(huì)立即在微信上顯示出來, 需要過24小時(shí)。在測試菜單創(chuàng)建時(shí),可以通過取消關(guān)注后,再關(guān)注的方式 達(dá)到立即看菜單的口的。繼續(xù)往下看,就是關(guān)于菜單怎么創(chuàng)建的介紹了,如下圖所示。菜單創(chuàng)建接口說明通過post個(gè)特走結(jié)構(gòu)體,實(shí)現(xiàn)在微信喜戶端創(chuàng)建自走義菜單。請求說明http請求方式:post其實(shí)就是向地址https:/api. weixin. qq. com/cgi-bin/merm/create?access token二access token 以

11、post方式捉交一個(gè)json格式的菜單字符串。后面,關(guān)于參數(shù)說明的部分我就不一一貼圖說明了,把重點(diǎn)說一下:1. 自定義菜單是一個(gè)3x5結(jié)構(gòu)的,即菜單最多只能有二級(jí),一級(jí)菜單最多只能冇3個(gè),每個(gè)一級(jí)菜單下最多可以有5個(gè)二級(jí)菜單項(xiàng);2. 菜單項(xiàng)都有一個(gè)key值。當(dāng)用戶點(diǎn)擊某個(gè)菜單項(xiàng)時(shí),微信會(huì)將該菜單項(xiàng)的 key值以事件推送的方式發(fā)送給我們的后臺(tái)處理程序。關(guān)于菜單的查詢、創(chuàng)建我就不提了,這兩個(gè)接口使用的頻率非常小,一般都用 不上。如果需要,再按照我上面提供的思路也不難理解。解讀apt文檔z使川限制默認(rèn)每個(gè)公眾帳號(hào)都不能超過下面的頻率限制。當(dāng)超出調(diào)用接口頻率限制,調(diào)用對應(yīng)接口將會(huì)收到$'err

12、codeasooq/errmsg'/api freq out of limit*接口凋用頻率限制接口名稱頻率限制獲聯(lián)越口200 (河天)目報(bào)菜單創(chuàng)建接口100(次/天)自走義菜單直詢接口1000 (次/天)自瑟菜單刪除接口100(次/天)很多小伙伴看到這張圖就開始疑惑了:怎么菜單還限制使川次數(shù),川戶量越來 越大的時(shí)候,根木不夠用啊??礈[楚,這個(gè)限制是針對接口調(diào)用的,也就是針對開發(fā) 者的,和用戶數(shù)、使用次數(shù)半點(diǎn)關(guān)系也沒有。就先拿獲収憑證接口來說吧,限制一天只能調(diào)用200次。還記得詢而提到過 access_token是冇冇效期的,并冇效期為兩小時(shí),也就是獲取一次access_token 后

13、的兩小時(shí)內(nèi),都可以繼續(xù)使用,那么理想情況一天24小時(shí)內(nèi),是不是只需要獲取 12次就夠了?難道200次還不夠用?再來看下菜單創(chuàng)建接口限制一天只能調(diào)用100次。我就這么解釋吧,菜單創(chuàng)建 一次后,只要你不切換模式(指的是在編輯模式和開發(fā)模式間切換)、不調(diào)川刪除接 口,這個(gè)菜單會(huì)永遠(yuǎn)存在的。誰沒事干,一天要?jiǎng)?chuàng)建100次菜單,就算是測試,測個(gè) 10次8次足夠了吧?菜單的查詢和刪除接口的限制我就不解釋了,至今為止這二個(gè)接口我都沒使用 過一次。就算有這樣的使用需求,一天這么多次的調(diào)用,完全足夠了。封裝通用的請求方法讀到這里,就默認(rèn)大家已經(jīng)掌握了上面講到的所有關(guān)于自定義菜單的理論知識(shí), 下而就進(jìn)入代碼實(shí)戰(zhàn)講解

14、的部分。先前我們了解到,創(chuàng)建菜單需要調(diào)川二個(gè)接口,并冃都是https請求,而非httpo 如果要封裝一個(gè)通用的請求方法,該方法至少需要具備以下能力:1. 支持https請求;2. 支持get、post兩種方式;3. 支持參數(shù)提交,也支持無參數(shù)的情況;對于https請求,我們需要一個(gè)證書信任管理器,這個(gè)管理辭類需要a己定義, 但需要實(shí)現(xiàn)x509trustmanager接口,代碼如下:package orgiufeng.weixin.util;import java.security.cert.certificateexception;import java.security.cert.x509c

15、ertificate;import .ssl.x509trustmanager;*證書信任管理器(用于https請求)* author liufeng* date 2013-0&08*/public class myx509trustmanager implements x509trustmanager public void checkaienttrusted(x509certificate chain, string authtype) throws certificateexception public void checkservertrusted(x509certificat

16、e chain, string authtype) throws certificateexception public x509certificate get accepted i ssuers() return null;這個(gè)證書管理器的作用就是讓它信任我們指定的證書,上而的代碼意味著信任 所有證書,不管是否權(quán)威機(jī)構(gòu)頒發(fā)。證書有了,通用的https請求方法就不難實(shí)現(xiàn)了,實(shí)現(xiàn)代碼如下:package orgiufeng.weixin.util;import java.io.buffered reader;import java.ion put stream;import java.ioput

17、streamreader;import java.io.outputstream;import java. net. co nn ect except io n;import .url;import .ssl.httpsurlconnection;import .ssl.sslcontext;import .ssl.sslsocketfactory;import .ssl.trustmanager;import net.st.json.jsonobject;import org.slf4j.logger;import org.slf4j.loggerfactory;/*公眾平臺(tái)通用接口工具類*

18、 author liuyq* date 2013-08-09 public class weixinlltil private static logger log = loggerfactory.getlogger(weixinutil.class);*發(fā)起https請求并獲取結(jié)果* param request url 請求地址* param request met hod 請求方式(get、post)* param outputstr 提交的數(shù)據(jù)* return jsonobject(通過 jsonobject.get(key)的方式獲取 json 對彖的屬性 值)*/public stat

19、ic jsonobject httprequest(string request url, string request method, string outputstr) jsonobject jsonobject = null;stringbuffer buffer = new stringbuffer();try/創(chuàng)建sslcontext對象,并使用我們指定的信任管理器初始 化trustmanager tm = new myx509trustmanager() ;sslcontext ssicontext = sslcontext.getlnstance(,ssl,” sunjssb);

20、ssicontext.init(null, tm, newjava, security.securerandom();/從上述sslcontext對象中得到sslsocketfactory對象sslsocket factory ssf = ssl context.get socket factory();url url = new url(requesturl);httpslirlconnection httpurlconn = (httpsurlconnection) url.ope nconnection();httpurlco nn.setsslsocketfactory(ssf);ht

21、tpurlco nn.setdooutput(true);httpurlco nn.setdoln put(true);httpurlco nn .setusecaches(false);/設(shè)置請求方式(get/post)httpllrlconn.setrequestmethod(request method);if (hgetn.equalslgnorecase(requestmethod) httpurlco nn.conn ect();/當(dāng)有數(shù)據(jù)需要提交時(shí)if (null != outputstr) output stream output stream = httpurlconn.ge

22、toutputstream();/注意編碼格式,防止中文亂碼output stream.write(output str.getbytes("utf-8");output stream.close();/將返回的輸入流轉(zhuǎn)換成字符串input stream inputstream = httpurlco nngetlnputstream();input st ream reader in put st ream reader = newinputstreamreader(inputstream, ,utf-8h);buffered reader buffered reader

23、 = newbufferedreader(i nputstream reader);string str = null;while (str = buffered reader. readli ne() != null) buffer.appe nd(str);buffered reader.close();inputstream reader.close();/釋放資源inputstream.close();inputstream = n ull;httpurlco nn .disconnect();jsonobject = jsonobject.fromobject(buffer.tost

24、ringo); catch (connectexception ce) log.error(hweixin server connection timed out.”); catch (exception e) log.error(mhttps request error:m, e);return jsonobject;代碼說明:1. 4廣50行:解決https請求的問題,很多人問題就出在這里;2. 5559行:兼容get、post兩種方式;3. 6p67行:兼容有數(shù)據(jù)捉交、無數(shù)據(jù)提交兩種情況,也冇相當(dāng)一部分人不知 道如何post捉交數(shù)據(jù);po jo類的封裝在獲取憑證創(chuàng)建菜單詢,我們還需要封裝

25、些pojo,這會(huì)讓我們的代碼更美觀, 有條理。首先是調(diào)用獲取憑證接口后,微信服務(wù)器會(huì)返凹json格式的數(shù)據(jù): "accesstoken": "access token", "expires_in": 7200,我們將其封裝為一個(gè) accesstoken對象,對象有二個(gè)屬性:token和expiresln,代碼如下:package orgiufeng.weixin.pojo;*微信通用接口憑證* author liufeng* date 2013-08-08*/public class accesstoken /獲取到的憑證/憑證有效時(shí)

26、間,單位:秒private int expiresln;public string gettoken() return token;public void settoken(string token) this.toke n = token; public int getexpiresi n() return expiresl n;public void setexpiresln(int expiresl n) this.expiresln = expiresl n;接卜來是對菜單結(jié)構(gòu)的封裝。因?yàn)槲覀兪遣捎枚驅(qū)﹀璧木幊谭绞?,最終提交 的json格式菜單數(shù)據(jù)就應(yīng)該是由對象宜接轉(zhuǎn)換得到,而不是在

27、程序代碼屮拼一人堆 json數(shù)據(jù)。菜單結(jié)構(gòu)封裝的依據(jù)是公眾平臺(tái)api文檔中給出的那一段json格式的菜 單結(jié)構(gòu),如下所示:"buttonn:” type”click”,” name”:”今日歌曲”,” key":” v1001 _todacmusi c',“type”: “click",“name”:”歌手簡介”,”key”:”v1001_today_si nger",“name”:” 菜單”,ksub_buttonm:”type”:”click“,,tnamelt:llhello word",”key“:“w 001_hello_wo

28、rldh,”type”:”click",” name”:”贊一下我們”,” key" :“v1001 _good”首先是菜單項(xiàng)的基類,所有一級(jí)菜單、二級(jí)菜單都共有一個(gè)相同的屬性,那就 是nameo菜單項(xiàng)基類的封裝代碼如下:package orgiufeng.weixin.pojo;/author liufeng* date 2013-08-08*/public class button *按鈕的基類public string getname() return name;public void setname(string name) = n ame;接著

29、是了菜單項(xiàng)的封裝。這里對了菜單是這樣定義的:沒冇了菜單的菜單項(xiàng), 有可能是二級(jí)菜單項(xiàng),也有可能是不含二級(jí)菜單的一級(jí)菜單。這類子菜單項(xiàng)一定會(huì)包 含三個(gè)屬性:type、name和key,封裝的代碼如下:package orgiufeng.weixin.pojo;/*普通按鈕(子按鈕)* author liufeng* date 2013-08-08*/public class commonbutton extends button private string type;private string key;public string gettype() return type;public vo

30、id settype(string type) this.type = type;return key;public void setkey(string key) this.key = key;再往下是父菜單項(xiàng)的封裝。對父菜單項(xiàng)的定義:包含有二級(jí)菜單項(xiàng)的一級(jí)菜單。 這類菜單項(xiàng)包含有二個(gè)屬性:name和sub_button,而sub_button以是一個(gè)子菜單項(xiàng) 數(shù)組。父菜單項(xiàng)的封裝代碼如下:package orgiufeng.weixin.pojo;*復(fù)雜按鈕(父按鈕)* author liufeng* date 2013-08-08*/public class complexbutton

31、extends button private button sub_button;public button getsub_button() return sub_button;public void setsub_button(button sub_button) this.sub button = sub button;最后是整個(gè)菜單對彖的封裝,菜單對彖包含多個(gè)菜單項(xiàng)(最多只能有3個(gè)),這些菜單項(xiàng)即可以是子菜單項(xiàng)(不含二級(jí)菜單的一級(jí)菜單),也可以是父菜單項(xiàng)(包含二級(jí)菜單的菜單項(xiàng)),如果能明白上面所講的,再來看封裝后的代碼就很容易理解 t:package orgiufeng.weixin.p

32、ojo;/*菜單* author liufeng* date 2013-08-08*/public class menu private button button;public button getbutton() return button;public void set butt on (button butto n) this.butto n = button;關(guān)于pojo類的封裝就介紹完了。憑證access token的獲取方法繼續(xù)在先前通用請求方法的類weixinut訂.java中加入以下代碼,用于獲取接 口訪問憑證:/獲取access_token的接口地址(get)限200 (次

33、/天)public final static string access_token_url =" client_credential&appid= appi d& secret = appsecret'獲収 access token* param appid 憑證* param appsecret 密鑰* retur n*/public static accesstoken getaccesstoken(string appid, string appsecret) accesstoken accesstoken 二 null;string requestu

34、rl = access _token url.replace("appi d", appid).replace("appsecret", appsecret);jsonobject jsonobject = httprequest(requesturl, "get', null);/如果請求成功if (null != jsonobject) tryaccesstoken = new accesstoken();accesstoken.settokenosonobject.getstringc'accessjoken")

35、;accesstoke n.setexpiresi n(json object.getl nt( "expiresj n”); catch (jsonexception e) accesstoke n = null;/獲取token失敗log.error(h獲取token 失敗 errcode: errmsg:",jsonobject.getlntc'errcode"), jsonobject.getstring(”errmsg”);return accesstoken;自定義菜單的創(chuàng)建方法繼續(xù)在先前通用請求方法的類weixinutil. java小加入以

36、下代碼,用于創(chuàng)建占 定義菜單: /菜單創(chuàng)建(post)限100 (次/天) public static string menu_create_url =h nu/create?access_token= acces5_token”;*創(chuàng)建菜單* param menu菜單實(shí)例* param accesstoken 有效的 access_token* return 0表示成功,其他值表示失敗*/public static int createmenu(menu menu, string accesstoken) int result = 0;/拼裝創(chuàng)建菜單的urlstring url = merw

37、_createjjrl.replace("access_token", accesstoken);/將菜單對象轉(zhuǎn)換成json字符串string jsonmenu = jsonobject.fromobject(menu).tostring();/調(diào)用接口創(chuàng)建菜單jsonobject jsonobject = httprequest(url, "post", jsonmenu);if (null != jsonobject) if (0 != jsonobject.get i nt ("errcode") result = json o

38、bj ect. get i nt( "errcode");log.error(m創(chuàng)建菜單失敗 errcode: errmsg:h, json object.get i nt(herrcodeu), jso nobject.getstri ngcerrmsgj);return result;調(diào)用封裝的方法創(chuàng)建h泄義菜單package orgiufeng.weixin.main;import orgiufeng.weixin.pojo.accesstoken;import orgiufeng.weixin.pojo.button;import org.liufeng.weixi

39、n.pojo.commonbutton;import org.liufeng.weixin.pojo.complexbutton;import org.liufeng.weixin.pojo.menu;import org.liufeng.w&xin.utilweixinutil;import org.slf4j.logger;import org.slf4j.loggerfactory;*菜單管理器類* author liufeng* date 2013-08-08*/public class menumanager private static logger log = logge

40、rfactory.getlogger(menumanager.class);public static void main(string args) /第三方用戶唯一憑證string appld = ”000000000000000000”;/第三方用戶唯一憑證密鑰string appsecret = ”00000000000000000000000000000000"/調(diào)用接口獲収access_tokenaccesstoken at = weixinlltil.getaccesstoken(appld, appsecret);if (null != at) /調(diào)用接口創(chuàng)建菜單int

41、 result = weixinutil.createmenu(getmenu(),at.gettoken();/判斷菜單創(chuàng)建結(jié)果if (0 = result)c*菜單創(chuàng)建成功! ”);("菜單創(chuàng)建失敗,錯(cuò)誤碼:” + result);*組裝菜單數(shù)據(jù)returnprivate static menu getmenu() common button btn11 = new commonbutton(); btn11 .setname("天氣預(yù)報(bào)”); btn11.settype("click");btn11.setk

42、ey(w11n);commonbutton btn12 = new commonbutton(); btn12.setname(h 交查詢”); btn12.settype(”click");btn12.setkey(n12h);commonbutton btn13 = new commonbutton(); btn13.setname("周邊搜索”); btn13.settype("click");btn13.setkey(m13n);commonbutton btn14 = new commonbutton(); btn14.setname(h歷史上

43、的今天”);bt n 14.settype("click");btn14.setkey(m14m);common button btn21 = new common button(); btn21.set name(h 歌曲點(diǎn)播”);btn21 .settype("click");btn21.setkey(m21w);common button btn22 = new commonbutton(); btn22.setname(“經(jīng)典游戲”);btn22.settype(” click");btn22.setkey(”22“);commonbu

44、tton btn23 = new commonbutton(); btn23.setname(“ 美女電臺(tái)”); btn23.settype(” click");btn23.setkey(”23“);common button btn24 = new common button(); btn24.setname(h 人臉識(shí)別");bt n24. setty pe( "cl ick");btn24.setkey(”24”);common button btn25 = new common button(); bt n25. set nam e("

45、聊天嘮嗑”); btn25.settype("click");btn25.setkey(”25“);common button btn31 = new common button();btn31 .setname("q 友圈”);btn31 settype(mclickh);btn31.setkey(n31n);commonbutton btn32 = new commonbutton(); btn32.setname("電影排行榜”); btn32.settype("click");btn32.setkey(n32n);common

46、button btn33 = new commonbutton(); btn33.setname("幽默笑話");btn33.settype("click");btn33.setkey(”33“);complexbutton mainbtn1 = new complexbutton(); mainbtrd .setname(n 生活助手”);mainbtn1.setsub button(new commonbutton btn11, btn12, btn13, btn14);complexbutton mainbtn2 = new complexbutt

47、on();main btn2.setname(h 休閑驛站”);mainbtn2.setsub button(new commonbutton btn21, btn22,btn23, btn243 btn25);complexbutton mainbtn3 = new complexbutton();main btn3.setname("更多體驗(yàn)“);mainbtn3.setsub button(new commonbutton btn31, btn32,btn33);*這是公眾號(hào)xiaoqrobot m w的菜單結(jié)構(gòu),每個(gè)一級(jí)菜單都有二級(jí)菜在某個(gè)一級(jí)菜單下沒有二級(jí)菜單的情況,men

48、u該如何處義呢?<br>*比如,第三個(gè)一級(jí)菜單項(xiàng)不是”更多體驗(yàn)”,而直接是"幽默笑話s那 么 menu 應(yīng)該這樣定義:<br>* menu.setbutton(new button mainbtnl, mainbtn2, btn33 );*/menu menu = new menu();menu.setbutton(new button mainbtn1, mainbtn2, mainbtn3 );return menu;注意:在運(yùn)行以上代碼時(shí),需要將apptd和appsecret換成你白己公眾號(hào)的。 整個(gè)工程的結(jié)構(gòu) q weixinmpmenu &

49、src田 orgjiufeng.weixin.main>10田 org.liufeng.weixin.pojot> t| accesstoken.javat> 7j buttonjavat> t| commonbutt on .java> 1 complexbutton.java t> t| menu.java 出 orgjiufeng.weixin.utilt> j myx509trustmanager.java t> tj weixinutil.java回 iperties> jre system library jre

50、l.6.0_06 頁 ref ere need librariesl> (j commons-beanutils1.7.0jar t> commons-collections.jrl> m commons-la門92.3日t> commons-logging-1.0.4.jarl> u ezmorph-1.0.6.jarl> q jsonlib2.2.3-jdkl3.jar> n iog4j-1.2.15.jart> morph.ljart> slf4j-api-1.5.10.jart> 0 slf4j-log4j12-1.5.lo.

51、jar& lib為了保證文章的完整獨(dú)立性和可讀性,我是新建了一個(gè)java project (java web 工程也可以,沒冇太大關(guān)系),沒冇在前兒篇文章所講到的weixincoursel程中添 加代碼。如果需要,讀者可以自己實(shí)現(xiàn)將菜單創(chuàng)建的代碼移到自己已有的工程中去。圖中所有人眩文件的源代碼都在文章中貼出并進(jìn)行了說明,圖中使用到的jar 也是java開發(fā)中通用的jar包,很容易在網(wǎng)上下載到。工程中引入的jar包主要分為兩類:1. 第一類是json開發(fā)工具包,用于java對象和json 7符串之間的轉(zhuǎn)換;json 開發(fā)工具包一共有3個(gè)jar: ezmorph-1. 0. 6. jar,

52、json-1ib2. 2. 3jdkl3. jar 和 morph-1. 1.1. jar©2. 第二類是slf4j日志工具包,用于記錄系統(tǒng)運(yùn)行所產(chǎn)牛的h志,h志可以輸出到控制臺(tái)或文件中。整個(gè)工程中,唯一沒有講到的是src下的log4j. properties的配置,也把它貼 出來,方便大家參考,這樣才是一個(gè)完整的匚程源碼。log4j. properties文件的內(nèi) 容如下:log4j.rootlogger= info,console,fileiog4j appender.console=org apacheo g4j.consoleappe nderiog4j .appe nder

53、.c on soleayout=org. apacheo g4j. patter nlayoutiog4j.appender.console.layout.conversionpattern=%-5p %m%niog4j.appe nder.f ile= org. apache. iog4j .daily rolli ngfileappe nderiog4j .appender.f ile. datepattern= tjyyyy-mm-ddiog4j .appe nder.filefile= /logs/weixi nmpme nuogiog4j .appe nder.f ile. appe

54、 nd= trueiog4j.appender.fileayout= org. apache. iog4j .patternlayoutlog4j.appender.file.layout.conversionpattern=%-5p %d %37c %3x %m%n如何響應(yīng)菜單點(diǎn)擊事件白定義菜單的創(chuàng)建工作己經(jīng)完成,那么該如何接收和響應(yīng)菜單的點(diǎn)擊事件呢, 也就是說在公眾帳號(hào)后臺(tái)處理程序中,如何識(shí)別用戶點(diǎn)擊的是哪個(gè)菜單,以及做出響 應(yīng)。這部分內(nèi)容其實(shí)在教程的笫5篇各種消息的接收9響應(yīng)中已經(jīng)講解清楚了。來看一下第一篇教程weixincourse項(xiàng)li中的coreservice類要怎么改寫,才能 接

55、收響應(yīng)菜單點(diǎn)擊事件,該類修改后的完整代碼如下:package org.liufeng.course.service;import java.util.date;import java.util.map;import javax.servlet.http.httpservletrequest;import org.liufeng.course.message.resp.textmessage;import orgiufeng.course.util.messagelltil;*核心服務(wù)類* author liufeng* date 2013-05-20*/public class coreservice /*處理微信發(fā)來的請求* param request* return*/public static string processrequest(httpservletrequest request) strin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論