这篇文章分享微信公众账号开发自定义菜单的经验总结
开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。
自定义菜单操作流程其实很简单 ,就是执行一段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
<br>
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;
}
}
以上就是微信公众账号开发自定义菜单的经验总结的详细内容。