2018-12-17 12:03:51 qq_37253891 阅读数 920
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

在这里插入图片描述
要知道公众号开启开发者模式后,公众号自带的功能就不能使用了。
那么如何自定义菜单呢?
此时,我们要通过接口来配置微信自定义菜单,微信自定义菜单接口链接
先查看官方文档的自定义菜单:
在这里插入图片描述
然后,我们打开微信公众平台接口调试工具 接口调试工具
首先,通过appid以及secret来获取access_token:
在这里插入图片描述
获取到了access_token后,就开始组织创建菜单内容了。
微信官方提供了许多不同功能的按钮类型,可根据实际需求组织创建。
在这里插入图片描述
这里简单的添加了一个按钮点击click事件、一个view点击跳转事件、还有一个二级菜单事件。注意:click按钮都是key-value的形式的,所以这个key属性的值就是你在后台获取到该事件的key;而view事件的url则是点击该按钮将要跳转的url;二级菜单则是用sub_button属性将要展开的按钮事件包裹在内。

{
    "button": [
        {
            "type": "click", 
            "name": "我的绑定", 
            "key": "binding"
        }, 
        {
            "type": "view", 
            "name": "绑定用户", 
            "url": "http://eduapp.guangyusoft.com/xxxxx1.jsp"
        }, 
        {
            "name":"使用指南",
           "sub_button":[
           {    
               "type":"view",
               "name":"为什么要绑定微信",
               "url":"http://eduapp.guangyusoft.com/xxxxx2.jsp"
            },
           {    
               "type":"view",
               "name":"红包的发放规则",
               "url":"http://eduapp.guangyusoft.com/xxxxx3.jsp"
            },
           {    
               "type":"view",
               "name":"系统使用模式",
               "url":"http://eduapp.guangyusoft.com/xxxxx4.jsp"
            }]
        }
    ]
}

最后,在接口调试工具中,选择 “自定义菜单”的接口类型,填入access_token,和刚刚构建好的菜单内容。
在这里插入图片描述
点击检查问题,如果填写参数正确,则请求成功。
在这里插入图片描述
然后就可以在公众号中看到成效了。如果打开公众号没效果的话,重复打开关闭公众号几次或者重新关注公众号即可。
在这里插入图片描述

2017-03-11 12:29:32 zyw_java 阅读数 9677
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

微信开发交流群:148540125

系列文章参考地址 极速开发微信公众号

欢迎留言、转发
项目源码参考地址 点我点我–欢迎Start

