查了半天 有一种方式是在nginx端禁用掉缓存, 由于启动nginx有一堆参数 我不敢动 所以就搁置了
现在采用了加版本号机制, 每次上线后, 手动更新一次微信公众底部菜单栏下的链接
因为我们的公众号已经是采用接口配置了, 所以就直接是给前端封装一个接口, 每次上线的时候 他在浏览器访问一下这个链接即可, 不会太麻烦 , 也很完美, 用户依然可以享受缓存带来的速度
补充: 这种方式其实还有中弊端, 微信的菜单更新时长较长!
这是原本的接口
就放一下更新菜单的代码, 代码有点乱(不是我写的, 我就写不出 不会写 不知道怎么写出不好的代码)
首先是获取accessToken, accessToken要做一个过期刷新, 代码就不放了
public AccessToken initAccessToken() {
log.info("initAccessToken appid:" + ConfigProperties.wechat_appid);
// access_token_url 字段的值是 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
// jspapi_ticket_url: https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
// 调用接口获取access_token
return HttpsUtil.getAccessToken(ConfigProperties.wechat_appid, ConfigProperties.wechat_appsecret, ConfigProperties.access_token_url, ConfigProperties.jspapiTicketUrl);
}
/**
* 获取access_token
*
* @param appid 凭证
* @param appsecret 密钥
* @return
*/
public static AccessToken getAccessToken(String appid, String appsecret, String accessTokenUrl, String jspapiTicketUrl) {
String requestUrl = accessTokenUrl.replace("APPID", appid).replace("APPSECRET", appsecret);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
AccessToken accessToken = null;
// 如果请求成功
if (null != jsonObject) {
try {
accessToken = JsonTools.toBean(jsonObject.toString(), AccessToken.class);
//获取微信jsapi 票据
requestUrl = jspapiTicketUrl.replace("ACCESS_TOKEN", accessToken.getAccess_token());
JSONObject object = HttpsUtil.httpRequest(requestUrl, "GET", "");
int code = Integer.parseInt(object.get("errcode").toString());
if (code == 0) {
accessToken.setJspapi_ticket(object.getString("ticket"));
} else {
String msg = object.get("errmsg").toString();
log.debug("msg:" + msg);
}
} catch (JSONException e) {
accessToken = null;
// 获取token失败
log.info("获取token失败 errcode:{} errmsg:{}" + jsonObject.getInteger("errcode")
+ jsonObject.getString("errmsg"), e);
}
}
return accessToken;
}
/**
* 初始化菜单
*
*/
public void initMenu() {
// 获取AccessToken
AccessToken at = JsonTools.toBean(RedisUtils.get("initAccessToken").toString(), AccessToken.class);
if (null != at) {
// 调用接口创建菜单
int result = MenuUtils.initMenu(at.getAccess_token());
// 判断菜单创建结果
if (0 == result) {
log.info("菜单创建成功!");
} else {
log.info("菜单创建失败,错误码:" + result);
}
}
}
创建菜单
/**
* 创建菜单
*
* @param accessToken 有效的access_token
* @return 0表示成功,其他值表示失败
*/
public static int initMenu(String accessToken) {
int result = 0;
// 拼装创建菜单的URL
// https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
String url = ConfigProperties.wechat_menu_create_url.replace("ACCESS_TOKEN", accessToken);
// 将菜单对象转换成json字符串
String jsonMenu = JSONObject.toJSON(MenuUtils.createMenu()).toString();
// 调用接口创建菜单
JSONObject jsonObject = HttpClientUtils.httpsRequest(url, "POST", jsonMenu);
log.debug("---jsonMenu" + jsonMenu);
log.debug("---jsonObject" + jsonObject.toJSONString());
if (null != jsonObject) {
if (0 != jsonObject.getInteger("errcode")) {
result = jsonObject.getInteger("errcode");
log.info("创建菜单失败 errcode:{} errmsg:{}" + jsonObject.getInteger("errcode")
+ jsonObject.getString("errmsg"));
}
}
return result;
}
/**
* 组装菜单数据
*
* @return
*/
public static Menu createMenu() {
/*
public class ViewButton {
private String type;
private String url;
}
*/
ViewButton btn01 = new ViewButton();
btn01.setName("健康管理");
btn01.setType("view");
btn01.setUrl(ConfigProperties.vue_project_root + ConfigProperties.wechat_menu_home_service+"?timestamp="+System.currentTimeMillis());
ViewButton btn2 = new ViewButton();
btn2.setName("健康商城");
btn2.setType("view");
btn2.setUrl(ConfigProperties.shop_index_url);
ViewButton btn3 = new ViewButton();
btn3.setName("我的设备");
btn3.setType("view");
btn3.setUrl(ConfigProperties.vue_project_root + ConfigProperties.wechat_menu_my_device);
Menu menu = new Menu();
menu.setButton(new Button[]{btn01, btn2,btn3});
return menu;
}