小编给大家分享一下微信公众账号开发自定义菜单的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。 自定义菜单操作流程其实很简单 ,就是执行一段Java程序 将你公众账号的appid和封装的菜单发送到腾讯服务器,腾讯服务器会根据你请求参数appid和封装的菜单添加到对应的公众账号,一定要罗嗦一句, 在Java 程序中执行一次 main 方法就可以,下次修改重新执行,不过会有缓存,取消重新关注就可以了。 1 新建按钮基类 public class Button { //按钮名称 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 2,根据业务需求新建不同的按钮类 /** * view类型的按钮 点击跳转链接 * */ public class ViewButton extends Button { private String type; private String 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; } } /** * click类型的按钮 类似于input type = 'button' 指定key 根据捕获到的key处理相应的业务 * */ public class ClickButton extends Button { private String type; private String key; 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; } } 3 创建符合类型的按钮 , 说白了就是创建主菜单容器 /** * 复合类型的按钮 * */ public class ComplexButton extends Button { private Button[] sub_button; public Button[] getSub_button() { return sub_button; } public void setSub_button(Button[] sub_button) { this.sub_button = sub_button; } } 4 创建菜单类, 用于盛放 三个主菜单 /** * 菜单 */ public class Menu { private Button[] button; public Button[] getButton() { return button; } public void setButton(Button[] button) { this.button = button; } } 5 创建调用凭证类Token 为执行main方法调用腾讯接口做准备 /** * 凭证 * */ public class Token { // 接口访问凭证 private String accessToken; // 凭证有效期,单位:秒 private int expiresIn; public String getAccessToken() { return accessToken; } public void setAccessToken(String accessToken) { this.accessToken = accessToken; } public int getExpiresIn() { return expiresIn; } public void setExpiresIn(int expiresIn) { this.expiresIn = expiresIn; } } 以下代码我只做类的描述。具体代码功能看注释。 6 为调用腾讯接口做准备 (1)创建通用工具类 /** * 通用工具类 * */ public class CommonUtil { private static Logger log = LoggerFactory.getLogger(CommonUtil.class); /** * 获取接口访问凭证 * * @param appid 凭证 * @param appsecret 密钥 * @return */ public static Token getToken(String appid, String appsecret) { // 凭证获取(GET) String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; Token token = null; String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret); // 发起GET请求获取凭证 JSONObject jsonObject = httpsRequest(requestUrl, "GET", null); if (null != jsonObject) { try { token = new Token(); token.setAccessToken(jsonObject.getString("access_token")); token.setExpiresIn(jsonObject.getInt("expires_in")); } catch (JSONException e) { // 获取token失败 token = null; } } return token; } /** * 发送https请求 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; try { // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求方式(GET/POST) conn.setRequestMethod(requestMethod); // 当outputStr不为null时向输出流写数据 if (null != outputStr) { OutputStream outputStream = conn.getOutputStream(); // 注意编码格式 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 从输入流读取返回内容 InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } // 释放资源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; conn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { log.error("连接超时:{}", ce); } catch (Exception e) { log.error("https请求异常:{}", e); } return jsonObject; } } (2)创建信任管理器 package com.test.util; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; /** * 信任管理器 * */ public class MyX509TrustManager implements X509TrustManager { // 检查客户端证书 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } // 检查服务器端证书 public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } // 返回受信任的X509证书数组 public X509Certificate[] getAcceptedIssuers() { return null; } } 7 以上工作做完就可以创建自定义菜单了。创建自定义菜单管理类。赋值 appId 和 appSecret 运行main方法, 搞定。 package com.test.menu; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.sf.json.JSONObject; import com.test.bean.Button; import com.test.bean.ComplexButton; import com.test.bean.Menu; import com.test.bean.Token; import com.test.bean.ViewButton; import com.test.util.CommonUtil; /** * 菜单管理器类 * */ public class MenuManager { private static Logger log = LoggerFactory.getLogger(MenuManager.class); /** * 定义菜单结构 * @return */ private static Menu getMenu() { //定义子菜单 ViewButton btn1 = new ViewButton(); btn1.setName("子菜单1"); btn1.setType("view"); btn1.setUrl("http://www.baidu.com"); ViewButton btn2 = new ViewButton(); btn2.setName("子菜单2"); btn2.setType("view"); btn2.setUrl("http://www.baidu.com"); ViewButton btn3 = new ViewButton(); btn3.setName("子菜单3"); btn3.setType("view"); btn3.setUrl("http://www.baidu.com"); ViewButton btn4 = new ViewButton(); btn4.setName("子菜单4"); btn4.setType("view"); btn4.setUrl("http://www.baidu.com"); ComplexButton mainBtn1 = new ComplexButton(); mainBtn1.setName("主菜单1"); mainBtn1.setSub_button(new Button[] { btn1,btn2});//微信规定最多五个子菜单 ComplexButton mainBtn2 = new ComplexButton(); mainBtn2.setName("主菜单2"); mainBtn2.setSub_button(new Button[] { btn3}); ComplexButton mainBtn3 = new ComplexButton(); mainBtn3.setName("主菜单3"); mainBtn3.setSub_button(new Button[] {btn4}); Menu menu = new Menu(); menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 }); return menu; } public static void main(String[] args) { // 公众账号唯一凭证 1
String appId = ""; //公众账号唯一凭证密钥 String appSecret = ""; // 调用接口获取凭证 Token token = CommonUtil.getToken(appId, appSecret); if (null != token) { // 创建菜单 boolean result = createMenu(getMenu(), token.getAccessToken()); // 判断菜单创建结果 if (result) log.info("菜单创建成功!"); else log.info("菜单创建失败!"); } } /** * 创建菜单 * * @param menu 菜单实例 * @param accessToken 凭证 * @return true成功 false失败 */ public static boolean createMenu(Menu menu, String accessToken) { boolean result = false; String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN"; String url = menu_create_url.replace("ACCESS_TOKEN", accessToken); // 将菜单对象转换成json字符串 String jsonMenu = JSONObject.fromObject(menu).toString(); // 发起POST请求创建菜单 JSONObject jsonObject = CommonUtil.httpsRequest(url, "POST", jsonMenu); if (null != jsonObject) { int errorCode = jsonObject.getInt("errcode"); String errorMsg = jsonObject.getString("errmsg"); if (0 == errorCode) { result = true; } else { result = false; log.error("创建菜单失败 errcode:{} errmsg:{}", errorCode, errorMsg); } } return result; } }
以上是“微信公众账号开发自定义菜单的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程笔记行业资讯频道!