微信公众平台开发教程(二)_微信自定义菜单的创建

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;
    }
				
时间: 2024-10-11 16:17:12

微信公众平台开发教程(二)_微信自定义菜单的创建的相关文章

微信公众平台开发教程(五)自定义菜单

应大家强烈要求,将自定义菜单功能课程提前. 一.概述: 如果只有输入框,可能太简单,感觉像命令行.自定义菜单,给我们提供了很大的灵活性,更符合用户的操作习惯.在一个小小的微信对话页面,可以实现更多的功能.菜单直观明了,不仅能提供事件响应,还支持URL跳转,如果需要的功能比较复杂,我们大可以使用URL跳转,跳转至我们的网页即可. 注意:自定义菜单,只有服务号才有此功能 如何注册,见第一章:微信公众账号开发教程(一) 基本原理及微信公众账号注册 效果如下, 接着我们详细介绍,如何实现自定义菜单? 二

微信公众平台开发(二) 微信公众平台示例代码分析

原文地址:http://www.cnblogs.com/mchina/archive/2013/06/07/3120592.html 一.摘要 微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下. 二.获取代码 微信官网:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip 三.分析代码 完整代码如下: <?php /** * wechat php test */ //define your

微信公众账号开发教程(四)自定义菜单

转自http://www.cnblogs.com/yank/p/3418194.html 一.概述: 如果只有输入框,可能太简单,感觉像命令行.自定义菜单,给我们提供了很大的灵活性,更符合用户的操作习惯.在一个小小的微信对话页面,可以实现更多的功能.菜单直观明了,不仅能提供事件响应,还支持URL跳转,如果需要的功能比较复杂,我们大可以使用URL跳转,跳转至我们的网页即可. 注意:自定义菜单,只有服务号才有此功能 如何注册,见第一章:微信公众账号开发教程(一) 基本原理及微信公众账号注册 效果如下

微信公众平台开发教程-关于申请微信公众号订阅号(服务号)的材料和流程

微信公众号服务号与订阅号的区别 订阅号: 1.每天可以发1次信息,每次可以发送8篇文章(信息展示在微信公众号折叠文件中) 2.不能申请微信支付功能 3.认证后才可以使用自定义菜单功能 4.订阅号适合:不需要支付功能,以为用户提供咨询信息的企业. 服务号: 1.每月可以发4次信息,每次可以发送8篇文章(信息直接展示微信聊天框中) 2.可以申请微信支付功能 3.无论是否认证都可使用自定义菜单功能 4.服务号适合:需要开通支付功能的企业. 微信公众号申请注册用户需提供以下材料: ①企业营业执照 ②对公

微信公众平台开发教程目录

1.微信公众平台开发教程(一) 微信公众账号注册流程 2.微信公众平台开发教程(二) 基本原理及消息接口 3.微信公众账号开发教程(三) 基础框架搭建 4.微信公众平台开发教程(四) 实例入门:机器人(附源码) 5.微信公众平台开发教程(五)自定义菜单 6.微信公众平台开发教程(六)获取个性二维码 7.微信公众平台开发教程(七)安全策略 8.微信公众平台开发教程(八)Session处理 9.微信公众平台开发教程(九)微信公众平台通用开发框架 10.微信公众平台开发教程(十) 订阅号与服务号的区别

微信公众平台开发教程(七)安全策略

微信公众平台开发教程(七)安全策略 尽管处理微信请求的服务器,处于微信服务器的后端,但是安全问题依然不可小觑. 大概总结以下几个方面,希望引起注意. 一.设置高复杂度的Token,尽量隐藏服务地址URL URL:即为处理微信请求的链接地址Token:用户身份凭证 申请成为开发者或者修改URL\Token时,微信会通过Get请求访问URL,验证签名,其中需要Token. 过程相当于一次握手,如果握手成功,可进行后续的通信. 成为开发者后,我们也可以进行修改 面临的危险:  1.如URL和Token

微信公众平台开发教程--方培工作室,PHP语言版本

准备工作 微信公众平台的注册 介绍如何注册一个微信公众账号. 入门教程 微信公众平台开发入门教程 内容:1.申请SAE作为服务器; 2.启用开发模式; 3.微信公众平台PHP SDK; 4.接收发送消息类型解析; 5.微信公众平台开发模式原理; 6.快速开发天气预报功能. 入门教程是下面所有教程的基础. 基础接口 微信公众平台开发(2) 天气预报 介绍了使用中国天气网气象数据,实现微信上的天气预报功能. 微信公众平台开发(3) 中英翻译 介绍了使用有道翻译的接口,在微信公众平台上,开发中英互译的

微信公众平台开发教程(二) 基本原理及消息接口

微信公众平台开发教程(二) 基本原理及消息接口 一.基本原理 在开始做之前,大家可能对这个很感兴趣,但是又比较茫然.是不是很复杂?很难学啊? 其实恰恰相反,很简单.为了打消大家的顾虑,先简单介绍了微信公众平台的基本原理. 微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这就里就是我们的具体实现). 服务处理完毕,然后挥发给微信服务器,微信服务器再将具体响应回复到终端. 通信协议为:HTTP 数据格式为:XML 具体的流程如下图

微信公众平台开发教程(六)获取个性二维码

微信公众平台开发教程(六)获取个性二维码 一.功能介绍 在进行推广时,我们可以告诉对方,我们的微信公众账号是什么,客户可以去搜索,然后关注.二维码给我们提供了极大的便捷,只要简单一扫描,即可关注. 如果已经关注过,立刻跳入对话画面.在我们进行推广时,不再是简陋的文字,可以是一个有个性的二维码,想必会很生动. 微信对二维码提供了很好的支持,而且还可以根据需要生成不同场景的二维码.下面我们将介绍如何获取和使用二维码. 注意:限服务号,且进行了微信认证,费用300 二.相关接口 为了满足用户渠道推广分

Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAuth2.0的运作模式: 从上图我们可以看到,整个过程进行了2次"握手",最终利用授权的AccessToken进行一系列的请求,相关的过程说明如下: A:由客户端向服务器发出验证请求,请求中一般会携带这些参数 ID标识,例如appId 验证后跳转到的URL(redirectUrl) 状态参数