一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java微信公眾平臺之自定義菜單

Java微信公眾平臺之自定義菜單

2021-04-27 11:25Phil_Jing Java教程

這篇文章主要為大家詳細介紹了Java微信公眾平臺之自定義菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、自定義菜單的說明和按鈕類型

1、菜單說明

1)自定義菜單最多包括3個一級菜單,每個一級菜單最多包含5個二級菜單。

2)一級菜單最多4個漢字,二級菜單最多7個漢字,多出來的部分將會以“...”代替。
3)創建自定義菜單后,菜單的刷新策略是,在用戶進入公眾號會話頁或公眾號profile頁時,如果發現上一次拉取菜單的請求在5分鐘以前,就會拉取一下菜單,如果菜單有更新,就會刷新客戶端的菜單。測試時可以嘗試取消關注公眾賬號后再次關注,則可以看到創建后的效果。

2、自定義菜單接口可實現多種類型按鈕

1)click:點擊推事件用戶點擊click類型按鈕后,微信服務器會通過消息接口推送消息類型為event的結構給開發者(參考消息接口指南),并且帶上按鈕中開發者填寫的key值,開發者可以通過自定義的key值與用戶進行交互;
2)view:跳轉url用戶點擊view類型按鈕后,微信客戶端將會打開開發者在按鈕中填寫的網頁url,可與網頁授權獲取用戶基本信息接口結合,獲得用戶基本信息。
3)scancode_push:掃碼推事件用戶點擊按鈕后,微信客戶端將調起掃一掃工具,完成掃碼操作后顯示掃描結果(如果是url,將進入url),且會將掃碼的結果傳給開發者,開發者可以下發消息。
4)scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框用戶點擊按鈕后,微信客戶端將調起掃一掃工具,完成掃碼操作后,將掃碼的結果傳給開發者,同時收起掃一掃工具,然后彈出“消息接收中”提示框,隨后可能會收到開發者下發的消息。
5)pic_sysphoto:彈出系統拍照發圖用戶點擊按鈕后,微信客戶端將調起系統相機,完成拍照操作后,會將拍攝的相片發送給開發者,并推送事件給開發者,同時收起系統相機,隨后可能會收到開發者下發的消息。
6)pic_photo_or_album:彈出拍照或者相冊發圖用戶點擊按鈕后,微信客戶端將彈出選擇器供用戶選擇“拍照”或者“從手機相冊選擇”。用戶選擇后即走其他兩種流程。
7)pic_weixin:彈出微信相冊發圖器用戶點擊按鈕后,微信客戶端將調起微信相冊,完成選擇操作后,將選擇的相片發送給開發者的服務器,并推送事件給開發者,同時收起相冊,隨后可能會收到開發者下發的消息。
8)location_select:彈出地理位置選擇器用戶點擊按鈕后,微信客戶端將調起地理位置選擇工具,完成選擇操作后,將選擇的地理位置發送給開發者的服務器,同時收起位置選擇工具,隨后可能會收到開發者下發的消息。
9)media_id:下發消息(除文本消息)用戶點擊media_id類型按鈕后,微信服務器會將開發者填寫的永久素材id對應的素材下發給用戶,永久素材類型可以是圖片、音頻、視頻、圖文消息。請注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
10)view_limited:跳轉圖文消息url用戶點擊view_limited類型按鈕后,微信客戶端將打開開發者在按鈕中填寫的永久素材id對應的圖文消息url,永久素材類型只支持圖文消息。請注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。

說明:3到8的所有事件,僅支持微信iphone5.4.1以上版本,和android5.4以上版本的微信用戶,舊版本微信用戶點擊后將沒有回應,開發者也不能正常接收到事件推送。9和10,是專門給第三方平臺旗下未微信認證(具體而言,是資質認證未通過)的訂閱號準備的事件類型,它們是沒有事件推送的,能力相對受限,其他類型的公眾號不必使用。

二、菜單的創建/查詢/刪除

