微信官方文档: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?
1. 创建 token 的 实体类
根据返回值说明,创建 实体 类
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5SM5Yne2A3NtFXevwVM2kDOzcTNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
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
二 开发自定义菜单
注:如果你没有微信公众号认证的话,自定义菜单是不能用的!
微信认证声明:
声明
- 全新的认证体系提供更安全、更严格的真实性认证,也能够更好地保护企业及用户的合法权益。
- 微信认证全过程完成后,用户将在微信中看到认证公众号特有的标识。
- 支持所有组织类型的公众帐号申请全新的微信认证。
- 帐号资质审核认证通过后,订阅号将获得自定义菜单接口权限,服务号将获得高级功能接口中所有接口权限、多客服接口,以及可申请微信支付。 微信认证流程详细说明。
- 审核服务费用:300元/次
可以在微信公众号->接口权限查看:
自定义菜单 | 详情 | 未获得 |
---|
1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。
3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
1. 根据 XML 消息,创建按钮和菜单的 实体类
根据微信文档,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;
复制
2. 组装一个 menu
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
自此,微信自定义菜单创建完成,大家可以拓展自己想要的其他功能,另外,很多微信功能需要认证的!