一、定义几个实体类

public class AccessToken {//这里定义一个AccessToken的实体类,用来保存获取到的accesstokenprivate String token;//获得到的tokenprivate int expireIn;//过期时间public String getToken() {return token;}public void setToken(String token) {this.token = token;}public int getExpireIn() {return expireIn;}public void setExpireIn(int expireIn) {this.expireIn = expireIn;}}
public class Button {//所有button的父类,定义了统一的名称private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}
public class CommonButton extends Button {//最底层的button,用来触发点击事件private String type;//类型private String key;//key值,传入后台后就是根据key值来判断是哪个button被点击了public String getType() {return type;}public void setType(String type) {this.type = type;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}}
public class ViewButton extends Button{//最底层的button,用来跳转到指定的页面private String type;//类型private String url;//urlpublic String getType() {return type;}public void setType(String type) {this.type = type;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}}
public class ComplexButton extends Button {//一级菜单,这个菜单下面包含很多的底层buttonprivate Button[] sub_button;public Button[] getSub_button() {return sub_button;}public void setSub_button(Button[] sub_button) {this.sub_button = sub_button;}}

二、WeiXinUtil工具类中使用到的两个相关方法

 public static AccessToken getAccessToken(String appid, String appsecret) {//获取accesstokenAccessToken accessToken = null;/*           */String id = "sys_accesstoken";LocalRedisManager manager = new LocalRedisManager();manager.setHost("127.0.0.1");manager.setPort(6379);manager.init();/*这里的是初始化redis的代码,我使用redis来缓存accesstoken的,过期以后才再取的*/if (null == manager.get(id.getBytes())) {//没有找到缓存的accesstokenString requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {accessToken = new AccessToken();accessToken.setToken(jsonObject.getString("access_token"));accessToken.setExpireIn(jsonObject.getInt("expires_in"));}/*不用redis这里可以忽略*/manager.set(id.getBytes(),SerializeUtils.serialize(accessToken.getToken()),accessToken.getExpireIn());} else {//这里是从redis里取没有过期的accesstoken,你可以改成你的方式accessToken = new AccessToken();accessToken.setToken((String) SerializeUtils.deserialize(manager.get(id.getBytes())));accessToken.setExpireIn(manager.getExpire());}return accessToken;}
 public static AccessToken getAccessToken(String appid, String appsecret) {//获取accesstokenAccessToken accessToken = null;/*           */String id = "sys_accesstoken";LocalRedisManager manager = new LocalRedisManager();manager.setHost("127.0.0.1");manager.setPort(6379);manager.init();/*这里的是初始化redis的代码,我使用redis来缓存accesstoken的,过期以后才再取的*/if (null == manager.get(id.getBytes())) {//没有找到缓存的accesstokenString requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {accessToken = new AccessToken();accessToken.setToken(jsonObject.getString("access_token"));accessToken.setExpireIn(jsonObject.getInt("expires_in"));}/*不用redis这里可以忽略*/manager.set(id.getBytes(),SerializeUtils.serialize(accessToken.getToken()),accessToken.getExpireIn());} else {//这里是从redis里取没有过期的accesstoken,你可以改成你的方式accessToken = new AccessToken();accessToken.setToken((String) SerializeUtils.deserialize(manager.get(id.getBytes())));accessToken.setExpireIn(manager.getExpire());}return accessToken;}
 public static JSONObject httpsRequest(String requestUrl,String requestMehod, net.sf.json.JSONObject jsonMenu) {if ("GET".equalsIgnoreCase(requestMehod)) {try {return doHttpcilentGet(requestUrl);} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;}} else {JSONObject jsonObject = null;StringBuffer buffer = new StringBuffer();TrustManager[] tm = { new MyX509TrustManager() };try {SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpsUrlConn = (HttpsURLConnection) url.openConnection();httpsUrlConn.setSSLSocketFactory(ssf);httpsUrlConn.setDoOutput(true);httpsUrlConn.setDoInput(true);httpsUrlConn.setUseCaches(false);httpsUrlConn.setConnectTimeout(0);httpsUrlConn.setReadTimeout(0);System.out.println(requestUrl);httpsUrlConn.setRequestMethod(requestMehod);if (null != jsonMenu) {OutputStream outputStream = httpsUrlConn.getOutputStream();outputStream.write(jsonMenu.toString().getBytes("UTF-8"));outputStream.close();}InputStream inputStream = httpsUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;httpsUrlConn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();} catch (KeyManagementException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return jsonObject;}}

三、主类,用来生成菜单

public class MenuManager {public static void main(String[] args) {String appId = "wxxxxxxxxxxxxx";String appSecret = "xxxxxxxxxxxxxxxxxxxxxxxx";AccessToken at = WeiXinUtil.getAccessToken(appId, appSecret);System.out.println(at.getToken()+at.getExpireIn());if (null != at) {int result = WeiXinUtil.createMenu(getMenu(), at.getToken());System.out.println(result);}}private static Menu getMenu() {ViewButton btn11 = new ViewButton();btn11.setName("生活社区");btn11.setType("view");btn11.setUrl("http://www.baidu.com");ComplexButton mb1 = new ComplexButton();mb1.setName("m111");mb1.setSub_button(new CommonButton[] { btn11 });CommonButton btn21 = new CommonButton();btn11.setName("2");btn11.setKey("2");btn11.setType("click");ComplexButton mb2 = new ComplexButton();mb1.setName("m222");mb1.setSub_button(new CommonButton[] { btn21 });CommonButton btn31 = new CommonButton();btn11.setName("3");btn11.setKey("3");btn11.setType("click");ComplexButton mb3 = new ComplexButton();mb1.setName("m333");mb1.setSub_button(new CommonButton[] { btn31 });Menu menu = new Menu();menu.setButton(new Button[] { mb1, mb2, mb3 });return menu;}
}

额,最后是用到的几个url,忘写了

 public static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";public static String munu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";public static String user_access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";public static String uni_pay_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";public static String jpapi_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=TOKEN&type=jsapi";

微信开发--自定义菜单相关推荐

  1. 【wechat】微信开发——自定义菜单

    1.无后台管理的自定义菜单 ①根据appId和appSecret获取acessToken a.向服务器发送请求 httpRequst(url,method,outPutStr)  返回jsonObje ...

  2. 微信开发 -- 自定义菜单

    目前微信服务号自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以"..."代替.请注意,创建自定义菜单 ...

  3. 微信开发自定义菜单获取OpenID

    OpenID: 每个微信用户对于每个公众号,有一个唯一的OpenID.对于其它公众号,OpenID是不同的 用途: 通过 OpenID,能访问到用户的基本信息 跟后台应用(比如商品销售)配合,可以管理 ...

  4. java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

    微信公众号开发 自定义菜单 请先读完本文再进行配置开发 请先前往微信平台开发者文档阅读"网页授权获取用户基本信息"的接口说明 在微信公众账号开发中,往往有定义一个菜单,然后用户点击 ...

  5. 微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

    微信开发公众平台自定义菜单需要花钱认证才能实现,不想花钱只能玩测试账号了,不过这并不影响开发.我的开发都是基于柳峰老师的微信公众平台应用开发做的. 只要我们使用公众平台测试账号就可以开发自定义菜单了, ...

  6. 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)

    之前写过一篇微信公众号开发–自定义菜单跳转页面并获取用户信息 由于当时是刚学习微信公众号开发当时的思路虽然可行,不过不是最好的,最近也用到了需要获取用户信息的地方,再次整理一下. 流程 注意点 ### ...

  7. 公众号如何跳转到页面php,图文详解微信公众号开发自定义菜单跳转页面并获取用户信息实例...

    这篇文章主要介绍了微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解的相关资料,需要的朋友可以参考下 微信公众号开发 自定义菜单 请先读完本文再进行配置开发 请先前往微信平台开发者文档阅读&qu ...

  8. 微信企业号开发:自定义菜单

    开发微信企业号可以通过程序自定义菜单,只需要调用相关的接口就可以实现. 其实这个菜单也就是微信底部的菜单,目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字,二 ...

  9. 微信公众号开发---自定义菜单的创建及菜单事件响应(java)

    微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号: 2)服务号可以申请自定义菜单: 3 ...

最新文章