官方的click和view事件demo

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
 "button":[
 
   "type":"click",
   "name":"今日歌曲",
   "key":"v1001_today_music"
  },
  {
   "name":"菜單",
   "sub_button":[
   {
    "type":"view",
    "name":"搜索",
    "url":"http://www.soso.com/"
   },
   {
    "type":"miniprogram",
    "name":"wxa",
    "url":"http://mp.weixin.qq.com",
    "appid":"wx286b93c14bbf93aa",
    "pagepath":"pages/lunar/index"
   },
   {
    "type":"click",
    "name":"贊一下我們",
    "key":"v1001_good"
   }]
  }]
}

其他類型(包括9、10)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{
 "button": [
  {
   "name": "掃碼",
   "sub_button": [
    {
     "type": "scancode_waitmsg",
     "name": "掃碼帶提示",
     "key": "rselfmenu_0_0",
     "sub_button": [ ]
    },
    {
     "type": "scancode_push",
     "name": "掃碼推事件",
     "key": "rselfmenu_0_1",
     "sub_button": [ ]
    }
   ]
  },
  {
   "name": "發圖",
   "sub_button": [
    {
     "type": "pic_sysphoto",
     "name": "系統拍照發圖",
     "key": "rselfmenu_1_0",
     "sub_button": [ ]
     },
    {
     "type": "pic_photo_or_album",
     "name": "拍照或者相冊發圖",
     "key": "rselfmenu_1_1",
     "sub_button": [ ]
    },
    {
     "type": "pic_weixin",
     "name": "微信相冊發圖",
     "key": "rselfmenu_1_2",
     "sub_button": [ ]
    }
   ]
  },
  {
   "name": "發送位置",
   "type": "location_select",
   "key": "rselfmenu_2_0"
  },
  {
   "type": "media_id",
   "name": "圖片",
   "media_id": "media_id1"
  },
  {
   "type": "view_limited",
   "name": "圖文消息",
   "media_id": "media_id2"
  }
 ]
}

1、根據實例開始封裝實體類

菜單按鈕基類basicbutton.java

?
1
2
3
4
5
6
7
8
9
10
11
12
public class basicbutton {
  
 private string name;
 
 public string getname() {
  return name;
 }
 
 public void setname(string name) {
  this.name = name;
 }
}

菜單menu.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class menu {
  
 public final static string click = "click"; // click菜單
 public final static string view = "view"; // url菜單
 public final static string scancode_waitmsg = "scancode_waitmsg"; // 掃碼帶提示
 public final static string scancode_push = "scancode_push"; // 掃碼推事件
 public final static string pic_sysphoto = "pic_sysphoto"; // 系統拍照發圖
 public final static string pic_photo_or_album = "pic_photo_or_album"; // 拍照或者相冊發圖
 public final static string pic_weixin = "pic_weixin"; // 微信相冊發圖
 public final static string location_select = "location_select"; // 發送位置
 
 private basicbutton[] button;
 
 public basicbutton[] getbutton() {
  return button;
 }
 
 public void setbutton(basicbutton[] button) {
  this.button = button;
 }
}

view類型按鈕類viewbutton.java,其他的類型可以照此一一封裝

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class viewbutton extends basicbutton {
  
 private string type = menu.view;
 private string url;
  
 public string gettype() {
  return type;
 }
 public void settype(string type) {
  this.type = type;
 }
 public string geturl() {
  return url;
 }
 public void seturl(string url) {
  this.url = url;
 }
}

一級菜單包含二級菜單的封裝complexmenu.java

?
1
2
3
4
5
6
7
8
9
10
11
12
public class complexmenu extends basicbutton {
  
 private basicbutton[] sub_button;
 
 public basicbutton[] getsub_button() {
  return sub_button;
 }
 
 public void setsub_button(basicbutton[] sub_button) {
  this.sub_button = sub_button;
 }
}

