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

微信公众账号开发经验整理 ----- (1)自定义菜单

2016-07-29 00:24 603 查看
开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。

自定义菜单操作流程其实很简单 ,就是执行一段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) {// 公众账号唯一凭证
		String appId = "";//公众账号唯一凭证密钥String appSecret = "";// 调用接口获取凭证Token token = CommonUtil.getToken(appId, appSecret);if (null != token) {// 创建菜单boolean result = createMenu(getMenu(), token.getAccessToken());// 判断菜单创建结果if (result)log.info("菜单创建成功!");elselog.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;}}将代码复制 放到你自己新建的项目中就可以运行起来。若有疑问请留言。过几天更新 微信支付和支付宝支付
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