文档章节

微信公众平台深度开发JAVA版第一季 31.菜单7

blueheart
 blueheart
发布于 2017/05/31 11:07
字数 1618
阅读 1
收藏 0
点赞 0
评论 0

上一节讲完了构建自定义菜单,自定义菜单创建接口那一块.这一节讲自定义菜单查询接口.创建自定义菜单和得到自定义菜单的报文也结束了.

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx51d48729cf5ce7ce&secret=5b14c8d2cb46ddc389936cdb135f18ac
{"access_token":"OTbn21WBtq2j6FpyCHyWV-K5aZggw3b3m1gMd_fiU8gfc6zjRiVoolRkIlYdJzGAWiXYJvH8mCMsE2Mnc14gKOAuKsyRRn9IzJpfDdw8j-8GTBiABABOW","expires_in":7200}
OTbn21WBtq2j6FpyCHyWV-K5aZggw3b3m1gMd_fiU8gfc6zjRiVoolRkIlYdJzGAWiXYJvH8mCMsE2Mnc14gKOAuKsyRRn9IzJpfDdw8j-8GTBiABABOW
{"errcode":0,"errmsg":"ok"}
{"errcode":0,"errmsg":"ok"}
{"errcode":0,"errmsg":"ok"}
{"button":[{ "type": "click",        "name": "说明001",                 "key": "001"              },{ "type": "view",        "name": "说明002",  "url": "http://www.baidu.com/"              },    {  "name":"sub_caidan001", "sub_button":[ { "type": "click",        "name": "下级001",                 "key": "sub001"              },{ "type": "view",        "name": "下级002",  "url": "http://www.baidu.com/"              }        ]               }       ]}
{"menu":{"button":[{"type":"click","name":"说明001","key":"001","sub_button":[]},{"type":"view","name":"说明002","url":"http:\/\/www.baidu.com\/","sub_button":[]},{"name":"sub_caidan001","sub_button":[{"type":"click","name":"下级001","key":"sub001","sub_button":[]},{"type":"view","name":"下级002","url":"http:\/\/www.baidu.com\/","sub_button":[]}]}]}}
{"button":[{ "type": "click",        "name": "说明001",                 "key": "001"              },{ "type": "view",        "name": "说明002",  "url": "http://www.baidu.com/"              },    {  "name":"sub_caidan001", "sub_button":[ { "type": "click",        "name": "下级001",                 "key": "sub001"              },{ "type": "view",        "name": "下级002",  "url": "http://www.baidu.com/"              }        ]               }       ]}
{"menu":{"button":[{"type":"click","name":"说明001","key":"001","sub_button":[]},{"type":"view","name":"说明002","url":"http:\/\/www.baidu.com\/","sub_button":[]},{"name":"sub_caidan001","sub_button":[{"type":"click","name":"下级001","key":"sub001","sub_button":[]},{"type":"view","name":"下级002","url":"http:\/\/www.baidu.com\/","sub_button":[]}]}]}}

create的报文和query的报文是不一样的。

从程序的角度query()方法返回回来的最好不是一个字符串,而是一个菜单对象.create的报文和query的报文的结构是不一样的,如果想query和create的报文都支持的话那样bean的构建就需要功底了.

每一个接口都是不一样的,只有你敲一遍你才知道它问题出现在哪里。就像之前读取信息流的报文的大小写写错了,你不敲代码你是看不出来的。

JDBC的读取数据库的流的关闭和I/O文件流的关闭都是有顺序的.

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx51d48729cf5ce7ce&secret=5b14c8d2cb46ddc389936cdb135f18ac
{"access_token":"xafvaGdfthmsOHDSsOFMAf4CRUC64iXt-6ybrbD1VGA9f3_6_bImIs5Ve3UCUHcdp-5qNCaTH1srsHkBDznSKv2gSOUqop6ZGvDdtFpZ7LL_yyMxkqu3-4p-vBJJei1JNCYeACAJYU","expires_in":7200}
xafvaGdfthmsOHDSsOFMAf4CRUC64iXt-6ybrbD1VGA9f3_6_bImIs5Ve3UCUHcdp-5qNCaTH1srsHkBDznSKv2gSOUqop6ZGvDdtFpZ7LL_yyMxkqu3-4p-vBJJei1JNCYeACAJYU
{"errcode":0,"errmsg":"ok"}
{"errcode":0,"errmsg":"ok"}
{"errcode":0,"errmsg":"ok"}
{"button":[{ "type": "click",        "name": "说明001",                 "key": "001"              },{ "type": "view",        "name": "说明002",  "url": "http://www.baidu.com/"              },    {  "name":"sub_caidan001", "sub_button":[ { "type": "click",        "name": "下级001",                 "key": "sub001"              },{ "type": "view",        "name": "下级002",  "url": "http://www.baidu.com/"              }        ]               }       ]}
{"menu":{"button":[{"type":"click","name":"说明001","key":"001","sub_button":[]},{"type":"view","name":"说明002","url":"http:\/\/www.baidu.com\/","sub_button":[]},{"name":"sub_caidan001","sub_button":[{"type":"click","name":"下级001","key":"sub001","sub_button":[]},{"type":"view","name":"下级002","url":"http:\/\/www.baidu.com\/","sub_button":[]}]}]}}
{"errcode":0,"errmsg":"ok"}
package wx.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import bean.caidan.CaiDan;

