精华内容
下载资源
问答
  • 不过现在个人订阅号是不可以使用高级开发者模式的,如自定义菜单,不过我们还是可以通过测试号来测试一下,然后移代码到服务号。  自定义类型包括如下: 1、click:点击推事件 • 用户点击click类型按钮后,微信...
  • 微信开发自定义菜单以及自定义菜单推送事件 自定义菜单创建接口 微信提供2种机制生成菜单 机制一 是在公众平台官网通过网站功能发布菜单 ,这种方式接入后台服务器之后菜单会失效。 机制二 是通过API调用设置的...

    微信开发之自定义菜单以及自定义菜单推送事件

    自定义菜单创建接口

    微信提供2种机制生成菜单

    机制一

    是在公众平台官网通过网站功能发布菜单 ,这种方式接入后台服务器之后菜单会失效。

    在这里插入图片描述

    机制二

    是通过API调用设置的菜单

    微信官方文档是这样子描述:

    1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
    2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
    3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
    

    自定义菜单接口类型按钮,如下10种:

    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":"miniprogram",
                     "name":"wxa",
                     "url":"http://mp.weixin.qq.com",
                     "appid":"wx286b93c14bbf93aa",
                     "pagepath":"pages/lunar/index"
                 },
                {
                   "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 菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型
    name 菜单标题,不超过16个字节,子菜单不超过60个字节
    key click等点击类型必须 菜单KEY值,用于消息接口推送,不超过128字节
    url view、miniprogram类型必须 网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。
    media_id media_id类型和view_limited类型必须 调用新增永久素材接口返回的合法media_id
    appid miniprogram类型必须 小程序的appid(仅认证公众号可配置)
    pagepath miniprogram类型必须 小程序的页面路径

    返回结果

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

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

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

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

    代码示例:

    1 简单的一级菜单可以直接发送json字符串 ,调用接口即可。

    可以查看此博客 https://www.jianshu.com/p/6eee9f99ec56

    2 复杂的二级菜单

    顶级菜单基类
    @Data
    public class BasicButton {
        private String name;
    
        private String type;
    
        /**
         * 二级菜单的数组标签 为 sub_button
         */
        private BasicButton []sub_button;
    
    }
    
    点击事件菜单实体
    @Data
    public class ClickButton extends BasicButton {
    
        private String key;
    }
    
    
    跳转链接菜单实体
    @Data
    public class ViewButton extends  BasicButton {
        private String url ;
    }
    
    
    设置菜单
    public final static String CREAT_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=";
        public static void creatOption() {
            
            String url = CREAT_OPTION_URL + AccessTokenTool.getToken();
            String data = JSON.toJSONString(getMenu());
            log.info("发送的菜单json数据为: " + data);
            String s = HttpUtil.sendHttpByPost(url, data);
            log.info("返回的菜单json数据为: " + s);
            JSONObject jsonObject = JSONObject.parseObject(s);
            if (jsonObject.getInteger("errcode") == 0) {
                log.info("设置自定义菜单成功。");
    
            } else {
                log.error("设置自定义菜单失败。");
            }
        }
    
    
    
        /**
         * 组装菜单数据
         *
         * @return
         */
        private static Menu getMenu() {
            ClickButton btn11 = new ClickButton();
            btn11.setName("点击事件11");
            btn11.setType("click");
            btn11.setKey("11");
    
            ClickButton btn12 = new ClickButton();
            btn12.setName("点击事件12");
            btn12.setType("click");
            btn12.setKey("12");
    
            ClickButton btn13 = new ClickButton();
            btn13.setName("点击事件13");
            btn13.setType("click");
            btn13.setKey("13");
    
            ViewButton btn14 = new ViewButton();
            btn14.setName("view类型事件14");
            btn14.setType("view");
            btn14.setUrl("https://www.baidu.com"); //需要跳转的url
    
            ViewButton btn21 = new ViewButton();
            btn21.setName("view类型事件21");
            btn21.setType("view");
            btn21.setUrl("需要跳转的url"); //需要跳转的url
    
            ViewButton btn22 = new ViewButton();
            btn22.setName("view类型事件22");
            btn22.setType("view");
            btn22.setUrl("需要跳转的url"); //需要跳转的url
    
            ClickButton btn31 = new ClickButton();
            btn31.setName("点击事件31");
            btn31.setType("click");
            btn31.setKey("31");
    
            ViewButton btn32 = new ViewButton();
            btn32.setName("view类型事件32");
            btn32.setType("view");
            btn32.setUrl("/find"); //需要跳转的url
    
            ClickButton btn33 = new ClickButton();
            btn33.setName("点击事件33");
            btn33.setType("click");
            btn33.setKey("33");
    
            ViewButton btn34 = new ViewButton();
            btn34.setName("view类型事件34");
            btn34.setType("view");
            btn34.setUrl( "https://www.baidu.com"); //需要跳转的url
    
            BasicButton mainBtn1 = new BasicButton();
            mainBtn1.setName("一级菜单1");
            mainBtn1.setSub_button(new BasicButton[]{ btn11, btn12, btn13 ,btn14});
    
            BasicButton mainBtn2 = new BasicButton();
            mainBtn2.setName("一级菜单2");
            mainBtn2.setSub_button(new BasicButton[] { btn21, btn22});
    
            BasicButton mainBtn3 = new BasicButton();
            mainBtn3.setName("一级菜单3");
            mainBtn3.setSub_button(new BasicButton[] { btn31, btn32, btn33,btn34 });
    
            /**
             * 这是公众号 “ 程序员日常锦集 ” 目前的菜单结构 ,每个一级菜单都有二级菜单项<br>
             *
             * 在某个一级菜单下没有二级菜单的情况,menu该如何定义呢?<br>
             * 比如,第三个一级菜单项不是“点击事件31”,而直接是“view类型事件32”,那么menu应该这样定义:<br>
             * menu.setButton(new Button[] { mainBtn1, mainBtn2, btn32 });
             */
            Menu menu = new Menu();
            menu.setButton(new BasicButton[] { mainBtn1, mainBtn2, mainBtn3 });
    
            return menu;
        }
    
    

    自定义菜单事件推送

    微信会将点击事件推送给开发者,也就是我们填写的服务器地址!

    这里请注意:

    请注意,点击菜单弹出子菜单,不会产生上报。请注意,第3个到第8个的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。

    点击菜单拉取消息时的事件推送

    推送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>
    

    参数说明:

    事件类型Event为:CLICK

    EventKey 就是我们自定义菜单时候所填写的key值,根据这个key值区分不同的菜单。

    点击菜单,解析微信推送给我们的xml数据:

    判断菜单:
    	//这里xml转为 map类型了 
        public static BaseMsg handleClick(Map<String, String> xmlData) {
            String eventKey = xmlData.get("EventKey");
            BaseMsg bm = null;
    
            switch (eventKey) {
    
                case "11":
                    bm = new TextMsg(xmlData, "菜单11");
                    break;
    
                case "12":
    
                    bm = new TextMsg(xmlData,"菜单11" );;
                    break;
    
                case "13":
                    bm = new TextMsg(xmlData, "");
                    break;
    
                case "31":
                    bm =  new TextMsg(xmlData, "更多信息,敬请期待!");
                    break;
    
                case "33":
                    //返回图文消息
                    bm =  ArticlesMessageTool.getAiticlesMessage(xmlData, "url")
    
                        //其他的消息类型自己定义即可
                    break;
    
                default:
                    bm = new TextMsg(xmlData, " 欢迎。。。。 ");
            }
    
            return bm;
        }
    
    消息基类
    @XStreamAlias("xml") //设置根节点名
    @Data
    public class BaseMsg {
    
        //置顶别名首字母大写
        @XStreamAlias("ToUserName")
        private String toUserName;//开发者微信号
        private String FromUserName;//发送方帐号(一个OpenID)
        private String CreateTime;//消息创建时间 (整型)
        private String MsgType;//MsgType 文本类型
    
    
        public BaseMsg(Map<String, String> map) {
            this.CreateTime = System.currentTimeMillis() / 1000 + "";
            this.FromUserName = map.get("ToUserName");
            this.toUserName = map.get("FromUserName");
        }
    
    }
    
    
    文本消息类:
    @XStreamAlias("xml")
    @Data
    public class TextMsg extends BaseMsg {
    
        private String Content;//文本消息内容
    
        public TextMsg(Map<String, String> map, String Content) {
            super(map);
            this.Content = Content;
            this.setMsgType("text");
        }
    
    }
    
    
    图文消息类:
    @XStreamAlias("xml") //设置根节点名
    @Data
    public class ImageMsg extends BaseMsg {
    
    
        private String ArticleCount;// 是  图文消息个数;当用户发送文本、图片、视频、图文、地理位置这五种消息时,开发者只能回复1条图文消息;其余场景最多可回复8条图文消息
        private List<ArticlesItem> Articles;// 是  图文消息信息,注意,如果图文数超过限制,则将只发限制内的
    
    
        public ImageMsg() {
        }
    
        public ImageMsg(Map<String, String> map) {
            super(map);
            this.setMsgType("news");
        }
    
    
    
    
    获取图文消息工具:
        /**
         * 获取图文消息
         *
         * @param custermName
         * @param serverName
         * @param createTime
         * @param xmlData
         * @return
         */
        public static ImageMsg getAiticlesMessage(Map<String, String> xmlData, String url) {
            ImageMsg imageMsg = new ImageMsg(xmlData);
            List<ArticlesItem> list = new ArrayList<ArticlesItem>();
            ArticlesItem item = new ArticlesItem();
            String title = "欢迎使用公众号!";
            String description = "点击图文进入";
            //图片路径
            String picurl = "自己的服务器地址" + "/img/008.jpg";
    
            item.setDescription(AirPortConfig.description);
            item.setTitle(AirPortConfig.title);
            item.setPicUrl(picurl);
            item.setUrl(url);
            list.add(item);
            
            // 多个可以继续设置.....
    
            imageMsg.setArticleCount("1");
            imageMsg.setMsgType("news");
    
            imageMsg.setArticles(list);
    
            return imageMsg;
        }
    
    xml转为map
    public static Map<String, String> getXmlData(InputStream inputStream) {
        Map<String, String> map = new HashMap<>();
        //截取xml
        SAXReader reader = new SAXReader();
        try {
    
            Document document = reader.read(inputStream);
            Element rootElement = document.getRootElement(); //获取根节点
            List<Element> elements = rootElement.elements(); // h获取所有的节点
            for (Element e : elements) {
                map.put(e.getName(), e.getStringValue());
            }
    
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return map;
    }
    
    实体对象输出xml
        public static String bean2Xml(BaseMsg baseMsg) {
            XStream xStream = new XStream();
            //若没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
            xStream.processAnnotations(BaseMsg.class);
            xStream.processAnnotations(TextMsg.class);
            xStream.processAnnotations(ImageMsg.class);
            String xml = xStream.toXML(baseMsg);
            log.info("返回的xml = " + xml);
            return xml;
        }
    
    maven依赖
          <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
            <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>1.4.11.1</version>
            </dependency>
    

    更多信息关注微信公众号

    公众号

    在这里插入图片描述

    展开全文
  • 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。 1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分会以...

    自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。

    1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
    2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
    3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。


    自定义菜单接口可实现多种类型按钮总共有10种,最常见的有两种:
    1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
    2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。

    至于构造curl请求函数和获取access_token这里就不用贴出来了,具体见

    PHP中的curl网络请求

    获取微信基础接口凭证Access_token

    //自定义菜单栏
    public function _createMenu(){
    	$curl = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->_getAccessToken();
    	$data = ' {
    			 "button":[
    			  {
    				   "name":"常用服务",
    				   "sub_button":[
    				   {	
    					   "type":"view",
    					   "name":"百度一下",
    					   "url":"https://www.baidu.com/"
    					},
    					{
    					   "type":"view",
    					   "name":"腾讯视频",
    					   "url":"http://v.qq.com/"
    					},
    					{
    					   "type":"click",
    					   "name":"创业杂谈",
    					   "key":"TALK"
    					}]
    			   },
    			  {	
    				  "type":"click",
    				  "name":"今日歌曲",
    				  "key":"TODAY_MUSIC"
    			  }]
    		 }';
    	$result = $this->_request($curl,true,'POST',$data);
    	echo $result;
    }
    

    按钮类型为click类型的时候,在接收事件推送里边必须有与之对应的key值,否则得不到应有的响应。详见微信消息管理之接收事件推送


    展开全文
  • 目前微信服务号自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分会以“…”代替。请注意,创建自定义菜单后,由于微信客户端缓存,需要...
  • 最近公司要做一个微信公众账号,花了点时间已经一部分功能完成,其中就包括自定义菜单的实现,现在就一些代码分享给大家,觉得对自己有帮助就看看! 自微信进入5.0,公众号有了服务号和订阅号的区别,其中一个...

    最近公司要做一个微信公众账号,花了点时间已经将一部分功能完成,其中就包括自定义菜单的实现,现在就将一些代码分享给大家,觉得对自己有帮助就看看!

    自微信进入5.0,公众号有了服务号和订阅号的区别,其中一个很重要的区别就是服务号可以自定义菜单,而订阅号不可以,所以这篇文章只适合打算开发服务号的朋友。

    读这篇文章时,假设你已经成功的申请到了自定义菜单了权限,如果没有,推荐你去看看这篇博文 《自定义菜单的创建及菜单事件响应》 http://blog.csdn.net/lyq8479/article/details/9841371 那么现在你已经有了自己的AppId和AppSecret,接下来就是获取Token了,方法很简单,如下所说:


    请求说明

    http请求方式: GET
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET


    这是微信上面的文档,现在只要把上面链接中的APPID和APPSECRET修改为自己的AppId和AppSecret,然后直接拷贝至浏览器的地址栏窗口,回车即可获取到那个Token了,如下所示,

    {"access_token":"NUF35mOfsEQMoLhezC053RrU4G2rpFsvt5CmG6mFZtRhCsPmA3EK3W0ohUacF-d3lKJW6i7q_a9UrKRNPb6IRtX6FT1qRu_LAHi2FTxpxXwFNYFwIkWU2qqRA","expires_in":7200}

    现在你的token已经获取成功了,下来就是相关的代码实现了。

    public function createMenu(){
    		$ACCESS_TOKEN = "前面通过浏览器获取到的Token";
    		$data = '{
    		 
    		 "button":[
    		     {	
    		          "type":"click",
    		          "name":"搜索附近",
    		          "key":"1"
    		      },
    		      {	
    		          "type":"click",
    		          "name":"最新活动",
    		          "key":"2"
    		      },
    		      {
    				  "name":"更多",
    				  "sub_button":[
    		            {
    		               "type":"click",
    		               "name":"关于我们",
    		               "key":"3"
    		            },
    		            {
    		               "type":"click",
    		               "name":"用户反馈",
    		               "key":"4"
    		            },
    		            {
    		               "type":"click",
    		               "name":"优倍周边",
    		               "key":"5"
    		            }]
    			  }]
    		 }';
    		$ch = curl_init();
    
    		curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$ACCESS_TOKEN}");
    		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    		$tmpInfo = curl_exec($ch);
    		if (curl_errno($ch)) {
    			echo 'Errno'.curl_error($ch);
    		}
    		curl_close($ch);
    		var_dump($tmpInfo);
    
    	}
    

      

    现在和合适的位置调用上面的方法就可以实现菜单了,

    <?php
    	include_once('include/weixin.class.php');
    	define('TOKEN', 'ubive');
    	define('DEBUG', false);
    	$weixin->createMenu();
    ?>

    注意一点:由于微信缓存的原因,你可能需要取消订阅你原来的微信号后再重新订阅才能看到菜单的效果

    补充一句,这篇博文的目的就是为了实现自定义菜单,所以代码也是以实现目标为准,没有做过多的优化,你可以根据自己的需求继续修改,希望对你有所帮助。

    如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号ubivea来支持我!

    转载于:https://www.cnblogs.com/umao/p/ubive.html

    展开全文
  • 微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 自定义菜单接口API 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archive/2013/04/19/weixin-menu1.html 一、获取权限 自定义菜单...

     微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 自定义菜单接口API

    作者:方倍工作室
    原文:http://www.cnblogs.com/txw1958/archive/2013/04/19/weixin-menu1.html

     

    一、获取权限

    自定义菜单接口目前处于内测阶段,需要向腾讯官方申请权限。通过权限的账号将获得到appid和appsecret

    然后通过appid和appsecret获取access_token

    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

     

    二、菜单创建

    通过POST一个特定结构体,实现在微信客户端创建自定义菜单。

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

    结构体如下:

     {
         "button":[
         {    
              "type":"click",
              "name":"今日歌曲",
              "key":"V1001_TODAY_MUSIC"
          },
          {
               "name":"菜单",
               "sub_button":[
                {
                   "type":"click",
                   "name":"hello word",
                   "key":"V1001_HELLO_WORLD"
                },
                {
                   "type":"click",
                   "name":"赞一下我们",
                   "key":"V1001_GOOD"
                }]
           }]
     }

    菜单删除 

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

     

    三、效果演示

      

    最终效果

     

    说明:申请已经暂停


    欢迎关注方倍工作室微信,了解我们及行业的最新动态


     

    转载于:https://www.cnblogs.com/lanzhi/p/6467730.html

    展开全文
  • 自定义菜单的介绍,可以看官方开发文档http://mp.weixin.qq.com/wiki/home/index.html下面是我自己写的一个实现自定义菜单的小Dome一、先定义了一个Json字符串,格式要按照微信提供的Json格式 ...
  • 正常情况下access_token有效期为7200秒,重复获取导致上次获取的access_token失效。公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在开发模式中获得(需要已经成为开发者...
  • 在这里介绍微信公众号的自定义菜单开发 先恭迎我们的TX文档 微信公众号——自定义菜单栏 官方文档里说明了一些需要注意的事项 在这里 我只使用了几个我业务中用到的类型 哈哈哈 本来在考虑要不要加在后台上...
  • 微信公众号开发自定义菜单自定义菜单最多包括3个一级菜单,每个一级菜单最多包括5二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分会以“...”代替。创建自定义菜单后,菜单的刷新策略是,在...
  • 而在本文针对自定义菜单做简单的开发应用,微信公众平台具有自定义菜单的功能。开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,可以调出相应的回复信息或...
  • 目前微信服务号自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分会以“...”代替。请注意,创建自定义菜单后,由于微信客户端缓存,...
  • 微信企业号开发:自定义菜单

    万次阅读 2015-07-21 10:49:10
    开发微信企业号可以通过程序自定义菜单,只需要调用相关的接口就可以实现。其实这个菜单也就是微信底部的菜单,目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级...
  • 请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。 目前自定义菜单接口可实现两种类型按钮,如下: ...
  • 当然是为了调用微信的各种接口而获取的咯,接下来我们首次使用我们获取的access_token来调用微信公众号接口—自定义菜单,这也是首次装饰我们的公众号呢。好的废话不多说进入正题,由于个人订阅号自定义菜单接口...
  • JAVA微信公众号开发自定义菜单

    千次阅读 2017-07-27 23:20:31
    微信上文档说明: 1、click:点击推事件用户点击click类型按钮后...2、view:跳转URL用户点击view类型按钮后,微信客户端会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户...
  • 一、简介 微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义菜单的功能。开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,...本文针对自定义菜单做简单的开发...
  • 自定义菜单接口可实现多种类型按钮,如下:1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,...
  • 微信开发(二)自定义菜单

    千次阅读 2014-12-02 20:16:30
    目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分会以“...”代替。 步骤: 1. 调用接口获得通讯Token 2. 调用接口创建自定义菜单...
  • 一、简介 微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义...本文针对自定义菜单做简单的开发应用,以供读者参考。 二、官方说明 开发者获取使用凭证后,可以使用该凭证对公众账号的自...
  • 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。...请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则
  • 微信公众号自定义菜单的创建步骤 1、找到AppId和AppSecret。自定义菜单申请成功后,在“高级功能”-“开发模式”-“接口配置信息”的最后两项就是; 2、根据AppId和AppSecret,以https get方式获取访问特殊接口所...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 385
精华内容 154
关键字:

微信开发将自定义菜单