一、定义几个实体类
public class AccessToken {//这里定义一个AccessToken的实体类,用来保存获取到的accesstoken
private String token;//获得到的token
private 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;//url
public 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 {//一级菜单,这个菜单下面包含很多的底层button
private 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) {//获取accesstoken
AccessToken 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())) {//没有找到缓存的accesstoken
String 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) {//获取accesstoken
AccessToken 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())) {//没有找到缓存的accesstoken
String 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 block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.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";