微信公众账号开发自定义菜单的示例分析

发布时间:2021-09-14 10:13:49 作者:小新
来源:亿速云 阅读:105

小编给大家分享一下微信公众账号开发自定义菜单的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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

以上是“微信公众账号开发自定义菜单的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. SpringCloudGateway开发的示例分析
  2. 微信公众号开发自定义菜单的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

微信开发

上一篇:Nginx反向代理转发Apache的配置

下一篇:微信公众账号开发消息原理的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》