您的位置:首页 > 移动开发 > 微信开发

微信开发--自定义菜单

2016-11-30 11:08 288 查看
一、定义几个实体类

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";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