当前位置: 首页 > 编程日记 > 正文

Java微信公众平台开发(十)--微信自定义菜单的创建实现

转自:http://www.cuiyongzhi.com/post/48.html

自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现,所以对于刚开始接触的人来说可能存在一定的疑惑,这里我说下平时我们在开发模式下常用的两种自定义菜单的实现方式:①不用写实现代码,直接用网页测试工具Post json字符串生成菜单;②就是在我们的开发中用代码实现菜单生成!(参考文档:http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html  )在自定义菜单中菜单的类型分为两种,一种为view的视图菜单,点击之后直接跳转到url页面;还有一种是click类型的点击型,后端通过点击事件类型给与不同的相应;后面新增了各种特色功能的菜单其本质都还是Click类型的菜单,所以生成的规则都是一样的,其生成菜单的方式都是向微信服务器post json字符串生成菜单,下面讲述菜单生成的方法和规则!

(一)使用网页调试工具生成菜单

我们通过连接(https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95&form=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E5%88%9B%E5%BB%BA%E6%8E%A5%E5%8F%A3%20/menu/create  )进入到网页调试工具,如下图:

1.png

在这里我们生成菜单的时候只需要我们账号的有效token和json字符串即可,这里的json字符串可以参照文档中的案例做出修改得到,我这里给出的一个案例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
    "button": [
        {
            "name": "博客", 
            "type": "view", 
            "url": "http://www.cuiyongzhi.com"
        }, 
        {
            "name": "菜单", 
            "sub_button": [
                {
                    "key": "text", 
                    "name": "回复图文", 
                    "type": "click"
                }, 
                {
                    "name": "博客", 
                    "type": "view", 
                    "url": "http://www.cuiyongzhi.com"
                }
            ]
        }, 
        {
            "key": "text", 
            "name": "回复图文", 
            "type": "click"
        }
    ]
}

我们填入响应的token,点击检查问题如果返回结果Ok就可以了,如下:

3.png

到这里我们采用web测试工具生成菜单的方式就完成了,下面接着介绍用代码生成菜单!

(二)采用代码实现菜单的生成

前面我们有说道在菜单中有view和click两种类型的事件,这里我们首先在代码中建立两种类型对应的java实体,view类型建立实体ViewButton.java如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.cuiyongzhi.wechat.menu;
/**
 * ClassName: ViewButton
 * @Description: 视图型菜单事件
 * @author dapengniao
 * @date 2016年3月14日 下午5:31:38
 */
public class ViewButton {
    private String type;
    private String name;
    private String url;
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}

同样的建立click的实体ClickButton.java如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.cuiyongzhi.wechat.menu;
/**
 * ClassName: ClickButton
 * @Description: 点击型菜单事件
 * @author dapengniao
 * @date 2016年3月14日 下午5:31:50
 */
public class ClickButton {
    private String type;
    private String name;
    private String key;
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
}

这里创建两个实体也是为了方便我们在自定义菜单中对json的封装,在这里我用代码的形式封装了上面给出的同样的json格式,并调用生成自定义菜单的接口发送到微信服务器,简单代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.cuiyongzhi.wechat.menu;
import com.alibaba.fastjson.JSONObject;
import com.cuiyongzhi.wechat.util.HttpUtils;
import net.sf.json.JSONArray;
public class MenuMain {
    public static void main(String[] args) {
    
        ClickButton cbt=new ClickButton();
        cbt.setKey("image");
        cbt.setName("回复图片");
        cbt.setType("click");
        
        
        ViewButton vbt=new ViewButton();
        vbt.setUrl("http://www.cuiyongzhi.com");
        vbt.setName("博客");
        vbt.setType("view");
        
        JSONArray sub_button=new JSONArray();
        sub_button.add(cbt);
        sub_button.add(vbt);
        
        
        JSONObject buttonOne=new JSONObject();
        buttonOne.put("name""菜单");
        buttonOne.put("sub_button", sub_button);
        
        JSONArray button=new JSONArray();
        button.add(vbt);
        button.add(buttonOne);
        button.add(cbt);
        
        JSONObject menujson=new JSONObject();
        menujson.put("button", button);
        System.out.println(menujson);
        //这里为请求接口的url   +号后面的是token,这里就不做过多对token获取的方法解释
        String url="https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+"upeDW-2pWrHgLx3fGqgsvAvf-HkQBA--5uHOo9OW16uNdL9zNPnnuIN01UDFXh_5d-QdcnBxux9tXigFwm1z0SInbdkXEKa1pMhTqaZVxK7sCPj7421YQGI0v3evwiwiWALjAHASWH";
        
        try{
            String rs=HttpUtils.sendPostBuffer(url, menujson.toJSONString());
            System.out.println(rs);
        }catch(Exception e){
            System.out.println("请求错误!");
        }
    
    }
}

