zoukankan      html  css  js  c++  java
  • 微信公众平台开发教程(二)_微信自定义菜单的创建

    3.微信自定义菜单的创建

    自定义菜单接口可实现多种类型按钮,这里主要介绍如下两种:

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

    接口调用请求说明

    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"
                }]
           }]
     }
    具体代码实现,这里主要贴出拼装上述代码节点的代码,发送请求方式可以看看我之前的博客,通过HttpsURLConnection发送post请求。
    /**
         * 组装自定义菜单数据
         * @date 2016-4-9 下午04:25:55
         * @param account_id
         * @return
         */
        private Map queryChannel(String account_id){
            //查询公众号配置
            Map account = siteConfigManageService.queryWxAccount(account_id);
            List<Map<String, Object>> channels//获取本地配置
            List<Map> menus = new ArrayList<Map>();
            for (Map channel : channels) {
                String channel_id = (String) channel.get("id");
                String parent_id = (String) channel.get("parent_id");
                String channel_type = (String) channel.get("channel_type");
                String channelCode = (String) channel.get("channel_code");
                if (StringUtils.isNotBlank(parent_id) && parent_id.equals("0")){
                    List<Map<String, Object>> childrens = getChannelChildren(channel_id, channels);
                    Map menu = new HashMap();
                    if(childrens.size()>0){
                        List childMenus = getMenu(childrens, account);
                        menu.put("name", channel.get("channel_name"));
                        menu.put("sub_button", childMenus);
                    }else{
                        int channelType = Integer.valueOf(channel_type);
                        switch (channelType){
                            case 1:
                                menu.put("name", channel.get("channel_name"));
                                menu.put("type", WxConsts.BUTTON_VIEW);
                                menu.put("url", parseAuthUrl(channel,account));
                                break;
                            case 2:
                                menu.put("name", channel.get("channel_name"));
                                menu.put("type", WxConsts.BUTTON_CLICK);
                                menu.put("key", channelCode);
                        }
                    }
                    menus.add(menu);
                }
            }
            
            Map button = new HashMap();
            button.put("button", menus);
            return button;
        }
        
        //拼装子节点
        private List getChannelChildren(String channel_id, List<Map<String, Object>> channels){
            List children = new ArrayList();
            for(Map channel:channels){
                String parent_id = (String) channel.get("parent_id");
                if(channel_id.equals(parent_id)){
                    children.add(channel);
                }
            }
            return children;  
        }
        
        
        private List getMenu(List<Map<String, Object>> channels, Map account){
            List menus = new ArrayList();
            for(Map channel:channels){
                Map menu = new HashMap();
                String channel_type = (String) channel.get("channel_type");
                String channelCode = (String) channel.get("channel_code");
                int channelType = Integer.valueOf(channel_type);
                switch (channelType){
                    case 1:
                        menu.put("name", channel.get("channel_name"));
                        menu.put("type", WxConsts.BUTTON_VIEW);
                        menu.put("url", parseAuthUrl(channel, account));
                        break;
                    case 2:
                        menu.put("name", channel.get("channel_name"));
                        menu.put("type", WxConsts.BUTTON_CLICK);
                        menu.put("key", channelCode);
                }
                menus.add(menu);
            }
            return menus;  
        }



  • 相关阅读:
    poj3905 2sat!
    poj3648,2-sat求解
    poj2723 2sat判断解+二分
    hdu3622 2-sat问题,二分+判断有无解即可。
    poj2767,单向连通图判定,缩点+重新建图+新图DFS
    poj2186 求有向图G中所有点都能到达的点的数量
    poj2553 有向图缩点,强连通分量。
    poj 1236+hdu2767 有向图 缩点+看度数(tarjan)
    poj3694+hdu2460 求桥+缩点+LCA/tarjan
    dfs + 最小公倍数 Codeforces Round #383 (Div. 2)
  • 原文地址:https://www.cnblogs.com/Onedayzk/p/7794346.html
Copyright © 2011-2022 走看看