国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久中文视频 | 在线观看黄色 | 亚洲精品三级 | 精品视频国产 | 日本精品一区二区三区视频 | 一区二区三区在线 | 亚洲在线电影 | 91在线影视| 久久se精品一区精品二区 | 欧美午夜精品一区二区三区电影 | 免费视频成人国产精品网站 | 最新中文字幕在线 | 亚洲一区二区在线播放 | 欧美a级片在线观看 | 精产国产伦理一二三区 | 夜夜春精品视频高清69式 | 福利网址 | 狠狠色狠色综合曰曰 | 日韩视频中文字幕 | 成人看片在线 | 国产精品精品视频一区二区三区 | 久久国产精品一区二区三区 | 日日精品 | 国产精品亚洲一区二区三区 | 亚洲欧美中文字幕 | 久久亚洲一区二区 | 成人爽a毛片一区二区免费 久久久久亚洲精品 | 国产欧美日韩综合精品一区二区 | 色精品 | 成人精品一区二区三区中文字幕 | 日韩欧美一区二区在线观看视频 | 久久久人成影片一区二区三区 | 日本一区二区三区精品视频在线观看 | 日韩电影免费在线观看中文字幕 | 精品亚洲综合 | 日本精品在线观看 | 啊v视频 | 在线播放中文字幕 | 久久精品亚洲精品 | 亚洲欧美日韩国产综合 | 成人a视频在线观看 |