微信公众号菜单创建_微信公众号创建菜单 - CSDN
精华内容
参与话题
  • 微信公众平台按钮及菜单创建

    千次阅读 2015-01-03 10:47:53
    微信公众平台管理测试账号下方选择会话界面自定义菜单

    在微信公众平台管理测试账号下方选择会话界面自定义菜单



    在界面底部找到使用网页调试工具调试该接口


    首先获得access_token


    在appid和secret中填上之前管理测试账号页面提供的数据,点击检查问题


    下方的access_token就是一会提交菜单要用到的access_token


    分别选择接口类型接口列表。进入如下界面


    access_token中输入刚才得到的access_token,

    在body中输入刚才微信公众平台开发者文档中的例子

     {
         "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"
                }]
           }]
     }

    点击检查问题

    如果显示:


    即为菜单创建成功

    取消关注微信号重新关注即可直接查看效果。否则受限于微信限制,需要24小时后缓存刷新方可查看。

    ps :

    其他新增按钮类型的请求示例

    {
        "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"
            }
        ]
    }

    参数说明

    参数 是否必须 说明
    button 一级菜单数组,个数应为1~3个
    sub_button 二级菜单数组,个数应为1~5个
    type 菜单的响应动作类型
    name 菜单标题,不超过16个字节,子菜单不超过40个字节
    key click等点击类型必须 菜单KEY值,用于消息接口推送,不超过128字节
    url view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节

    展开全文
  • 使用JAVA后端去自定义创建菜单微信公众号开发文档中提供了API: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013,请大家认真的观看文档的中的信息, 创建菜单中有一些要注意的地方: ...

    使用JAVA后端去自定义创建菜单,微信公众号开发文档中提供了API:

    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013,请大家认真的观看文档的中的信息,

    创建菜单中有一些要注意的地方:

    1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。

    2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。

    3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

    这些可以说是创建菜单中的格式或者是规则,下面是菜单的类型,每个类型代表给他创建的菜单中的功能是不一样的,请认真查看文档

    创建菜单的接口为: https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN , 注意:发送的请求是POST

    代码实例:

    HttpUtils.java(发送POST请求):

    import com.alibaba.fastjson.JSONObject;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import java.io.IOException;
    import java.net.URLDecoder;
    /**
     * <p>User: qrn
     * <p>Date: 14-1-28
     * <p>Version: 1.0
     * 描述: http请求的工具类
     */
    public class HttpUtils {
        private static Logger logger = LoggerFactory.getLogger(HttpUtils.class);    //日志记录

        /**
         * httpPost
         *
         * @param url       路径
         * @param jsonParam 参数
         * @return JSONObject
         */
        public static JSONObject httpPost(String url, String jsonParam) {
            return httpPost(url, jsonParam, false);
        }

        /**
         * post请求
         *
         * @param url            url地址
         * @param param      参数
         * @param noNeedResponse 不需要返回结果
         * @return JSONObject
         */
        public static JSONObject httpPost(String url, String param, boolean noNeedResponse) {
            //post请求返回结果
            HttpClient httpClient = HttpClients.createDefault();
            JSONObject jsonResult = null;
            HttpPost method = new HttpPost(url);
            try {
                if (null != param) {
                    //解决中文乱码问题
                    StringEntity entity = new StringEntity(param, "utf-8");
                    entity.setContentEncoding("UTF-8");
                    entity.setContentType("application/json");
                    method.setEntity(entity);
                }
                HttpResponse result = httpClient.execute(method);
                url = URLDecoder.decode(url, "UTF-8");
                /**请求发送成功,并得到响应**/
                if (result.getStatusLine().getStatusCode() == 200) {
                    String str = "";
                    try {
                        /**读取服务器返回过来的json字符串数据**/
                        str = EntityUtils.toString(result.getEntity());
                        System.out.println(str);
                        if (noNeedResponse) {
                            return null;
                        }
                        /**把json字符串转换成json对象**/
                        jsonResult = JSONObject.parseObject(str);
                    } catch (Exception e) {
                        logger.error("post请求提交失败:" + url, e);
                    }
                }
            } catch (IOException e) {
                logger.error("post请求提交失败:" + url, e);
            }
            return jsonResult;
        }

    }

    创建菜单的方法(SpringMvc):

     /**
         * 创建自定义菜单:
         */
        @RequestMapping("/getAccount_txt")
        @ResponseBody
        public void getAccount_txt() {
             String access_token = accountsService.Accountaccess_token(); //这里是获取的TOken接口
             String url=WeChatTools.create+access_token; //这里是创建菜单的接口和token拼接  https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
             System.out.println("发送的url"+url);
             String sun="{\r\n" + 
                     "     \"button\":[\r\n" + 
                     "     {    \r\n" + 
                     "          \"type\":\"click\",\r\n" + 
                     "          \"name\":\"今日歌曲\",\r\n" + 
                     "          \"key\":\"V1001_TODAY_MUSIC\"\r\n" + 
                     "      },\r\n" + 
                     "      {\r\n" + 
                     "           \"name\":\"菜单\",\r\n" + 
                     "           \"sub_button\":[\r\n" + 
                     "           {    \r\n" + 
                     "               \"type\":\"view\",\r\n" + 
                     "               \"name\":\"搜索\",\r\n" + 
                     "               \"url\":\"http://www.soso.com/\"\r\n" + 
                     "            },\r\n" + 
                     "            {\r\n" + 
                     "                 \"type\":\"miniprogram\",\r\n" + 
                     "                 \"name\":\"wxa\",\r\n" + 
                     "                 \"url\":\"http://mp.weixin.qq.com\",\r\n" + 
                     "                 \"appid\":\"wx286b93c14bbf93aa\",\r\n" + 
                     "                 \"pagepath\":\"pages/lunar/index\"\r\n" + 
                     "             },\r\n" + 
                     "            {\r\n" + 
                     "               \"type\":\"click\",\r\n" + 
                     "               \"name\":\"赞一下我们\",\r\n" + 
                     "               \"key\":\"V1001_GOOD\"\r\n" + 
                     "            }]\r\n" + 
                     "       }]\r\n" + 
                     " }";
             JSONObject  jsonObjects=JSONObject.fromObject(sun);
             HttpUtils.httpPost(url,jsonObjects.toString());
        }

    这样根据自己所需要的去拼写相应的类型就可以实现了

    下面是进行了封装的创建菜单:
    Button.java:

    /**
     * 菜单:
     * @author Administrator
     *
     */
    public class Button {
       
        /**
         * 菜单名称:
         */
        private String name;

        public Button() {
            super();
        }

        public Button(String name) {
            super();
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Button other = (Button) obj;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return "Button [name=" + name + "]";
        }
    }

    CommonButton.java:


    /**
     * 二级菜单(CLICK类型)
     * @author Administrator
     *
     */
    public class CommonButton  extends Button {

        /**
         * 菜单名称:
         */
        private String name;
        
        /**
         * 类型
         */
        private String type;
        
        /**
         * 响应动作类型
         */
        private String key;

        public CommonButton() {
            super();
        }

        public CommonButton(String name, String type, String key) {
            super();
            this.name = name;
            this.type = type;
            this.key = key;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        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;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((key == null) ? 0 : key.hashCode());
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            result = prime * result + ((type == null) ? 0 : type.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            CommonButton other = (CommonButton) obj;
            if (key == null) {
                if (other.key != null)
                    return false;
            } else if (!key.equals(other.key))
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            if (type == null) {
                if (other.type != null)
                    return false;
            } else if (!type.equals(other.type))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return "CommonButton [name=" + name + ", type=" + type + ", key=" + key + "]";
        }
        
    }
     

    ComplexButton.java:
     


    import java.util.Arrays;

    /**
     * 一级菜单:
     * @author Administrator
     *
     */
    public class ComplexButton  extends Button{
        
        /**
         * 菜单名称:
         */
        private String name;
        
        /**
         * 子级菜单:
         */
        private Button[] sub_button;
        
        
        

        public ComplexButton() {
            super();
        }

        public ComplexButton(String name, Button[] sub_button) {
            super();
            this.name = name;
            this.sub_button = sub_button;
        }

        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;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            result = prime * result + Arrays.hashCode(sub_button);
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            ComplexButton other = (ComplexButton) obj;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            if (!Arrays.equals(sub_button, other.sub_button))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return "ComplexButton [name=" + name + ", sub_button=" + Arrays.toString(sub_button) + "]";
        }
        
    }
     

    Menu.java:
     


    import java.util.Arrays;

    /**
     * 表示要创建的菜单
     * @author Administrator
     *
     */
    public class Menu {

        private ComplexButton[] button;

        public Menu() {
            super();
        }

        public Menu(ComplexButton[] button) {
            super();
            this.button = button;
        }

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

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

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + Arrays.hashCode(button);
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Menu other = (Menu) obj;
            if (!Arrays.equals(button, other.button))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return "Menu [button=" + Arrays.toString(button) + "]";
        }

    }
    ViewButton.java:
     


    /**
     * 二级菜单:(view)类型:
     * @author Administrator
     *
     */
    public class ViewButton extends Button{
        
        /**
         * 菜单名称:
         */
        private String name;
        /**
         * 类型:
         */
        private String type;
        
        /**
         * 响应的网页:
         */
        private String url;

        public ViewButton() {
            super();
        }

        public ViewButton(String name, String type, String url) {
            super();
            this.name = name;
            this.type = type;
            this.url = url;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        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;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            result = prime * result + ((type == null) ? 0 : type.hashCode());
            result = prime * result + ((url == null) ? 0 : url.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            ViewButton other = (ViewButton) obj;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            if (type == null) {
                if (other.type != null)
                    return false;
            } else if (!type.equals(other.type))
                return false;
            if (url == null) {
                if (other.url != null)
                    return false;
            } else if (!url.equals(other.url))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return "ViewButton [name=" + name + ", type=" + type + ", url=" + url + "]";
        }

    }
     

    MiniprogramButton.java:
     


    /**
     * 跳转到小程序:
     * @author Administrator
     *
     */
    public class MiniprogramButton  extends Button{
        
        
        /**
         * 类型:
         */
        private String type;
        
        /**
         * 名称:
         */
        private String name;
        
        /**
         * 路径:
         */
        private String url;
        /**
         * 小程序 appid
         */
        private String appid;
        /**
         * 小程序的页面
         */
        private String pagepath;
        
        public MiniprogramButton() {
            super();
        }

        public MiniprogramButton(String type, String name, String url, String appid, String pagepath) {
            super();
            this.type = type;
            this.name = name;
            this.url = url;
            this.appid = appid;
            this.pagepath = pagepath;
        }

        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 String getUrl() {
            return url;
        }

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

        public String getAppid() {
            return appid;
        }

        public void setAppid(String appid) {
            this.appid = appid;
        }

        public String getPagepath() {
            return pagepath;
        }

        public void setPagepath(String pagepath) {
            this.pagepath = pagepath;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((appid == null) ? 0 : appid.hashCode());
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            result = prime * result + ((pagepath == null) ? 0 : pagepath.hashCode());
            result = prime * result + ((type == null) ? 0 : type.hashCode());
            result = prime * result + ((url == null) ? 0 : url.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            MiniprogramButton other = (MiniprogramButton) obj;
            if (appid == null) {
                if (other.appid != null)
                    return false;
            } else if (!appid.equals(other.appid))
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            if (pagepath == null) {
                if (other.pagepath != null)
                    return false;
            } else if (!pagepath.equals(other.pagepath))
                return false;
            if (type == null) {
                if (other.type != null)
                    return false;
            } else if (!type.equals(other.type))
                return false;
            if (url == null) {
                if (other.url != null)
                    return false;
            } else if (!url.equals(other.url))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return "MiniprogramButton [type=" + type + ", name=" + name + ", url=" + url + ", appid=" + appid
                    + ", pagepath=" + pagepath + "]";
        }
    }
    MenuUtil.java:

    /**
     * 菜单工具类:
     * @author Administrator
     *
     */
    public class MenuUtil {

        
        
        /**
         * 封装菜单数据
         * @return
         */
        public static Menu getMenu() {
        
            //创建view类型的菜单
            ViewButton cb_4 = new ViewButton();
            cb_4.setType("view");
            cb_4.setName("菜单的名称");
            cb_4.setUrl("跳转的网页路径");
            
            //创建click类型的菜单
            CommonButton cb_2 = new CommonButton();
            cb_2.setType("click");
            cb_2.setName("菜单的名称");
            cb_2.setKey("xxxxxxx");
            
            //创建click类型的菜单
            CommonButton cb_3 = new CommonButton();
            cb_3.setType("click");
            cb_3.setName("菜单的名称");
            cb_3.setKey("xxxxxxxxxxxx");

            //创建第一个一级菜单
            ComplexButton cx_1 = new ComplexButton();
            cx_1.setName("一级菜单名称");
            cx_1.setSub_button(new Button[]{cb_4,cb_2,cb_3});

            
        
            //创建第二个一级菜单
            ComplexButton cx_2 = new ComplexButton();
            cx_2.setName("一级菜单名称");
            
            //创建公众号跳转到小程序的菜单
            MiniprogramButton miniprogramButton = new MiniprogramButton();
            miniprogramButton.setName("菜单名称");
            miniprogramButton.setType("miniprogram");
            miniprogramButton.setAppid("要跳转的小程序APPID");
            miniprogramButton.setUrl("http://mp.weixin.qq.com");
            miniprogramButton.setPagepath("小程序要展示的页面路径");
            cx_2.setSub_button(new Button[]{miniprogramButton});
            
            ComplexButton cx_3 = new ComplexButton();
            cx_3.setName("菜单名称");
            
            CommonButton commonButton = new CommonButton();
            commonButton.setKey("key3");
            commonButton.setName("菜单名称");
            commonButton.setType("click");
            cx_3.setSub_button(new Button[] {commonButton});        //封装菜单数据
            Menu menu=new Menu();
            menu.setButton(new ComplexButton[]{cx_2,cx_3,cx_1});
            return menu;
        }
    }

     

     /**
         * 创建自定义菜单:
         */
        @RequestMapping("/getAccount_txt")
        @ResponseBody
        public void getAccount_txt() {
             String access_token = accountsService.Accountaccess_token(); //这里是获取的TOken接口
             String url=WeChatTools.create+access_token; //这里是创建菜单的接口和token拼接  https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
             System.out.println("发送的url"+url);
             Menu menu = MenuUtil.getMenu();
             JSONObject  jsonObjects=JSONObject.fromObject(menu);
             HttpUtils.httpPost(url,jsonObjects.toString());
        }

    这里就是创建自定义菜单的实例了,这些代码应该是没有问题的,如果有问题可以在下发评论

     

     

     

     

     

    展开全文
  • java版微信公众号开发之自定义菜单创建
  • 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。开启自定义菜单后,公众号界面如图所示: http请求方式:POST(请使用https协议) ... ... ...

    自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。开启自定义菜单后,公众号界面如图所示:
    这里写图片描述

    http请求方式:POST(请使用https协议)

    https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

    请求示例

    {
         "button":[
         {    
              "type":"click",
              "name":"今日歌曲",
              "key":"V1001_TODAY_MUSIC"
          },
          {
               "type":"click",
               "name":"歌手简介",
               "key":"V1001_TODAY_SINGER"
          },
          {
               "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 一级菜单数组,个数应为1~3个
    sub_button 二级菜单数组,个数应为1~5个
    type 菜单的响应动作类型,目前有click、view两种类型
    name 菜单标题,不超过16个字节,子菜单不超过40个字节
    key click类型必须 菜单KEY值,用于消息接口推送,不超过128字节
    url view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节

    自定义类型包括如下

    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。

    返回结果

    正确时的返回JSON数据包如下:

    {"errcode":0,"errmsg":"ok"}

    错误时的返回JSON数据包如下(示例为无效菜单名长度):

    {"errcode":40018,"errmsg":"invalid button name size"}

    C#代码示例:

     /// <summary>
    /// 向微信服务器请求创建自定义菜单
    /// </summary>
    /// <param name="jsonStr"></param>
    /// <returns></returns>
    private bool requstToCreatMent(string jsonStr)
    {
        try
        {
            //声明一个HttpWebRequest请求
            string interfaceUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + AccessToken;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(interfaceUrl);
            //设置连接超时时间 
            request.Timeout = 30000;
            request.KeepAlive = true;
            Encoding encodeType = Encoding.GetEncoding("UTF-8");
            request.Headers.Set("Pragma", "no-cache");
            request.Method = "POST";
    
            request.ContentType = "application/x-www-form-urlencoded";
            request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322); Http STdns";
            request.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
            request.CookieContainer = new CookieContainer();
            byte[] Bytes = encodeType.GetBytes(jsonStr);
    
            request.ContentLength = Bytes.Length;
            request.AllowAutoRedirect = true;
    
            //发送数据
            using (Stream writer = request.GetRequestStream())
            {
                writer.Write(Bytes, 0, Bytes.Length);
                writer.Close();
            }
    
            StringBuilder strb = new StringBuilder();
            //接收数据
            using (Stream reader = request.GetResponse().GetResponseStream())
            {
                StreamReader sr = new StreamReader(reader, encodeType);
                strb.Append(sr.ReadToEnd());
                sr.Close();
                reader.Close();
            }
    
            if ((strb.ToString().IndexOf("\"errcode\":42001") != -1) || (strb.ToString().IndexOf("\"errcode\":40001") != -1) || (strb.ToString().IndexOf("\"errcode\":40014") != -1) || (strb.ToString().IndexOf("\"errcode\":41001") != -1)) 
            {
                //access_token错误
            }
            else
            {
                if (strb.ToString() == "{\"errcode\":0,\"errmsg\":\"ok\"}")
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
        catch 
        {
            return false;
        }
    }
    展开全文
  • 在开发微信公众号时,需要创建自定义的菜单列表,按照固定参数拼接即可,参数如下: String param = "{\n" + "\t\"button\": [{\n" + "\t\t\t\"type\": \"...

    在开发微信公众号时,需要创建自定义的菜单列表,按照固定参数拼接即可,参数如下:

    String param = "{\n" +
            "\t\"button\": [{\n" +
            "\t\t\t\"type\": \"click\",\n" +
            "\t\t\t\"name\": \"订单管理\",\n" +
            "\t\t\t\"key\": \"ORDER\",\n" +
            "\t\t\t\"sub_button\": [{\n" +
            "\t\t\t\t\t\"type\": \"view\",\n" +
            "\t\t\t\t\t\"name\": \"待处理订单\",\n" +
            "\t\t\t\t\t\"url\": \"http://授权地址/jump?path=实际页面url\"\n" +
            "\t\t\t\t},\n" +
            "\t\t\t\t{\n" +
            "\t\t\t\t\t\"type\": \"view\",\n" +
            "\t\t\t\t\t\"name\": \"全部订单\",\n" +
            "\t\t\t\t\t\"url\": \"http://授权地址/jump?path=实际页面url\"\n" +
            "\t\t\t\t}, {\n" +
            "\t\t\t\t\t\"type\": \"view\",\n" +
            "\t\t\t\t\t\"name\": \"订单查询\",\n" +
            "\t\t\t\t\t\"url\": \"http://授权地址/jump?path=实际页面url\"\n" +
            "\t\t\t\t}\n" +
            "\t\t\t]\n" +
            "\t\t},\n" +
            "\t\t{\n" +
            "\t\t\t\"type\": \"view\",\n" +
            "\t\t\t\"name\": \"机票管理\",\n" +
            "\t\t\t\"url\": \"http://授权地址/jump?path=实际页面url\"\n" +
            "\t\t},\n" +
            "\t\t{\n" +
            "\t\t\t\"type\": \"click\",\n" +
            "\t\t\t\"name\": \"相关服务\",\n" +
            "\t\t\t\"key\": \"OTHER\",\n" +
            "\t\t\t\"sub_button\": [{\n" +
            "\t\t\t\t\t\"type\": \"click\",\n" +
            "\t\t\t\t\t\"name\": \"绑定账号\",\n" +
            "\t\t\t\t\t\"key\": \"BIND_ACCOUN\"\n" +
            "\t\t\t\t},\n" +
            "\t\t\t\t{\n" +
            "\t\t\t\t\t\"type\": \"click\",\n" +
            "\t\t\t\t\t\"name\": \"退出登录\",\n" +
            "\t\t\t\t\t\"key\": \"QUIT\"\n" +
            "\t\t\t\t}\n" +
            "\t\t\t]\n" +
            "\t\t}\n" +
            "\t]\n" +
            "}";

    http://授权地址/jump?path=实际页面url

    授权地址:是在微信公众号服务端配置的授权地址,这样就可以获取到用户信息openid。

    授权地址/jump:点击菜单后跳转链接,这个页面用来获取用户信息。

    path=实际页面url:后面的参数代表实际要跳转的页面链接,这样便于区分不同的菜单。

     

    然后调用微信公众号创建菜单列表url,发送post请求即可创建:

    public static final String WX_CREATE_MENU = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
    

     

    post请求详见:针对https请求  针对http请求

     

    展开全文
  • 微信公众号--创建菜单JAVA--SSM

    千次阅读 2018-07-12 15:32:36
    本文以SSM框架示例(研究中 欢迎探讨)如果是自己开发着玩或者试试可以看本文 公司或者工作的请去其他处SSM框架这里就不说了 我是以Tomcat+SSM+花生壳+微信公众号做了一个简单的具有菜单功能的公众号下面是...
  • (2)微信公众平台自定义菜单创建、查询和删除。 实现菜单效果示例如下: 请通过2种方式实现创建菜单,写出所有实现步骤: 第一种方式: 使用微信公众平台接口调试工具创建。只需要输入access_token和菜单格式方可...
  • 在上篇文章实现微信扫码获取带指定参数时,微信公众号后台启用了服务器配置,导致之前设置好的微信自定义菜单失效。 开启了服务器配置,就无法用之前的方式在微信公众平台配置自定义菜单 此时,我们要通过接口来...
  • 首先给出失败的信息{"errmsg":"invalid charset. please check your request, if include \\uxxxx will create fail! hint: [nrCGtA0125vr22]","errcode":40033} 前一阵子在使用json的时候发现了一个奇怪的原因,他...
  • 微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎...
  • 前几天在修改某平台微信公众号自定义创建菜单时有个奇怪的现象。 我是先查询该公众号的菜单,然后再根据查询后的结果修改公众号菜单,但我对其中一个url带&符号的url并未修改。修改成完后调用自定义创建菜单接口,...
  • 微信公众号创建菜单,代码那些都写好了,但是菜单不显示是什么情况? 测试的结果是这样的 ![图片说明](https://img-ask.csdn.net/upload/201812/18/1545137758_896067.png) 是因为Connection: close的原因使...
  • 调用api配置微信公众号自定义菜单

    千次阅读 2018-12-19 11:44:59
    文章目录微信官方接口调用1)查询当前存在的自定义菜单2)自定义菜单删除3)自定义菜单创建 微信官方接口调用 1)查询当前存在的自定义菜单 http请求方式:GET ... 正确响应为: 注: 此处查询到的信息为通过api创建的...
  • 微信公众测试号,创建菜单,抛48001

    千次阅读 2016-08-11 17:27:40
    这里配置成功了,那么创建自定义菜单还抛48001的话,很大的可能就是,你项目里面的 appID和appsecret用的还是你申请的订阅号里面(个人只能申请公众号类型为订阅号) 所以要把项目里面的appID和appsecret改成...
  • 微信公众号如何开发在线报修系统?微信公众号使用的人越来越多,同时很多人会将自己的客户群体放入微信公众号里面,对客户流量进行拦截!那么怎么使用微信公众号来做一个微信报修系统让我们的报修更加的简单: 第...
  • java版微信公众号开发之自定义菜单创建

    万次阅读 多人点赞 2016-05-11 19:33:49
    java版微信公众号开发之自定义菜单创建
  • 我们常见的微信公众号报名功能也可以在公众号里创建创建之后可以让公众号的粉丝通过微信直接提交报名的信息,同时支持用户图片信息上传以及全部用户信息表格的导出,下面具体分享微信公众号报名怎么做的 ...
  • 如果想同时启用服务器配置与自定义菜单,可以这样做: 需要修改菜单的时候 本文结合百度知道@secretid 用户的回答和我的实践,转载需要标明。 1、禁用服务器配置 2、再修改菜单 3、再启用服务器配置 4、点击...
  • 1.自定义菜单功能: 数据结构类型参照微信公众平台数据格式,这里不做分析: 创建相应的实体类: public class Button { //菜单类型 private String type; //菜单名称 private String name; //二级菜单 ...
  • 3、然后看到左侧菜单栏的最下面“开发” 4、可以在“基本配置”选项页面看到下面的图片中内容 开发者ID是直接给定的,开发者密码是需要自己手动再操作几步,不够按着要也很简单,IP白名单可以根据需要进行设置...
1 2 3 4 5 ... 20
收藏数 8,858
精华内容 3,543
关键字:

微信公众号菜单创建