一、定义几个实体类
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";