2.封裝完畢,組裝菜單

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private static menu getmenu() {
  
 viewbutton btn11 = new viewbutton();
 btn11.setname("測試11");
 btn11.seturl("http://www.qq.com");
  
 clickbutton btn21 = new clickbutton();
 btn21.setname("測試21");
 btn21.setkey("21");
 
 clickbutton btn22 = new clickbutton();
 btn22.setname("測試22");
 btn22.setkey("22");
 
 //一級菜單(沒有二級菜單)
 complexmenu mainbtn1 = new complexmenu();
 mainbtn1.setname("測試1");
 mainbtn1.setsub_button(new basicbutton[] { btn11});
 
 //一級菜單(有二級菜單)
 complexmenu mainbtn2 = new complexmenu();
 mainbtn2.setname("測試2");
 mainbtn2.setsub_button(new basicbutton[] { btn21, btn22 });
  
 menu menu = new menu();
 menu.setbutton(new basicbutton[] { mainbtn1, mainbtn2 });
 return menu;
}

3.自定義菜單的創建

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 創建的菜單
 *
 * @param menu 菜單項
 * @param token 授權token
 * @return {"errcode":0,"errmsg":"ok"}
 */
public resultstate createmenu(menu menu, string token) {
 treemap<string, string> map = new treemap<string, string>();
 map.put("access_token", token);
 string jsondata = jsonutil.tojson(menu).tostring();
 string result = httprequtil.httpsdefaultexecute(httprequtil.post_method, wechatconfig.menu_create_url, map, jsondata);
 return jsonutil.fromjson(result, resultstate.class);
}

4、自定義菜單的查詢

返回的實例