public class WX_CaiDan {
	/**
	 * 
	 * @param access_token
	 * @return
	 */
	public static String delete(String access_token) {
		StringBuffer strb = new StringBuffer();
		
		try {
			/*连接URL*/
			URL url =  new URL("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token="+access_token);
			
			HttpURLConnection connection=   (HttpURLConnection) url.openConnection();  
			/*得到in*/
			InputStream in = connection.getInputStream();
			/*得到reader*/
			InputStreamReader reader = new InputStreamReader(in);
			/*得到reader*/
			BufferedReader breader = new BufferedReader(reader);//做字符流和字节流的转换
			String str = null;
			while(null != (str = breader.readLine())){
				strb.append(str);
			}
			/*关闭breader*/
			breader.close();
			/*关闭reader*/
			reader.close();
			/*关闭in*/
			in.close();
		} 
		//catch (MalformedURLException e) {
		catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		return strb.toString();//
	}
	
	
	/**
	 * 查询菜单
	 * @param access_token
	 * @return
	 */
	public static String query(String access_token){//查询接口也要传递ACCESS_TOKEN
		StringBuffer strb  =  new StringBuffer();
		//StringBuilder和StringBuffer它们之间是有区别的.区别主要是安全性那块.微信开发这块区别不大,无所谓,但是这些知识还是要多了解下.
		//网络操作这个过程在微信开发这块非常重要.后期很多东西都是通过网络来实现了.
		InputStream in = null;//
		InputStreamReader reader = null;//
		BufferedReader breader = null;//编程的经验,对程序知道怎么弄更好一些
		try {
			/*连接url*/
			URL url =  new URL("https://api.weixin.qq.com/cgi-bin/menu/get?access_token="+access_token);
		    //J2SE的类型强制转换,把URL转换成它的一个子类.
			/*打开连接*/
			HttpURLConnection connection  = (HttpURLConnection)url.openConnection();
		    //GET方式,直接做的是读取
			/*得到输入流in*/
			 in = connection.getInputStream();
			/*in是字节流,把字节流转换为字符流*/
			/*得到InputStreamReader*/
			 reader = new InputStreamReader(in,"UTF-8");
			/*BufferedReader提高读取效率*/
			/*得到BufferedReader,breader比reader执行效率高,执行快*/
			 breader = new BufferedReader(reader);
			String str = null;
			while(null != (str=breader.readLine())){
				strb.append(str);
				
			}
			/*
			关闭breader*/
			breader.close();
			
			/*关闭reader*/
			reader.close();
			
			/*关闭in*/
			in.close();
		} //catch (MalformedURLException e) {
		catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
/*		
		关闭breader
		breader.close();
		
		关闭reader
		reader.close();
		
		关闭in
		in.close();*/
		return strb.toString();
	}
	/*
	 * create菜单
	 */
      //public static void createCaiDan() {
	  //public static void create(String access_token,List<CaiDan> caiDanList)  {//token,
	public static String create(String access_token,List<CaiDan> caiDanList)  {//token,
		/*连接对象*/  
		HttpURLConnection connection = null;
		  /*返回的字符串*/
		  StringBuffer strb =  new StringBuffer();
		  try {
			URL url = new URL("https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+access_token);
			 connection= (HttpURLConnection)url.openConnection();
            
			 /*设置POST*/
			 connection.setDoOutput(true);//流往出写的方式是POST方式.默认是GET方式.
            connection.setRequestMethod("POST");
            
            /*得到输出流*/
            OutputStream  out  =  connection.getOutputStream();
            
            /*封装OutputStreamWriter*/
            OutputStreamWriter writer = new OutputStreamWriter(out);
            
            /*封装BufferedWriter*/
            BufferedWriter bwriter = new BufferedWriter(writer);
            
            //?????????????????????????????
            /*写出*/
            bwriter.write(getStr(caiDanList));
            
            /*flush*/
            bwriter.flush();
            
            /*得到输入流*/
            InputStream in = connection.getInputStream();
            /*封装InputSreamReader*/
            InputStreamReader reader =  new InputStreamReader(in);
            /*封装BufferedReader*/
            BufferedReader breader = new BufferedReader(reader);
            /*读取*/
            String str = null;
            
            while(null!=( str = breader.readLine())){
            	strb.append(str);
            }
            System.out.println(strb);
            /*关闭out*/
            out.close();
            /*关闭writer*/
            writer.close();
            /*关闭bwriter*/
            bwriter.close();
            /*关闭in*/
            in.close();
            /*关闭reader*/
            reader.close();
            /*关闭breader*/
            breader.close();
		  } //catch (MalformedURLException e) {
	   catch (Exception e) {
		// TODO Auto-generated catch block
			e.printStackTrace();
		}//
	    if(null!=connection){
	    	connection.disconnect();
	     }
		//return access_token;
	    return strb.toString();
      }
	/*
	 * 构建自定义菜单的报文
	 */
	public static String getStr(List<CaiDan> caiDanList){
		StringBuffer strb  =  new StringBuffer();
		strb.append("{");
		strb.append("\"button\":[");
		
/*		strb.append("  {   ");
		strb.append("  \"button\":[  ");
		strb.append("  {	  ");
		strb.append("  \"type\":\"click\",");
		strb.append("  \"name\":\"今日歌曲\",");
		strb.append("  \"key\":\"V1001_TODAY_MUSIC\"");
		strb.append("  },  ");
		strb.append("  {  ");
		strb.append("  \"name\":\"菜单\",");
		strb.append("  sub_button\":[");
		strb.append("   { ");
		strb.append("   \"type\":\"view\",");
		strb.append("    name\":\"搜索\",");
		strb.append("   \"url\":\"http://www.soso.com/\"");
		strb.append("   }, ");
		strb.append("     { ");
		strb.append("   \"type\":\"miniprogram\", ");
		strb.append("   \"name\":\"wxa\", ");
		strb.append("  \"url\":\"http://mp.weixin.qq.com\", ");
		strb.append("   \"appid\":\"wx286b93c14bbf93aa\",");
		strb.append("   \"pagepath\":\"pages/lunar/index.html\"");
		strb.append("     },");
		strb.append("    { ");
		strb.append("   \"type\":\"click\",");
		strb.append("   \"name\":\"赞一下我们\",");
		strb.append("   \"key\":\"V1001_GOOD\"");
		strb.append("    }]");
		strb.append("     }] ");
		strb.append("     }] ");
		strb.append("   }");*/
		CaiDan caiDan =  null;
		CaiDan caiDan_ =  null;
		for(int x=0 ; x < caiDanList.size();x++){
			caiDan =  caiDanList.get(x);
			if(null==caiDan.getSub_button()){
			   strb.append("{");
			   strb.append( " \"type\": \""+caiDan.getType()+"\", ");
               strb.append( "       \"name\": \""+caiDan.getName()+"\", ");
       		if(CaiDan.CLICK.equals(caiDan.getType())){
				strb.append("                \"key\": \""+caiDan.getKey()+"\" ");		
			}else if(CaiDan.VIEW.equals(caiDan.getType())){
				strb.append(" \"url\": \""+caiDan.getUrl()+"\" ");
			}   		
			strb.append("             }");
			}else{
			strb.append("    { ");
           strb.append(" \"name\":\""+caiDan.getName()+"\",");
           strb.append(" \"sub_button\":[ ");
           for(int xx=0;xx<caiDan.getSub_button().size();xx++){
        	   caiDan_ = caiDan.getSub_button().get(xx);
        	   strb.append("{");
			   strb.append( " \"type\": \""+caiDan_.getType()+"\", ");
               strb.append( "       \"name\": \""+caiDan_.getName()+"\", ");
       		if(CaiDan.CLICK.equals(caiDan_.getType())){
				strb.append("                \"key\": \""+caiDan_.getKey()+"\" ");		
			}else if(CaiDan.VIEW.equals(caiDan_.getType())){
				strb.append(" \"url\": \""+caiDan_.getUrl()+"\" ");
			}   		
			strb.append("             }");
			if(xx+1!=caiDan.getSub_button().size()){
				strb.append(",");
			}
           }
			strb.append("        ]       ");		
			strb.append("        }       ");		

			}

			if(x+1!=caiDanList.size()){
				strb.append(",");
			}
		}
		strb.append("]");
		strb.append("}");
		
		return strb.toString();
		
	}
	
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import base.token.AccessToken;
import bean.caidan.CaiDan;

import wx.util.WX_CaiDan;
import wx.util.WX_Token;


public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
/*          try {
			//WX_Token.getAccessTokenByNet();
			System.out.println(WX_Token.getAccessTokenByNet());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		   AccessToken accessToken = null;
		try {
	           accessToken = WX_Token.getAccessTokenByNet();
	           System.out.println(accessToken.getAccess_token());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
          //WX_CaiDan.create(accessToken.getAccess_token(), null);
          
          List<CaiDan> caiDanList = new ArrayList<CaiDan>();
          
          CaiDan caidan001 =  new  CaiDan();
          
          caidan001.setName("说明001");
          caidan001.setType(CaiDan.CLICK);
          caidan001.setKey("001");
          caiDanList.add(caidan001);
          
          CaiDan caidan002 =  new  CaiDan();
          caidan002.setName("说明002");
          caidan002.setType(CaiDan.VIEW);
          caidan002.setKey("002");
          caidan002.setUrl("http://www.baidu.com/");
          caiDanList.add(caidan002);
          
          /**
           * 构建带有下级菜单的
           * sub_caidan001是一级菜单
           */
          CaiDan sub_caidan001 =  new  CaiDan();
          sub_caidan001.setName("sub_caidan001");
          List<CaiDan> sub_buttonList  =  new  ArrayList<CaiDan>();
          sub_caidan001.setSub_button(sub_buttonList);
          /**
           * sub_caiDan001是sub_caidan001的下级菜单
           * name是下级001
           * type是click
           * key是sub001
           */
          CaiDan sub_caiDan001 =  new CaiDan();
          sub_caiDan001.setName("下级001");
          sub_caiDan001.setType(CaiDan.CLICK);
          sub_caiDan001.setKey("sub001");
          sub_buttonList.add(sub_caiDan001);
          /**
           * sub_caiDan002是sub_caidan001的下级菜单
           * name是下级002
           * type是click
           * key是sub002
           */
          CaiDan sub_caiDan002 =  new CaiDan();
          sub_caiDan002.setName("下级002");
          sub_caiDan002.setType(CaiDan.VIEW);
          sub_caiDan002.setUrl("http://www.baidu.com/");
          sub_buttonList.add(sub_caiDan002);

          caiDanList.add(sub_caidan001);

          WX_CaiDan.create(accessToken.getAccess_token(), caiDanList);
          
          /*create*/
          System.out.println(WX_CaiDan.create(accessToken.getAccess_token(), caiDanList));
          
          /*报文*/
          System.out.println(WX_CaiDan.getStr(caiDanList));
          
          //System.out.println(WX_CaiDan.query(accessToken.toString()));
          /*query*/
          System.out.println(WX_CaiDan.query(accessToken.getAccess_token()));
          /*delete*/
          System.out.println(WX_CaiDan.delete(accessToken.getAccess_token()));
	}

}

