微信开发怎么创建菜单_微信公众号开发创建菜单 - CSDN
  • 微信公众号创建菜单报错40016 今天帮连锁处理公众号链接的时候,我通过接口将连锁的公众号菜单链接返回回来,然后处理一个跳转链接,本来想着是手到擒来的事,没想到突然给我抛出一个错误,打了我一个措手不及,但是...

    微信公众号创建菜单报错40016

    今天帮连锁处理公众号链接的时候,我通过接口将连锁的公众号菜单链接返回回来,然后处理一个跳转链接,本来想着是手到擒来的事,没想到突然给我抛出一个错误,打了我一个措手不及,但是问题不大经过我仔细的对比文档终于找出了问题所在,下面把这些找错的过程记录一下,也算是为自己提个醒。

    首先贴上我从接口中取出的菜单链接

    在这里插入图片描述

    从线上接口中将链接取出之后,通过在线json解析格式化和过滤掉转移符号之后,进行菜单处理,处理完了就如上图所示,因为链接都是线上的还包含了一些appid的信息,所以我打码处理了一下,但是结构基本就是这样子的没有改变。

    问题

    通过上边的处理,我就直接通过微信提供的线上调试接口将菜单进行更新,万万没想到错误出现了。

    在这里插入图片描述

    错误码:40016;错误信息:button数量不合法
    我当时第一反应就是难道微信坏了?怎么可能不合法,这个菜单我是直接从线上取的,怎么可能不合法,不合法也是你们给我的呀!唉,没办法,牢骚归牢骚,问题还是得解决。

    问题解决

    说解决方案之前,我把我之前遇到这些问题的解决方案,给大家分享一下,像对接微信企业开发和钉钉这种平台遇到了错误,你一定要先去他们的官网查看对应的文档,看看是否有解决方案,一般可以节省很多时间,因为他们作为一个开放平台,对于一些常见的问题都会有解决方案;所以当我遇到这个问题时,首先就去微信公众号官网找到开发文档下的“自定义菜单创建接口”附上链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013。在这里插入图片描述

    这是微信给我们提供的demo测试数据,用他这个测试数据和我从接口中取出的数据进行比对,我发现我从接口中取出的json数据外层多了一个“menu”,这个menu是什么鬼,果断删除,然后重试,果然问题解决!

    展开全文
  • 微信开发创建自定义菜单报40054错误

    万次阅读 2015-09-28 16:10:26
    微信端自定义菜单开发

    今天做微信自定义菜单的时候报错位40054,如下图所示



    去了官方文档查询发现没有这个错误的返回码的说明,然后查找原因,看了一遍代码发现没有语法问题,但是问题还是有的,最后认真看了一下官方文档,发现url跟官方文档不同,官方的url是http://开头因为以前做过授权管理的时候填写过授权回调地址的时候也有类似问题,果不其然,加上http://以后一试,没有错误 。


    最后试了下,如果用#也是不可以的,必须要是网页链接,并以http://开头,如下所示:


    展开全文
  • 这时候就要程序员通过微信的接口手动去创建菜单微信创建菜单比较简单。 可以参照微信的官方文档点击打开链接 需要注意的是微信创建菜单有一定的缓存。这时候可以手动去查询创建的菜单。微信提供了调试的接口点击...

    前文说到接入了开发者模式后用户通过微信后台创建的菜单就会丢失。这时候就要程序员通过微信的接口手动去创建菜单。微信创建菜单比较简单。

    可以参照微信的官方文档点击打开链接

    需要注意的是微信创建菜单有一定的缓存。这时候可以手动去查询创建的菜单。微信提供了调试的接口点击打开链接

    在下面的接口调试中可以立即看到创建的菜单。特别需要注意的是菜单的url里面一定不能包含空格不然菜单会一直创建不成功,本人就是因为这个问题花了半天的时间。



    下面附上创建菜单的代码

    public static void  createMenu(String type) throws UnsupportedEncodingException{
    String url="";
    if("0".equals(type)){
    url =SMEURL;
    }else{
    url =SMEMPURL;
    }
    SmsClientAccessTool tool = SmsClientAccessTool.getInstance();
        Snippet.getAccessToken();//获取token
        String token = (String)SystemInit.weixinMap.get("weixintoken");
        System.out.println(token);
    List<Map<String, Object>> button1 = new ArrayList<Map<String, Object>>();
    List<Map<String, Object>> button2_1 = new ArrayList<Map<String, Object>>();
    List<Map<String, Object>> button2_2 = new ArrayList<Map<String, Object>>();
    List<Map<String, Object>> button2_3 = new ArrayList<Map<String, Object>>();
    Map<String,Object> map1 = new HashMap<String,Object>();
    map1.put("type","click");
    map1.put("name", "菜单一");
    map1.put("key", "1_PROMANAGE");
    Map<String,Object> map11 = new HashMap<String,Object>();
    map11.put("type","view");
    map11.put("name", "菜单11");
    map11.put("url", "http://url");
    Map<String,Object> map12 = new HashMap<String,Object>();
    map12.put("type","view");
    map12.put("name", "菜单12");
    map12.put("url", "http://url");
    button2_1.add(map11);
    button2_1.add(map12);
    map1.put("sub_button",button2_1);


    Map<String,Object> map2 = new HashMap<String,Object>();
    map2.put("type","click");
    map2.put("name", "菜单二");
    map2.put("key", "2_PROMANAGE");

    Map<String,Object> map21 = new HashMap<String,Object>();
    map21.put("type","view");
    map21.put("name", "菜单22");
    map21.put("url",url+"/service/activity_july.html?trackid=10023");


    map2.put("sub_button",button2_2);

    Map<String,Object> map3 = new HashMap<String,Object>();
    map3.put("type","click");
    map3.put("name", "菜单三");
    map3.put("key", "3_PROMANAGE");
    Map<String,Object> map31 = new HashMap<String,Object>();
    map31.put("type","view");
    map31.put("name", "菜单31");
    map31.put("url","http://111");
    map3.put("sub_button",button2_3);
    button1.add(map1);
    button1.add(map2);
    button1.add(map3);
    JSONObject json = new JSONObject();
    json.put("button", button1);
    System.out.println(json.toString());
    String url1 ="https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+token;
    String result=tool.doAccessHTTPPostJson(url1,json.toString() ,null);
    System.out.println(result);
    }
    创建后的截图


    展开全文
  • 首先要了解,在做微信开发项目的时候,都是需要进行一个token验证的,微信服务端去验证你传来的token,校验通过之后,才能给你开放一些借口以便于你进行一些详细的读写操作,所以我们在做开发之前都是需要先通过微信...

    首先要了解,在做微信开发项目的时候,都是需要进行一个token验证的,微信服务端去验证你传来的token,校验通过之后,才能给你开放一些借口以便于你进行一些详细的读写操作,所以我们在做开发之前都是需要先通过微信端的接口来获取到access_token来进行接下来的一些操作,具体看代码
    这是微信提供的获取access_token的地址
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
    这其中有三个参数:

    • grant_type——获取access_token填写client_credential
    • appid——第三方用户唯一凭证
    • secret——第三方用户唯一凭证密钥,即appsecret
      通过你传来的appid和secret来识别唯一的用户,就是判断你是否是开发者并且你的账号没有异常,校验通过以后
      正常情况下,微信会返回下述JSON数据包:{“access_token”:“ACCESS_TOKEN”,“expires_in”:7200}
      这里的access_token就是你获取到的token,expires_in就是这个token的过期时间2个小时,当我们获取到这个token以后就可以进行接下来的具体的操作了
      如果我们想要新建一个自定义菜单例如:

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

    这样模块的一个菜单,通过一些json拼接数组的操作就可以得到这样的数据

    //根据pid去数据库查询一级菜单
    List<WeChatMenu> menuList = wechatMapper.findById(0);
    JSONObject parentjson = new JSONObject();
    
    JSONArray parentarray = new JSONArray();
    
    //循环集合,拼接第一级菜单
    for (int i = 0; i < menuList.size() ; i++) {
        WeChatMenu weChatMenu = menuList.get(i);//获取第一级菜单
    
        JSONObject jsonObject = new JSONObject();
    
        JSONArray jsonArray = new JSONArray();
        //判断同级菜单中是否存在type为null的情况
        if(!StringUtils.isBlank(weChatMenu.getM_type())){//type不为空,添加type类型,否则不添加
            jsonObject.put("type",weChatMenu.getM_type());
            jsonObject.put("name",weChatMenu.getM_name());
            //根据获取到的type类型判断增加的是key还是url
            if(weChatMenu.getM_type().equals("click")){
                jsonObject.put("key",weChatMenu.getM_key());
            }
            if(weChatMenu.getM_type().equals("view")){
                jsonObject.put("url",weChatMenu.getM_url());
            }
        }else{
            jsonObject.put("name",weChatMenu.getM_name());
            List<WeChatMenu> list = wechatMapper.findById(weChatMenu.getId());//根据一级菜单的id查询对应的子菜单
            for (int j = 0; j < list.size(); j++) {
                WeChatMenu menu = list.get(j);
                JSONObject childrenjson = new JSONObject();
                childrenjson.put("type",menu.getM_type());
                childrenjson.put("name",menu.getM_name());
    
                if(menu.getM_type().equals("click")){
                    childrenjson.put("key",menu.getM_key());
                }
    
                if(menu.getM_type().equals("view")){
                    childrenjson.put("url",menu.getM_url());
                }
                jsonArray.add(childrenjson);
            }
            jsonObject.put("sub_button",jsonArray);
        }
    
        parentarray.add(jsonObject);
    }
    //拼接一级菜单
    parentjson.put("button", parentarray);//{"button":[]}
    

    这是我的数据库的表结构,展示一下
    在这里插入图片描述
    这是嵌套循环的方式获取到的数据的代码,也可以通过递归的方法来获取,具体看个人喜好,在这里关于菜单的type类型我只判断了click和view,因为开发中基本上用的最多的就是这两种,如果还需要其他的那么久自行添加。拼接完这些数据之后,就需要通过调用微信提供的接口把我们的数据和获取到的access_token传过去,等微信端校验完成之后就可以看到新建好的菜单了。
    那么怎么在项目中通过java代码来实现操作呢,就需要用到httpclient post请求方式

    public static String postMethod(String url,String param){
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);
        String result = null;
        try {
            StringEntity entity = new StringEntity(param,Charset.forName("UTF-8"));
            post.setEntity(entity);
            HttpResponse execute = httpClient.execute(post);
            result = EntityUtils.toString(execute.getEntity());//将返回来的实体对象转换成字符串
    
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
    

    这里我自定义了一个工具类,只需要把拼接好的数据放入进来就可以了

    //将拼接好的字符串和地址通过httputils发送请求
    String result = HttpClientUtils.postMethod(change_menulist_url, parentjson.toString());
    

    如果校验成功并且拼接的数据没有错的话就会返回来{“errcode”:0,“errmsg”:“ok”}这样的result

    这是关于返回来的状态码的详细解释

    展开全文
  • java版微信公众号开发之自定义菜单创建

    万次阅读 多人点赞 2016-05-11 19:33:49
    java版微信公众号开发之自定义菜单创建
  • 在上篇文章中完成了菜单、按钮bean的封装,现在来实现微信公众号菜单创建 向wx_cfg配置表中插入若干菜单记录 INSERT INTO `wx_cfg` (`id`, `type`, `name`, `value`, `parent_id`, `sort`, `platform`, `wx...
  • 微信企业号创建菜单 <?php define('CorpID', "wx82e2c31215d9a5a7"); define('CorpSecret', ""); //当前管理组 设置->功能设置->权限管理->系统管理组->深圳管理(新建的管理组)->Secret ...
  • java版微信公众号开发之自定义菜单创建
  • 10万+IT人都在关注,史上最全面的微信开发实战教程:包含公众号,小程序,微信支付等开发案例 欢迎关注笔者个人博客:http://blogs.chenyunkeji.com/ 首先,直接上图,看效果,如下,有三个根菜单,每个菜单上有...
  • 在上篇文章实现微信扫码获取带指定参数时,微信公众号后台启用了服务器配置,导致之前设置好的微信自定义菜单失效。 开启了服务器配置,就无法用之前的方式在微信公众平台配置自定义菜单 ...2.组织创建菜单内容。微
  • 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现,所以对于刚开始接触的人来说可能存在一定的疑惑,这里我说下平时我们在开发...
  • 以下是微信公众平台对 添加自定义菜单 的文档说明:1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。 3、创建...
  • http://mp.weixin.qq.com/debug 用这个调式页面查询出菜单后再按原内容创建回去无法打开公众号页面了,请问是什么原因,这个页面可能创建菜单吗?
  • 微信企业号开发菜单创建和触发

    千次阅读 2016-02-26 14:21:40
    微信菜单创建和响应
  • 1 方式一:不写代码,使用微信公众平台接口调试工具来创建菜单{ "button": [ { "name": "百度", "type": "view", "url": "...
  • php实现微信公众号创建自定义菜单

    千次阅读 2019-06-10 18:42:10
    创建自定义菜单,实现菜单事件。 首先获取Access_Token 接口: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 然后配置菜单的事件,caidan.php <...
  • 总结需求当微信公众号设置为开发者模式,想要自己创建和开发菜单的话,就需要自己调用微信创建菜单的接口来创建菜单了。创建菜单之后,如果需要迫切的看到效果,有时候需要取消关注-从新关注才能够看到的哦(缓存问题...
  • 微信公众号自定义菜单创建及响应 一配置相关工具类: 1.证书信任管理器(用于https请求) package com.jcxx.saas.wxapi.CustomMenuUtil; import javax.net.ssl.X509TrustManager; import java.security.cert....
  • 一:建立以下实体类 //点击菜单 public class ClickButton extends Button{ private String key; public String getKey() { return key; } ... public void setKey(String key) { ...public class Bu...
  • 3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消...
1 2 3 4 5 ... 20
收藏数 15,520
精华内容 6,208
关键字:

微信开发怎么创建菜单