1. 程式人生 > >微信公眾號測試賬號-自定義選單

微信公眾號測試賬號-自定義選單

自定義選單介面可實現多種型別按鈕,如下:

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,是專門給第三方平臺旗下未微信認證(具體而言,是資質認證未通過)的訂閱號準備的事件型別,它們是沒有事件推送的,能力相對受限,其他型別的公眾號不必使用。

介面呼叫請求說明

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”:”view”,
“name”:”視訊”,
“url”:”http://v.qq.com/
},
{
“type”:”click”,
“name”:”贊一下我們”,
“key”:”V1001_GOOD”
}]
}]
}

其他新增按鈕型別的請求示例

{
“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”
}
]
}

引數說明
引數 是否必須 說明
button 是 一級選單陣列,個數應為1~3個
sub_button 否 二級選單陣列,個數應為1~5個
type 是 選單的響應動作型別
name 是 選單標題,不超過16個位元組,子選單不超過40個位元組
key click等點選型別必須 選單KEY值,用於訊息介面推送,不超過128位元組
url view型別必須 網頁連結,使用者點選選單可開啟連結,不超過1024位元組
media_id media_id型別和view_limited型別必須 呼叫新增永久素材介面返回的合法media_id

返回結果

正確時的返回JSON資料包如下:

{“errcode”:0,”errmsg”:”ok”}

錯誤時的返回JSON資料包如下(示例為無效選單名長度):

{“errcode”:40018,”errmsg”:”invalid button name size”}

以下的bean根據json格式拼接而成。。。

package org.ssm.maven.test1.menu;

public class Button {

    private String type;
    private String name;
    private Button[] sub_button;
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Button[] getSub_button() {
        return sub_button;
    }
    public void setSub_button(Button[] sub_button) {
        this.sub_button = sub_button;
    }
}
package org.ssm.maven.test1.menu;

public class ClickButton extends Button {

    private String key;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }


}
package org.ssm.maven.test1.menu;

public class ViewButton extends Button {

    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }


}

根據選單

package org.ssm.maven.test1.menu;

public class Menu {

    private Button[] button;

    public Button[] getButton() {
        return button;
    }

    public void setButton(Button[] button) {
        this.button = button;
    }
}

初始化選單

public static Menu initMenu(){
        Menu menu = new Menu();
        ClickButton clickButton = new ClickButton();
        clickButton.setKey("clickButton");
        clickButton.setType("click");
        clickButton.setName("clickMenu");

        ViewButton viewButton = new ViewButton();
        viewButton.setName("viewButton");
        viewButton.setType("view");
        viewButton.setUrl("http://www.baidu.com");

        ClickButton clickButton1 = new ClickButton();
        clickButton1.setKey("scanButton");
        clickButton1.setType("scancode_push");
        clickButton1.setName("scanButton");

        ClickButton clickButton2 = new ClickButton();
        clickButton2.setKey("locationButton");
        clickButton2.setType("location_select");
        clickButton2.setName("locationButton");

        Button button = new Button();
        button.setName("Menu");
        button.setSub_button(new Button[]{clickButton1,clickButton2});

        menu.setButton(new Button[]{clickButton,viewButton,button});
        return menu;
    }
    //建立選單的url拼接
    public static int createMenu(String menu, String token){
        String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token);
        int result = 0;
        JSONObject jsonObject = doPostStr(url, menu);
        if(jsonObject != null){
            result = jsonObject.getInt("errcode");
        }
        return result;
    }
    //查詢選單的url的拼接
    public static JSONObject queryMenu(String token){
        String url = QUERY_MENU_URL.replace("ACCESS_TOKEN", token);
        JSONObject jsonObject = doGetUrl(url);
        return jsonObject;
    }
package org.ssm.maven.test1;


import java.sql.Timestamp;

import org.ssm.maven.test1.model.AccessToken;
import org.ssm.maven.test1.util.WechatUtil;
import org.ssm.maven.trans.util.TransUtil;

import net.sf.json.JSONObject;

public class WechatUtilTest {

    public static void main(String[] args) {
        AccessToken accessToken = WechatUtil.getAccessToken();
        System.out.println("accessToken=>" + accessToken.getToken());
        System.out.println("expiresIn=>" + accessToken.getExpiresIn());

        JSONObject fromObject = JSONObject.fromObject(WechatUtil.initMenu());
        int result = WechatUtil.createMenu(fromObject.toString(), accessToken.getToken());
        if (result == 0) {
            System.out.println("create menu success");
        } else {
            System.out.println("error code : " + result);
        }

    }
}