1231231

© 著作权归作者所有

共有 人打赏支持
blueheart
粉丝 0
博文 35
码字总数 29716
作品 0
佛山
程序员
分享java微信开发视频

课程讲师:翟东平 课程分类:Java适合人群:高级课时数量:24(41节)课时更新程度:完毕服务类型:C类(普通服务类课程)用到技术:微信公众平台,微信,java涉及项目:超市促销活动,微信限时...

双层牛堡
2015/04/07
0
0
微信公众平台开发教程新手解惑40则

【编者按】由CSDN和《程序员》杂志联合主办的 2014年微信开发者大会 将于8月23日在北京举行,邀请了来自于一线的微信开发商技术负责人或资深工程师从企业应用开发高级篇、智能客服与LBS、微信...

DavidBao
2015/04/29
0
0
微信公众平台自定义菜单创建 -JAVA

微信公众平台开发之自定义菜单创建JAVA源码 创建项目添加httpclient.jar、fastjson.jar支持 专注微信公众平台app开发群:209389987 自定义菜单的问题总结: 1.自定义菜单只有服务号可以申请,...

using
2013/09/13
0
2
一大波编程视频资料赠送(亲自整理)

为了感恩大家长久以来的关注和支持,小编准备了一些福利,整理了包含前端,Java,产品经理,微信小程序,Python,网站源码,Android应用视频教程,微信公众平台开发教程及材料等资源合集大放...

