订阅博客
收藏博客
微博分享
QQ空间分享

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

频道:技术分享 标签:菜鸟程序员微信平台开发 时间:2016年03月15日 浏览:3575次 评论:13条

自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现,所以对于刚开始接触的人来说可能存在一定的疑惑,这里我说下平时我们在开发模式下常用的两种自定义菜单的实现方式:①不用写实现代码,直接用网页测试工具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字符串可以参照文档中的案例做出修改得到,我这里给出的一个案例如下:

{
    "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如下:

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如下:

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格式,并调用生成自定义菜单的接口发送到微信服务器,简单代码如下:

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://cuiyongzhi.com/?id=44  ),最终运行返回结果ok即可,如下:

4.png

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


文章评论

  • 访客
    2016-05-25 23:21:31 回复该评论
    你好,博主,我在自定义菜单中获取token定时为30秒,获取access_token值时调用GlobalConstants.getInterfaceUrl("access_token")得到的值为null,GlobalConstants.interfaceUrlProperties.get("access_token")和GlobalConstants.interfaceUrlProperties.getProperties("access_token")得到的值都是空,能帮忙解答下吗?谢谢!
    • 访客
      2016-05-25 23:24:26 回复该评论
      但是在GlobalConstants类中System.out.println(interfaceUrlProperties.get("access_token"))却能输出token
      • cuiyongzhi
        2016-05-26 14:48:20 回复该评论
        你有没有put进GlobalConstants中呢?
        • 访客
          2016-05-26 16:41:46 回复该评论
          put进去了,而且之后syso(get(token))能输出获取到的token,但就是自定义菜单main方法中get(token)报空指针异常
    • cuiyongzhi
      2016-05-26 17:01:38 回复该评论
      你这样在main方法里肯定是拿不到的额,你如果想在main方法里调用需要你自己单独在main获取token的
  • 贾国庆
    2017-03-26 21:14:17 回复该评论
    经测试,tomcat运行的时候,main函数无法以Java Application的方式运行,故无法以GlobalConstants.getInterfaceUrl("access_token")的方式获得access_token。为达到目的,我使用下面的笨方法,关掉tomcat,手动获取(或者复制现有的)access_token,在不超过access_token时限的情况下,用写死的方法自定义菜单
  • 贾国庆
    2017-03-26 21:15:47 回复该评论
    经测试,tomcat运行的时候,main函数无法以Java Application的方式运行,故无法以GlobalConstants.getInterfaceUrl("access_token")的方式获得access_token。为达到目的,我使用下面的笨方法,关掉tomcat,手动获取(或者复制现有的)access_token,在不超过access_token时限的情况下,用写死的方法以Java Application的方式运行main函数,来达到自定义菜单的效果
  • 访客
    2017-09-28 09:55:41 回复该评论
    博主您好,想问一下这个jre包怎么来?import com.cuiyongzhi.wechat.util.HttpUtils;
    • 访客
      2017-09-28 10:10:57 回复该评论
      博主您好,我最后的代码有错, try{
      String rs=HttpUtils.sendPostBuffer(url,menujson.toJSONString());
      System.out.println(rs);
      }catch (Exception e){
      System.out.println("请求错误!");
      }
      sendPostBuffer 这个代码报错,请问怎么解决 ?谢谢
  • 访客
    2017-09-28 10:44:28 回复该评论
    博主您好,可以说一下这个方法怎么写吗sendPostBuffer。谢谢

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信