微信測試號開發之五 自定義選單
注意:
1、自定義選單最多包括3個一級選單,每個一級選單最多包含5個二級選單。
2、一級選單最多4個漢字,二級選單最多7個漢字,多出來的部分將會以“...”代替。
3、測試時可以嘗試取消關注公眾賬號後再次關注,則可以看到建立後的效果。
按鈕型別:
1、click:點選推事件使用者點選click型別按鈕後,微信伺服器會通過訊息介面推送訊息型別為event的結構給開發者(參考訊息介面指南),並且帶上按鈕中開發者填寫的key值,開發者可以通過自定義的key值與使用者進行互動;
2、view:跳轉URL使用者點選view型別按鈕後,微信客戶端將會開啟開發者在按鈕中填寫的網頁URL,可與網頁授權獲取使用者基本資訊介面結合,獲得使用者基本資訊。
瞭解更多請檢視微信開發文件 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013
建立選單介面:
http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
click和view型別按鈕的請求資料格式如下:
{
"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"
}]
}]
}
進行開發:
(一):封裝按鈕物件
一:基類
public class Button {
private String name;//所有一級選單、二級選單都共有一個相同的屬性,那就是name
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二:子選單類
/** * 描述: 子選單項 :沒有子選單的選單項,有可能是二級選單項,也有可能是不含二級選單的一級選單。 */ public class CommonButton extends Button { private String type; private String key; private String url; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
三:父選單類
/**
* 描述: 父選單項 :包含有二級選單項的一級選單。這類選單項包含有二個屬性:name和sub_button,而sub_button以是一個子選單項陣列
*/
public class ComplexButton 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;
}
}
四:選單物件的封裝類
/**
* 描述: 整個選單物件的封裝
*/
public class Menu {
private Button[] button;
public Button[] getButton() {
return button;
}
public void setButton(Button[] button) {
this.button = button;
}
}
(二):封裝生成選單的方法
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mote.weixin.entry.Menu;
public class MenuUtils {
private static ObjectMapper MAPPER = new ObjectMapper();
public static int createMenu(Menu menu, String accessToken) throws Exception {
int result = 0;
// 拼裝建立選單的url
String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+accessToken+"";
// 將選單物件轉換成json字串
String jsonMenu = MAPPER.writeValueAsString(menu);
// 呼叫介面建立選單,CommonUtils是上一篇中介紹的內容
String resq = CommonUtils.Post_Json(url, jsonMenu);
JsonNode tree = MAPPER.readTree(resq);
if(tree.get("errcode").toString().equals("0")){
System.out.println("選單建立成功!");
}else{
System.out.println("選單建立失敗!");
}
return result;
}
}
(三):組裝資料,生成選單
import org.springframework.stereotype.Controller;
import com.mote.weixin.entry.Button;
import com.mote.weixin.entry.CommonButton;
import com.mote.weixin.entry.ComplexButton;
import com.mote.weixin.entry.Menu;
import com.mote.weixin.utils.CommonUtils;
import com.mote.weixin.utils.MenuUtils;
@Controller
public class MenuController {
public static void main(String[] args) {
try {
// 呼叫介面獲取access_token,CommonUtils是上一篇中的內容
String accessToken = CommonUtils.getAccessToken();
// 呼叫介面建立選單
MenuUtils.createMenu(getMenu(), accessToken);
} catch (Exception e) {
System.out.println("選單建立失敗");
e.printStackTrace();
}
}
/**
* 組裝選單資料
*
* @return
*/
private static Menu getMenu() {
CommonButton btn11 = new CommonButton();
btn11.setName("校園導航");
btn11.setType("view");
btn11.setUrl("http://02d73f21.ngrok.io/wx_coges/navi.jsp");
CommonButton btn21 = new CommonButton();
btn21.setName("學校風采");
btn21.setType("view");
btn21.setKey("21");
btn21.setUrl("https://www.baidu.com/");
CommonButton btn31 = new CommonButton();
btn31.setName("健身服務");
btn31.setType("click");
btn31.setKey("31");
CommonButton btn32 = new CommonButton();
btn32.setName("愛情諮詢");
btn32.setType("click");
btn32.setKey("32");
/**
* 微信: mainBtn2,mainBtn3底部的三個一級選單
*/
ComplexButton mainBtn3 = new ComplexButton();
mainBtn3.setName("更多服務");
mainBtn3.setSub_button(new CommonButton[] { btn31, btn32});
/**
* 封裝整個選單
*/
Menu menu = new Menu();
menu.setButton(new Button[] { btn11, btn21, mainBtn3 });
return menu;
}
}
ok了,直接執行main方法就可以生成選單了,試試吧