祈澈姑娘
05/08
0
0
微信公众帐号开发教程第4篇-消息及消息处理工具的封装

工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用。这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平...

bliver
2013/11/29
0
2
《Java从小白到大牛精简版》之第2章 开发环境搭建

《Java从小白到大牛》纸质版已经上架了!! 《论语魏灵公》曰:“工欲善其事,必先利其器”,做好一件事,准备工作非常重要。在开始学习Java技术之前,先介绍如何搭建Java开发环境是非常重要...

tony关东升
06/26
0
0
使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise

最近Jerry接到一个原型开发的任务,需要在微信里调用ABAP On Premise系统(SAP CRM On-Premise)里的某些函数。具体场景和我之前的公众号文章 Cloud for Customer和微信集成系列教程 描述的场...

JerryWang_SAP
06/02
0
0
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
05/09
0
0
《成神之路-基础篇》JVM——垃圾回收(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是[《成神之路系列文章》][1]的第一篇,主要是关于JVM的一些介绍。 持续更新中 Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收 ...

05/05
0
0
干货系列1:Java互联网网站开发工程师 的技术提高与晋升路线(技术专精)

前几天写了自己对于Java软件开发工程师职业发展规划方面的一些感悟,陆续收到一些反馈,希望我能再就Java工程师不同的开发(职责)方向谈谈职业发展问题。(上一篇:Java软件开发工程师的自我...

半饱即好
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java 重写排序规则,用于代码层级排序

1.dataList 是个List<Map<String,Object>> 类型的数据,所以比较的时候是冲map中获取数据,并且数据不能为空。 2.dataList 类型是由自己定义的,new Comparator<Map<String,Object>> 也是对应......

轻量级赤影
5分钟前
0
0
分布式大型互联网企业架构!

摘要: 开发工具 1.Eclipse IDE:采用Maven项目管理,模块化。 2.代码生成:通过界面方式简单配置,自动生成相应代码,目前包括三种生成方式(增删改查):单表、一对多、树结构。生成后的代码...

明理萝
5分钟前
0
1
对MFC程序的一点逆向分析:定位按钮响应函数的办法

因为消息响应函数保存在AFX_MSGMAP_ENTRY数组中, 观察nMessage、nCode、nID、pfn利用IDA在rdata段中搜索即可, 在IDA中找到代码段基址0x401000,函数地址0x403140, 在WinDbg中运行!addre...

oready
6分钟前
0
0
阻抗匹配与史密斯(Smith)圆图基本原理

参考:http://bbs.eeworld.com.cn/thread-650695-1-1.html

whoisliang
11分钟前
0
0
maven配置文件分离

一、 简介 遇到很多次别人处理的项目,测试环境,本地开发和线上环境的配置不一样,每一次部署都要重新修改配置文件,提交审核代码,才能打包,非常不方便。 其实相信很多人都知道可以使用m...

trayvon
11分钟前
0
0
MacOS和Linux内核的区别

导读 有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我...

问题终结者
27分钟前
1
0
SpringBoot | 第八章:统一异常、数据校验处理

前言 在web应用中,请求处理时,出现异常是非常常见的。所以当应用出现各类异常时,进行异常的捕获或者二次处理(比如sql异常正常是不能外抛)是非常必要的,比如在开发对外api服务时,约定了响...

oKong
35分钟前
2
0
mysql高级

一、存储引擎 InnoDB MyISAM 比较 二、数据类型 整型 浮点数 字符串 时间和日期 三、索引 索引分类 索引的优点 索引优化 B-Tree 和 B+Tree 原理 四、查询性能优化 五、切分 垂直切分 水平切分...

丁典
56分钟前
1
0
rsync通过同步服务、系统日志、screen工具

rsync通过后台服务同步 在远程主机中建立一个rsync服务器,在服务器上配置好rsync的各种应用,然后将本机作为rsync的一个客户端连接远程的rsync服务器。 首先在A机器上建立并且配置rsync的配...

黄昏残影
今天
5
0
Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
今天
150
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部