前几篇文章已讲完如何导入项目,如何启动配置项目,如何成为开发者,重源码分析消息是如何交互(如果前四项不是很清楚可以看这里 极速开发微信公众号。这篇文章就来讲讲如果实现自定义菜单

实现自定义菜单有两种方式
1、编辑模式
2、开发模式

编辑模式就很简单了就不赘述了……

开发模式实现自定义菜单

1、使用微信公众平台接口调试工具实现
2、使用官方提供的接口实现

前期准备

注意:
1、目前订阅号 只能使用编辑模式而且不能添加超链接,微信认证之后才可以使用开发模式。
2、编辑模式与开发模式不能同时开启
3、生成的菜单不会立即显示(隔天),如果想立即看到效果可以取消关注再关注

添加插件

K8WTIEI86W9W5XERD`MRD{6.png

使用微信公众平台接口调试工具实现

自定义菜单-接口调试工具.png

可以看到需要两个参数而且都是必填 access_token body

有人要问,这两个参数如何获取呢?

body 其实就是要生成菜单的JSON对象 官方有提供一个栗子可以参考

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

access_token 的获取如下图
自定义菜单-获取access_token.png

使用官方提供的接口实现

初次了解微信自定义菜单的同学建议先看看官方的文档3遍

Jfinal-weixin中有封装菜单的创建、查询、删除、以及个性化菜单的创建、查询、删除、测试个性化菜单匹配结果

自定义菜单-菜单封装的接口.png

那么问题来了,封装好了如何使用呢?
以下是提供封装的接口

    //查询自定义菜单
    public static ApiResult getMenu() {
        String jsonResult = HttpUtils.get(getMenu + AccessTokenApi.getAccessTokenStr());
        return new ApiResult(jsonResult);
    }
    //创建自定义菜单
    public static ApiResult createMenu(String jsonStr) {
        String jsonResult = HttpUtils.post(createMenu + AccessTokenApi.getAccessTokenStr(), jsonStr);
        return new ApiResult(jsonResult);
    }
    //删除自定义菜单
    public static ApiResult deleteMenu() {
        String jsonResult = HttpUtils.get(deleteMenuUrl + AccessTokenApi.getAccessTokenStr());
        return new ApiResult(jsonResult);
    }
    //创建个性化自定义菜单
    public static ApiResult addConditional(String jsonStr) {
        String jsonResult = HttpUtils.post(addConditionalUrl + AccessTokenApi.getAccessTokenStr(), jsonStr);
        return new ApiResult(jsonResult);
    }
    //删除个性化自定义菜单
    public static ApiResult delConditional(String menuid) {
        HashMap params = new HashMap();
        params.put("menuid", menuid);
        String url = delConditionalUrl + AccessTokenApi.getAccessTokenStr();
        String jsonResult = HttpUtils.post(url, JsonUtils.toJson(params));
        return new ApiResult(jsonResult);
    }
    //测试个性化菜单匹配结果
    public static ApiResult tryMatch(String userId) {
        HashMap params = new HashMap();
        params.put("user_id", userId);
        String url = tryMatchUrl + AccessTokenApi.getAccessTokenStr();
        String jsonResult = HttpUtils.post(url, JsonUtils.toJson(params));
        return new ApiResult(jsonResult);
    }

    public static ApiResult getCurrentSelfMenuInfo() {
        String jsonResult = HttpUtils.get(getCurrentSelfMenuInfoUrl + AccessTokenApi.getAccessTokenStr());
        return new ApiResult(jsonResult);
    }

开源项目weixin_guidecom.javen.weixin.menu.MenuManager类中提供了详细使用的Demo

public static void main(String[] args) { 

           // 将菜单对象转换成json字符串
           String jsonMenu = JsonKit.toJson(getTestMenu()).toString();
           System.out.println(jsonMenu);
           ApiConfig ac = new ApiConfig();

            // 配置微信 API 相关常量 请使用你自己公众号的
            ac.setAppId("wx614c453e0d1dcd12");
            ac.setAppSecret("19a02e4927d346484fc70327970457f9");
//          ac.setAppId(PropKit.get("appId"));
//          ac.setAppSecret(PropKit.get("appSecret"));
            ApiConfigKit.setThreadLocalApiConfig(ac);

           //创建菜单
           ApiResult apiResult=MenuApi.createMenu(jsonMenu);
           System.out.println(apiResult.getJson());
     }  

可以看到main方法中调用了MenuApi.createMenu(jsonMenu)
jsonMenu 从何而来呢?

其实这里是将自定义菜单的实体对象转化为了JSON

String jsonMenu = JsonKit.toJson(getTestMenu()).toString();

菜单的封装

/** 
         * 组装菜单数据 
         *  
         * @return 
         */  
        private static Menu getTestMenu() {  
            ClickButton btn11 = new ClickButton();  
            btn11.setName("微信相册发图");  
            btn11.setType("pic_weixin");  
            btn11.setKey("rselfmenu_1_1");

            ClickButton btn12 = new ClickButton();  
            btn12.setName("拍照或者相册发图");  
            btn12.setType("pic_photo_or_album");  
            btn12.setKey("rselfmenu_1_2");;  

            ClickButton btn13 = new ClickButton();  
            btn13.setName("系统拍照发图");  
            btn13.setType("pic_sysphoto");  
            btn13.setKey("rselfmenu_1_3");

            ClickButton btn21 = new ClickButton();  
            btn21.setName("扫码带提示");  
            btn21.setType("scancode_waitmsg");  
            btn21.setKey("rselfmenu_2_1");;  

            ClickButton btn22 = new ClickButton();  
            btn22.setName("扫码推事件");  
            btn22.setType("scancode_push");  
            btn22.setKey("rselfmenu_2_2");;  

            ViewButton btn23 = new ViewButton();  
            btn23.setName("我的设备");  
            btn23.setType("view");  
            btn23.setUrl("https://hw.weixin.qq.com/devicectrl/panel/device-list.html?appid=wx614c453e0d1dcd12"); 

            ViewButton btn31 = new ViewButton();  
            btn31.setName("微社区");  
            btn31.setType("view");  
            btn31.setUrl("http://whsf.tunnel.mobi/whsf/msg/wsq");  


            ClickButton btn32 = new ClickButton();  
            btn32.setName("发送位置");  
            btn32.setType("location_select");  
            btn32.setKey("rselfmenu_3_2"); 

            //http://tencent://message/?uin=572839485&Site=在线咨询&Menu=yes
            //http://wpa.qq.com/msgrd?v=3&uin=572839485&site=qq&menu=yes

            ViewButton btn33 = new ViewButton();  
            btn33.setName("在线咨询");  
            btn33.setType("view");  
            btn33.setUrl("http://wpa.qq.com/msgrd?v=3&uin=572839485&site=qq&menu=yes");  

            ViewButton btn34 = new ViewButton();  
            btn34.setName("我的博客");  
            btn34.setType("view");  
            btn34.setUrl("http://www.cnblogs.com/zyw-205520"); 

            ClickButton btn35 = new ClickButton();  
            btn35.setName("点击事件");  
            btn35.setType("click");  
            btn35.setKey("rselfmenu_3_5"); 

            ComButton mainBtn1 = new ComButton();  
            mainBtn1.setName("发图");  
            mainBtn1.setSub_button(new Button[] { btn11, btn12, btn13});  

            ComButton mainBtn2 = new ComButton();  
            mainBtn2.setName("扫码");  
            mainBtn2.setSub_button(new Button[] { btn21, btn22 ,btn23});  

            ComButton mainBtn3 = new ComButton();  
            mainBtn3.setName("个人中心");  
            mainBtn3.setSub_button(new Button[] { btn31, btn32, btn33, btn34 ,btn35 });  

            /** 
             * 这是公众号xiaoqrobot目前的菜单结构,每个一级菜单都有二级菜单项<br> 
             *  
             * 在某个一级菜单下没有二级菜单的情况,menu该如何定义呢?<br> 
             * 比如,第三个一级菜单项不是“更多体验”,而直接是“幽默笑话”,那么menu应该这样定义:<br> 
             * menu.setButton(new Button[] { mainBtn1, mainBtn2, btn33 }); 
             */  
            Menu menu = new Menu();  
            menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });  
            return menu;  
        }

执行main方法会输出生成菜单的JSON以及响应的状态

生成菜单的JSON:{"button":[{"sub_button":[{"name":"微信相册发图","type":"pic_weixin","key":"rselfmenu_1_1"},{"name":"拍照或者相册发图","type":"pic_photo_or_album","key":"rselfmenu_1_2"},{"name":"系统拍照发图","type":"pic_sysphoto","key":"rselfmenu_1_3"}],"name":"发图","type":null},{"sub_button":[{"name":"扫码带提示","type":"scancode_waitmsg","key":"rselfmenu_2_1"},{"name":"扫码推事件","type":"scancode_push","key":"rselfmenu_2_2"},{"name":"我的设备","type":"view","url":"https://hw.weixin.qq.com/devicectrl/panel/device-list.html?appid=wx614c453e0d1dcd12"}],"name":"扫码","type":null},{"sub_button":[{"name":"微社区","type":"view","url":"http://whsf.tunnel.mobi/whsf/msg/wsq"},{"name":"发送位置","type":"location_select","key":"rselfmenu_3_2"},{"name":"在线咨询","type":"view","url":"http://wpa.qq.com/msgrd?v=3&uin=572839485&site=qq&menu=yes"},{"name":"我的博客","type":"view","url":"http://www.cnblogs.com/zyw-205520"},{"name":"点击事件","type":"click","key":"rselfmenu_3_5"}],"name":"个人中心","type":null}],"matchrule":null}

响应的状态: {"errcode":0,"errmsg":"ok"}

以上是生成自定义菜单的全过程。

欢迎留言、转发
项目源码参考地址 点我点我–欢迎Start

2018-06-19 10:31:34 lwpoor123 阅读数 554
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

本实例是为了实现在管理后台实现微信菜单的添加删除管理。

1、首先我们需要新建一个数据库表用于存放menu菜单项


可包含的字段有id、父类id、name、排序、是否显示、类型(view、click)、链接、adddate


注意后台存menu菜单数据时,parentId=-1为一级菜单,或parendId为一级菜单的id作为该一级菜单下的二级菜单


2、在设置菜单时需要向微信接口传menuJson字符串,所以要先拼接字符串,后台定义一个creatMenu()

public bool creatMenu()
        {
            string menuJson = "";
            //这里默认parentId=-1为最外层菜单,isactive=1为显示,responseType=1为click类型
            DataTable dtAMenu = Service.SelectDataTable("id, name, responseType, jsonStr,url", "WEIXINMENU", " parentId=-1 and isactive=1 order by sort");
            if (dtAMenu.Rows.Count > 0)
            {
                menuJson = "{\"button\":[";
                for (int i = 0; i < dtAMenu.Rows.Count; i++)
                {
                    DataTable dtBMenu = Service.SelectDataTable("id, name, responseType, jsonStr,url", wx, " parentId=" + dtAMenu.Rows[i]["id"].ToString() + " and isactive=1 order by sort");
                    if (dtBMenu.Rows.Count > 0)
                    {
                        menuJson += "{\"name\":\"" + dtAMenu.Rows[i]["name"].ToString() + "\",\"sub_button\":[";
                        for (int j = 0; j < dtBMenu.Rows.Count; j++)
                        {
                            if (Convert.ToInt32(dtBMenu.Rows[j]["responseType"]) == 2)
                            {
                                menuJson += "{\"type\":\"view\",\"name\":\"" + dtBMenu.Rows[j]["name"].ToString() + "\",\"url\":\"" + dtBMenu.Rows[j]["jsonStr"].ToString() + "\"},";
                            }
                            else
                            {
                                menuJson += "{\"type\":\"click\",\"name\":\"" + dtBMenu.Rows[j]["name"].ToString() + "\",\"key\":\"eventKey_" + dtBMenu.Rows[j]["id"].ToString() + "\"},";
                            }
                        }
                        menuJson = menuJson.TrimEnd(',');
                        menuJson += "]},";
                    }
                    else
                    {
                        //if (Convert.ToInt32(dtAMenu.Rows[i]["responseType"]) == 2)
                        //{
                            menuJson += "{\"type\":\"view\",\"name\":\"" + dtAMenu.Rows[i]["name"].ToString() + "\",\"url\":\"" + dtAMenu.Rows[i]["jsonStr"].ToString() + "\"},";
                        //}
                        //else
                        //{
                        //    menuJson += "{\"type\":\"click\",\"name\":\"" + dtAMenu.Rows[i]["name"].ToString() + "\",\"key\":\"eventKey_" + dtAMenu.Rows[i]["id"].ToString() + "\"},";
                        //}
                    }
                    dtBMenu.Dispose();
                }
                dtAMenu.Dispose();

                menuJson = menuJson.TrimEnd(',');
                menuJson += "]}";
                menuJson = menuJson.Trim();

                return requstZmToCreatMent(menuJson);
             
            }
            else
            {
                return false;
            }
        }


3、获取到menujson字符串后调用微信接口创建菜单,需先获取assess token,有关assess token获取可参考:获取AccessToken

/// <summary>
        /// 向微信服务器请求创建自定义菜单
        /// </summary>
        /// <param name="jsonStr"></param>
        /// <returns></returns>
        /// 
        private bool requstZmToCreatMent(string jsonStr)
        {
            try
            {
                var AccessToken = "";//accesstoken需例外获取,一般可开始时获取后存数据库,下次从数据库取,注意accesstoken有效期为7200秒
                //声明一个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错误
                {
                    // AccessToken = getAccessToken();
                    getzmAccessToken();
                    return requstZmToCreatMent(jsonStr);
                }
                else
                {
                    if (strb.ToString() == "{\"errcode\":0,\"errmsg\":\"ok\"}")
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            catch (Exception exp)
            {
                return false;
            }
        }

2017-11-16 12:25:38 qq_37936542 阅读数 750
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

 

注意:

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方法就可以生成菜单了,试试吧

2015-02-28 13:45:38 afanxingzhou 阅读数 7316
  • 微信公众平台深度开发v2.0第2季——获取微信服务器IP...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    27780 人正在学习 去看看 翟东平

1.很多同学都吐槽,搞了个服务号,自然要好好发挥自定义菜单这个得天独厚的功能。
但在开发者模式下,要么通过本地代码上传,但这个很容易失败;
要么编辑好菜单的JSON数据,使用在线生成的办法,但这会遇到一个问题,如果使用记事本保存的JSON代码,粘贴到网页上经常出现invalid key size的错误,原因在于记事本是gb2312编码,网页是utf8编码,况且这个方法也非常容易出错。

那么最好用的自定义菜单生成方式是什么?

首先,搜索“微社区”,立即开通;
进入“管理中心”——“我的公众号”,添加自己的微信公众号,添加公众号
接着,完成添加后,选择“自定义菜单”,右边选择需要修改菜单的公众号,点击“确定”。
修改菜单
在这里可按说明修改!
这是目前我发现的在开发者模式下修改自定义菜单最便捷的方法,与大家共享!更多微信公众平台开发知识,请查看我的专栏哦!有问题可直接加Q:724122005:)

==========2016年4月18日更新=============
以上自定义生成已不可用,
可在此 : http://www.xjabc.net/weixinjiekoukaifa/menu.php 生成。

微信自定义菜单

阅读数 862

没有更多推荐了,返回首页