微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。 公众平台的API调用所需的access_token的使用及生成方式说明: 1、为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务; 2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡; 3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
公众号调用各接口时都需使用access_token,我们如何获取access_token?
根据返回值说明,创建 实体 类
AccessToken
public class AccessToken { private String token; private int expiresIn;
根据微信的 APPID ,APPSECRET 获取 token:
private static final String APPID = "填自己的";private static final String APPSECRET = "填自己的";private static final String ACCESS_TOKEN_URL ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
/**
* 获取Token
* @throws Exception
*/
public static AccessToken getAccessToken() throws Exception{
AccessToken token = new AccessToken();
String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);
//编辑成实际的Token请求地址
String result = null;
result = HttpUtil.sendGet(url, "utf-8");
JSONObject jsonObject = JSONObject.fromObject(result);
if (jsonObject!=null) {
token.setToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInt("expires_in"));
}
return token;
}
token的获取次数有限,如果微信公众号的使用人数很多,不能每次都创建新的 token。
同时产生多个 token 会产生冲突,且 token 的有效时间是 2 小时,
所以可以把获取的 token 写入文件中,当失效是重新获取 token ,
这样一天最多获取 12 次。
参考文章:https://blog.csdn.net/shuicsdn/article/details/72087592
二 开发自定义菜单
注:如果你没有微信公众号认证的话,自定义菜单是不能用的!
微信认证声明:
可以在微信公众号->接口权限查看:
自定义菜单 | 详情 | 未获得 |
---|
1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。 3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
根据微信文档,XML 的正确的格式需要包含:最外层是一个菜单类,中间包括着 click 和 view 的按钮类,其他类型做法类似。
创建按钮 实体 类 button
public class Button { //菜单类型
private String type; //菜单名称
private String name; //可以包含多个菜单项(二级菜单数组,个数应为1~5个)
创建 click 和 view 类型的 button
public class ClickButton extends Button{
//click等点击类型必须
private String key;
public class ViewButton extends Button{ //view类型的路径 private String url;
以及最外层的 menu
public class Menu { //菜单中包含的button
private Button[] button;
1、click:点击推事件 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互; 2、view:跳转URL 用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
按照按钮类型创建相应的菜单,如下:
点击按钮
ClickButton button11 = new ClickButton();
button11.setName("click菜单");
button11.setType("click");
button11.setKey("11");
跳转按钮
ViewButton button21 = new ViewButton();
button21.setName("view菜单");
button21.setType("view");
button21.setUrl("http://www.baidu.com");
菜单包含多层可以嵌套
Button button = new Button();
button.setName("菜单组");
button.setSub_button(new Button[]{button31,button32});
/**
* 初始化菜单
* @return
*/
public static Menu initMenu() {
Menu menu = new Menu();
/**
* 创建需要的按钮
**/
ClickButton button11 = new ClickButton();
button11.setName("click菜单");
button11.setType("click");
button11.setKey("11");
ViewButton button21 = new ViewButton();
button21.setName("view菜单");
button21.setType("view");
button21.setUrl("http://www.baidu.com");
Button button = new Button();
button.setName("菜单组");
Button button2 = new Button();
button2.setName("菜单组2");
menu.setButton(new Button[] { button, button2 });
return menu;
}
/**
* 创建菜单
* @param token 需要获取Token!!!
* @param menu
* @return
* @throws Exception
*/
public static String createMenu(String token, String menu) throws Exception {
String result = "";
String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token);
String results = null;
results = HttpUtil.sendGet(url, "utf-8");
JSONObject jsonObject = JSONObject.fromObject(results);
if (jsonObject != null) {
result += jsonObject.getInt("errcode") + jsonObject.getString("errmsg");
}
return result;
}
/**
* 验证自定义菜单
* @param args
*/
public static void main(String[] args) {
String menu = JSONObject.fromObject(initMenu()).toString();
try {
AccessToken token = AccessToken.getAccessToken();
System.out.println("票据:" + token.getToken());
System.out.println("有效时间:" + token.getExpiresIn());
String result = createMenu(token.getToken(), menu);
char fir = result.charAt(0);// 获取字符串的第一个字符
if (fir == '0') {//微信返回的状态码
System.out.println("创建菜单成功");
} else {
System.err.println("出现错误:" + result);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
参考文章:https://blog.csdn.net/shuicsdn/article/details/72123980
自此,微信自定义菜单创建完成,大家可以拓展自己想要的其他功能,另外,很多微信功能需要认证的!