對應創建接口,正確的json返回結果: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
 "menu": {
  "button": [
   {
    "type": "click",
    "name": "今日歌曲",
    "key": "v1001_today_music",
    "sub_button": [ ]
   },
   {
    "type": "click",
    "name": "歌手簡介",
    "key": "v1001_today_singer",
    "sub_button": [ ]
   },
   {
    "name": "菜單",
    "sub_button": [
     {
      "type": "view",
      "name": "搜索",
      "url": "http://www.soso.com/",
      "sub_button": [ ]
     },
     {
      "type": "view",
      "name": "視頻",
      "url": "http://v.qq.com/",
      "sub_button": [ ]
     },
     {
      "type": "click",
      "name": "贊一下我們",
      "key": "v1001_good",
      "sub_button": [ ]
     }
    ]
   }
  ]
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
/**
  * 獲取自定義菜單
  *
  * @param token
  * @return
  */
 public string getmenu(string token) {
  treemap<string, string> map = new treemap<string, string>();
  map.put("access_token", token);
  string result = httprequtil.httpsdefaultexecute(httprequtil.get_method, wechatconfig.menu_get_url, map, "");
  return result;
 }

菜單所有屬性menuattr.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 菜單所有屬性
 * @author phil
 *
 */
public class menuattr extends basicmenu {
  
 private string type;
 private string url;
 private string key;
 private string sub_button;
  
 get/set方法
}

返回的菜單類menureturn.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 返回的菜單類
 * @author phil
 *
 */
public class menureturn extends basicmenu{
  
 private menuattr[] sub_button;
 
 public menuattr[] getsub_button() {
  return sub_button;
 }
 
 public void setsub_button(menuattr[] subbutton) {
  sub_button = subbutton;
 }
}

將json格式的字符串轉換為menu對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 將json格式的字符串轉換為menu對象
 * @param json
 * @return
 */
public list<menureturn> convermenu(string json) {
 list<menureturn> list = new arraylist<menureturn>();
 if (json!= null && !"".equals(json)) {
  jsonobject object = jsonobject.parseobject(json);
  jsonarray array = object.getjsonobject("menu").getjsonarray("button");
  for (int i = 0; i < array.size(); i++) {
   menureturn mr= new menureturn();
   mr= array.getobject(i, menureturn.class);
   list.add(mr);
  }
 }
 return list;
}

注:此處用的fastjson

此處方法待改進,有更好的請指教一二

5、自定義菜單的刪除

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 刪除自定義菜單
 *
 * @param token
 * @return
 */
public boolean deletemenu(string token) {
 boolean falg = true;
 treemap<string, string> map = new treemap<string, string>();
 map.put("access_token", token);
 string result = httprequtil.httpsdefaultexecute(httprequtil.get_method, wechatconfig.menu_delte_url, map, "");
 resultstate state = jsonutil.fromjson(result, resultstate.class);
 if (state.geterrcode()!= 0|| state.geterrmsg() != "ok") {
  falg = false;
 }
 return falg;
}

三、自定義菜單事件推送

用戶點擊自定義菜單后,微信會把點擊事件推送給開發者,請注意,點擊菜單彈出子菜單,不會產生上報。請注意,第3個到第8個的所有事件,僅支持微信iphone5.4.1以上版本,和android5.4以上版本的微信用戶,舊版本微信用戶點擊后將沒有回應,開發者也不能正常接收到事件推送。

1、解析微信推送的xml數據包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
 * 解析微信發來的請求(xml)
 * xml示例
 * <xml>
 <tousername><![cdata[touser]]></tousername>
 <fromusername><![cdata[fromuser]]></fromusername>
 <createtime>123456789</createtime>
 <msgtype><![cdata[event]]></msgtype>
 <event><![cdata[click]]></event>
 <eventkey><![cdata[eventkey]]></eventkey>
 </xml>
 * @param request
 * @return
 * @throws exception
 */
public static map<string, string> parsexml(httpservletrequest request) throws exception {
 // 將解析結果存儲在hashmap中
 map<string, string> map = new hashmap<string, string>();
 // 從request中取得輸入流
 inputstream inputstream = request.getinputstream();
 // 讀取輸入流
 saxreader reader = new saxreader();
 document document = reader.read(inputstream);
 // 得到xml根元素
 element root = document.getrootelement();
 // 得到根元素的所有子節點
 list<element> elementlist = root.elements();
 
 // 遍歷所有子節點
 for (element e : elementlist)
  map.put(e.getname(), e.gettext());
 
 // 釋放資源
 inputstream.close();
 inputstream = null;
 return map;
}

2、利用map的get(key)獲取value

msgtype 消息類型,event
event          事件類型,click
eventkey 事件key值,與自定義菜單接口中key值對應

注:key是參數名

附:wechatconfig.java

?
1
2
3
4
5
6
// 創建菜單
public static final string menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create";
// 查詢自定義菜單
public static final string menu_get_url = "https://api.weixin.qq.com/cgi-bin/menu/get";
// 刪除自定義菜單
public static final string menu_delte_url = "https://api.weixin.qq.com/cgi-bin/menu/delete";

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/phil_jing/article/details/72935509

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本免费一区二区三区 | 欧美日本一本线在线观看 | 99视频精品免费99在线 | 四虎永久免费在线观看 | 国产卡一卡二卡四卡无卡 | 问一问免费咨询 | 韩国三级年轻小的胰子完整 | 日本热妇 | 亚洲va久久久久 | 免费老外的毛片清高 | 色婷婷婷丁香亚洲综合不卡 | 女主被男主做哭失禁高h | 精品国产国产精2020久久日 | 视频一区二区三区在线观看 | 日本狠狠操 | 牧教师在线观看 | 美女沟厕撒尿全过程高清图片 | 久久久黄色片 | 桥本有菜ssni-677在线观看 | 国产亚洲精品激情一区二区三区 | zoo性欧美| 国产精品视频免费一区二区三区 | 504神宫寺奈绪大战黑人 | 给我免费观看的视频在线播放 | 极品虎白女在线观看一线天 | 香蕉久久夜色精品国产尤物 | 欧美精品日韩一区二区三区 | 国产精品午夜剧场 | 亚洲xxxxxhd奶水女人 | 日本三级在丈面前被耍了 | 亚洲精品国精品久久99热 | 99re8在线精品视频免费播放 | 亚洲福利视频一区 | 奇米影视先锋 | lubuntu网页版在线 | tk白丝丨vk | 欧美vpswindows动物 | 亚洲国产网址 | 女教师三级做受 | 成人国产一区二区 | 亚洲成片在线看 |