上面代码的基本流程就是调用view和click两个实体封装json字符串menujson,最后调用发送方法将json发送给腾讯服务器,但是这里需要用到账号生成的token,我这里是直接写死的(token的获取方式可以参见http://www.cuiyongzhi.com/?id=44  ),最终运行返回结果ok即可,如下:

4.png

自定义菜单的功能实现基本就是这些,下一篇将讲述【微信公众平台(map.weixin.qq.com)/开放平台(open.weixin.qq.com)/商户平台(pay.weixin.qq.com)之间的关联关系】希望可以对你给出帮助,感谢你的翻阅,如有疑问可以留言讨论!

转载于:https://www.cnblogs.com/sharpest/p/10247822.html

相关文章:

【经典算法】快速排序

与归并排序一样,快速排序使用也使用了分治的思想。下面是对一个典型的子数组A[p,...,r]进行快速排序的三步分治过程: 分解:数组A[p,...,r]被划分成两个(可能为空)子数组A[P,...,q-1]和A[q1,...,r],使得A[p,…

.Net 中如何测试静态方法

大部分Mokc框架是不支持mock静态方法的,那我们如何测试静态方法呢? 下面这个类包含了一个静态方法: public class MyHelper {public static string GetHelp(){return "This is help";} } 这个类调用了上面的Helper类中的静态方法 p…

计组--习题--总线

计算机使用总线结构的主要优点是便于实现积木化,缺点是______ A、 地址信息、数据信息和控制信息不能同时出现 B、 地址信息与数据信息不能同时出现 C、 两种信息源的代码在总线中不能同时传送 这里是引用 总线中地址线的作用是_______ A、 只用于选择存储器单元 B…

dispatch_queue_create(com.biostime.xxx, DISPATCH_QUEUE_SERIAL)的陷阱

代码 for(int i 0;i<10;i) { NSLog("i%d",i); dispatch_queue_t mySerialQueue dispatch_queue_create("com.biostime.xxx", DISPATCH_QUEUE_SERIAL); __block int d i; dispatch_async(mySerialQueue, ^{ …

详解Oracle安装与配置.

标签&#xff1a;Oracle 安装 配置 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://enetq.blog.51cto.com/479739/316532 一.Oracle 简介. Oracle oracle是殷墟&#xff08;Yin Xu&#…

今天起,在广东可以用百度App一键报警!

今天&#xff0c;百度联合广东省公安厅上线了一款智能小程序&#xff1a;只要打开你手机里的百度 App 就能用了 &#xff01;在110实际接警的过程中&#xff0c;经常会遇到电话并不能很好地表达发生事件的地点等信息的情况&#xff0c;会耽误救援时间。因此&#xff0c;“广东1…

Spring 注解

1. Configuration Configuration用于定义配置类&#xff0c;可替换xml配置文件&#xff0c;被注解的类内部包含有一个或多个被Bean注解的方法&#xff0c;这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描&#xff0c;并用…

Junit的安装与使用

一、简介&#xff1a; JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立&#xff0c;逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。Junit测试是程…

安装 ssh 的公开密匙到 iPhone 上

1). 在Mac的终端上产生密匙 ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/xxxx/.ssh/id_rsa): Created directory /home/xxxx/.ssh. Enter passphrase (empty for no passphrase): xxx Enter same passphrase again…

浏览器关闭事件处理

//有确认退出var msg_unload"您的文章内容还没有进行保存&#xff01;";var unloadConfirm {};unloadConfirm.SetConfirmMsg function(confirmMsg){ window.onBeforeUnload function(event) { event event || window.event; event.returnval…

spring注解--@Bean

Configuration public class KnightConfig {Beanpublic Knight knight(){return new BraveKnight(quest () );}}spring的Bean注解用于告诉方法&#xff0c;产生一个Bean对象&#xff0c;然后把这个Bean对象交给spring管理。注意&#xff1a;产生这个Bean对象的方法Spring只会调…

如何用 Windows Live Writer 和 Word 2013 分别发表博客到Cnblog 和CSDN

ps CSDN 老是505错误&#xff0c;放弃了 为什么会写这篇 最近写博客在 Cnblog 上面写博客&#xff0c; 发现图片不能复制了直接粘贴上&#xff0c;这对于把博客当随手笔记的人来说无疑非常痛苦。求助于博客园&#xff0c;他们让我用 Windows Live Writer 试试。我查了下大家推荐…

JavaScript 事件冒泡简介及应用(转)

http://www.jb51.net/article/21801.htm 一、什么是事件冒泡在一个对象上触发某类事件&#xff08;比如单击onclick事件&#xff09;&#xff0c;如果此对象定义了此事件的处理程序&#xff0c;那么此事件就会调用这个处理程序&#xff0c;如果没有定义此事件处理程序或者事件返…

不改文件名的情况下上传突破

方法不错&#xff0c;首先就是不强制改上传文件名。还有就是上传目录没有执行的权限。 然后用这方法貌似就可以上传到上级可写目录了。 比如抓这是抓的上传数据包: POST /upload/upfile.asp HTTP/1.1Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image…

static interface method calls are not supported at language level 1.6

报错解决&#xff08;导入项目时&#xff09; 点击那个红色的小灯泡 下面的那行&#xff1a; set language to … 等待 即可

Objetive-C +load方法研究

load方法的执行时机Objetive-C 的runtime会在一个类的所有方法加载到内存中时调用这个类的load() 方法&#xff0c;因为每个类的方法只是加载一次&#xff0c;所以每个load&#xff08;&#xff09;方法只调用一次。加载一个类的方法会在一个进程启动开始的时候&#xff0c;这个…

HDU3434数学题

纯粹的数学题&#xff0c;题目的意思是给你一组序列&#xff0c;让你能同时改变它的一个子序列&#xff0c;让其子序列的值增加1&#xff0c;或者减少1. 思路的话&#xff0c;就是找其中的数学规律&#xff0c;给你的序列例如是&#xff1a;3,5,1,4,7。先求出其序列的正差和5-3…

python的基本知识点

一.数据类型 1.整数2.浮点数3.字符串4.布尔值:True/False5.空值:None 二.变量 变量名必须是大小写英文、数字和_的组合&#xff0c;且不能以数字开头 三.常量 全部大写的变量名表示常量,python没有一种机制保证常量不能被修改.PI 3.14156 四.特殊的地板除 // // 除法只取结果的…

上传代码到git上的分支(协同开发)

任意位置右键单击 git bash,输入命令如下&#xff1a; git config --global user.name "用户名" &#xff08;用户名就是gitlab上的用户名&#xff0c;我的是名字拼音&#xff09;git config --global user.email "邮箱" &#xff08;注册gitlab时的邮箱&…

Android网络编程系列 一 Socket抽象层

在《Android网络编程》系列文章中&#xff0c;前面已经将Java的通信底层大致的描述了&#xff0c;在我们了解了TCP/IP通信族架构及其原理&#xff0c;接下来我们就开始来了解基于tcp/ip协议层的Socket抽象层。本篇文章将会让我们清楚的了解和学会使用Socket。什么是Socket&…

HDFS的shell和API操作

1. HDFS的shell操作 hadoop version //查看版本 hadoop fs -appendToFile src(Linux中的文件) dest(hdfs目录下的文件) //追加 hadoop fs -cat file(hdfs目录下的文件) //查看文件内容 Hadoop fs -tail file(hdfs目录下的文件) //查看文件末尾1kb的数据…

C#中的问号用法

在看一些国外牛人写的C#代码时&#xff0c;总是看到会有Boolean?、DateTime?这样的类型&#xff0c;以为是一些新的类型&#xff08;该类型变量有一些新的属性和方法&#xff09;&#xff0c;后来经过查找相关的资料&#xff0c;发现原来另有微妙。以下是MSDN中对这个问号的解…

L1-006 连续因子

题目&#xff1a; 一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3567&#xff0c;其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N&#xff0c;要求编写程序求出最长连续因子的个数&#xff0c;并输出最小的连续因子序列。 输入格式&#xff1a; 输…

Python Data Structures

1. list 2. stack 3. queue 4. tuple 5. sequence 6. set 7. dict #-*- coding: utf-8 -*-# 添加中文注释Created on 2011-4-29test for python data structureauthor: xuqiang###################list##################print("test for list");a [66.25, 333, 333…

【转】 ubuntu12.04更新源

原文网址&#xff1a;http://blog.chinaunix.net/uid-26404477-id-3382633.html 摘 要&#xff1a;本文列出ubuntu 12.04 LTS更新源列表&#xff0c;内容为网友整理&#xff0c;此处为转载。因为我还在重庆读书&#xff0c;所以在设置自己的源列表的时候选择了电子科技大学的更…

Ubuntu 上创建常用磁盘阵列

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出&#xff0c;最初是为了组合小的廉价磁盘来代替大的昂贵磁盘&#xff0c;同时希望磁盘失效时不会使对数据的访问受损 失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价…

L1-009 N个数求和

题目 本题的要求很简单&#xff0c;就是求N个数字的和。麻烦的是&#xff0c;这些数字是以有理数分子/分母的形式给出的&#xff0c;你输出的和也必须是有理数的形式。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤100&#xff09;。随后一行按格式a1/b1 a2/…

我的理解:box-sizing

下面是我在博客园找到的&#xff0c;和我遇见的情况很相似&#xff0c;所以摘抄下来&#xff0c;原文见:http://www.cnblogs.com/charling/p/3635031.html box-sizing语法&#xff1a; box-sizing &#xff1a; content-box || border-box || inherit 参数取值&#xff1a; con…

世界最大规模3D打印混凝土步行桥在上海 落成启用

1月12日&#xff0c;世界最大规模3D打印混凝土步行桥在沪落成启用&#xff0c;人们站在桥体上欢庆该新兴建筑体的诞生。 中新网上海1月13日电 (记者 于俊)一座体态优雅、形似飘带的水泥桥12日横跨于上海宝山智慧湾的小河之上&#xff0c;宣告全球最大规模混凝土3D打印步行桥落成…

idea打开web项目之后一直闪烁

解决办法&#xff1a; 点击&#xff0c; 选择第一个&#xff08;清除缓存并重启&#xff09; 这时Idea会自动重新启动&#xff0c;之后就没有闪烁的状态了。 一开始我选择是第二个&#xff0c;清除无效的缓存&#xff0c;但是并没有起作用。