  1. easyui panel 默认折叠 右上角按钮
  2. C语言复杂的学生成绩管理系统,哭诉、拜求C语言学生成绩管理系统
  3. c# WebApi之接口返回类型详解
  4. 【计算机网络】—— 差错控制(检错编码)
  5. python数字转拼音输出_Python 将中文转拼音
  6. java增删改查代码_低代码开发平台
  7. ubuntu安装cuda(转精华)
  8. hdu 6092 Rikka with Subset 01背包 思维
  9. UVALive 7276 Wooden Signs (DP)
  10. web前端html代码,WEB前端--HTML(示例代码)
  11. Pycharm 搭建 Django 项目 (非常详细)
  12. Axure制作微信APP原型(二)登录注册模块
  13. c51单片机中断详解--适合初学者
  14. vue el-menu多级菜单递归
  15. go-ipfs-api
  16. 小白学习编程遇到问题应该如何正确的提问
  17. 旧金山州立大学计算机科学专业,美国留学旧金山州立大学 最受欢迎的十大专业...
  18. 阿ken的HTML、CSS的学习笔记_CSS盒子模型(笔记五)
  19. 物理中的路程、速度、时间、加速度常用公式
  20. 深脑链启动“天网计划” 向全球征集AI算力

热门文章

  1. HTML+CSS+JS实现美女canvas仿ps橡皮擦刮刮卡
  2. 【CSDN】-官方插件推荐懒人必备神器
  3. 基于java SSM图书管理系统简单版设计和实现
  4. oracle11g memory_target,Oracle11g启动报:ORA-00845: MEMORY_TARGET not supported on this system
  5. Vue 双向绑定小案例
  6. java算法概述,Java数据结构与算法基础(一)概述与线性结构
  7. python实例 83,84
  8. linux下将多个文件去除文件头合并_命令行生存指南:拆分与合并 | Linux 中国
  9. 【OpenCV 例程200篇】37. 图像的灰度化处理和二值化处理
  10. mysql心得体会一百字_MYSQL CPU 100%实例详解