前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信个人公众号开发--(5)获取Token并自定义菜单

微信个人公众号开发--(5)获取Token并自定义菜单

作者头像
浩Coding
发布2019-07-02 16:30:50
1.1K0
发布2019-07-02 16:30:50
举报
文章被收录于专栏:浩Coding浩Coding

微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。 公众平台的API调用所需的access_token的使用及生成方式说明: 1、为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务; 2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡; 3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

公众号调用各接口时都需使用access_token,我们如何获取access_token?

1. 创建 token 的 实体类

根据返回值说明,创建 实体 类

AccessToken

代码语言:c#
复制
public class AccessToken {    private String token;    private int expiresIn;

根据微信的 APPID ,APPSECRET 获取 token:

代码语言:java
复制
private static final String APPID = "填自己的";private static final String APPSECRET = "填自己的";private static final String ACCESS_TOKEN_URL ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; 

/**

* 获取Token

* @throws Exception

*/

public static AccessToken getAccessToken() throws Exception{

AccessToken token = new AccessToken();

String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);

//编辑成实际的Token请求地址

String result = null;

result = HttpUtil.sendGet(url, "utf-8");

JSONObject jsonObject = JSONObject.fromObject(result);

if (jsonObject!=null) {

token.setToken(jsonObject.getString("access_token"));

token.setExpiresIn(jsonObject.getInt("expires_in"));

}

return token;

}

token的获取次数有限,如果微信公众号的使用人数很多,不能每次都创建新的 token。

同时产生多个 token 会产生冲突,且 token 的有效时间是 2 小时,

所以可以把获取的 token 写入文件中,当失效是重新获取 token ,

这样一天最多获取 12 次。

参考文章:https://blog.csdn.net/shuicsdn/article/details/72087592

二 开发自定义菜单

注:如果你没有微信公众号认证的话,自定义菜单是不能用的!

微信认证声明:

声明

  • 全新的认证体系提供更安全、更严格的真实性认证,也能够更好地保护企业及用户的合法权益。
  • 微信认证全过程完成后,用户将在微信中看到认证公众号特有的标识。
  • 支持所有组织类型的公众帐号申请全新的微信认证。
  • 帐号资质审核认证通过后,订阅号将获得自定义菜单接口权限,服务号将获得高级功能接口中所有接口权限、多客服接口,以及可申请微信支付。 微信认证流程详细说明。
  • 审核服务费用:300元/次

可以在微信公众号->接口权限查看:

自定义菜单

详情

未获得

1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。 3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

1. 根据 XML 消息,创建按钮和菜单的 实体类

根据微信文档,XML 的正确的格式需要包含:最外层是一个菜单类,中间包括着 click 和 view 的按钮类,其他类型做法类似。

创建按钮 实体 类 button

代码语言:c#
复制
public class Button {    //菜单类型
   private String type;    //菜单名称
   private String name;    //可以包含多个菜单项(二级菜单数组,个数应为1~5个)

创建 click 和 view 类型的 button

代码语言:javascript
复制
public class ClickButton extends Button{
   //click等点击类型必须
   private String key;

public class ViewButton extends Button{ //view类型的路径 private String url;

以及最外层的 menu

代码语言:c#
复制
public class Menu {    //菜单中包含的button
   private Button[] button;

2. 组装一个 menu

1、click:点击推事件 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互; 2、view:跳转URL 用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。

按照按钮类型创建相应的菜单,如下:

点击按钮

代码语言:text
复制
ClickButton button11 = new ClickButton();
       button11.setName("click菜单");
       button11.setType("click");
       button11.setKey("11");

跳转按钮

代码语言:text
复制
ViewButton button21 = new ViewButton();
       button21.setName("view菜单");
       button21.setType("view");
       button21.setUrl("http://www.baidu.com");

菜单包含多层可以嵌套

代码语言:javascript
复制
Button button = new Button();
       button.setName("菜单组");
       button.setSub_button(new Button[]{button31,button32});  

/**

* 初始化菜单

* @return

*/

public static Menu initMenu() {

Menu menu = new Menu();

/**

* 创建需要的按钮

**/

ClickButton button11 = new ClickButton();

button11.setName("click菜单");

button11.setType("click");

button11.setKey("11");

ViewButton button21 = new ViewButton();

button21.setName("view菜单");

button21.setType("view");

button21.setUrl("http://www.baidu.com");

Button button = new Button();

button.setName("菜单组");

Button button2 = new Button();

button2.setName("菜单组2");

menu.setButton(new Button[] { button, button2 });

return menu;

}

/**

* 创建菜单

* @param token 需要获取Token!!!

* @param menu

* @return

* @throws Exception

*/

public static String createMenu(String token, String menu) throws Exception {

String result = "";

String url = CREATE_MENU_URL.replace("ACCESS_TOKEN", token);

String results = null;

results = HttpUtil.sendGet(url, "utf-8");

JSONObject jsonObject = JSONObject.fromObject(results);

if (jsonObject != null) {

result += jsonObject.getInt("errcode") + jsonObject.getString("errmsg");

}

return result;

}

/**

* 验证自定义菜单

* @param args

*/

public static void main(String[] args) {

String menu = JSONObject.fromObject(initMenu()).toString();

try {

AccessToken token = AccessToken.getAccessToken();

System.out.println("票据:" + token.getToken());

System.out.println("有效时间:" + token.getExpiresIn());

String result = createMenu(token.getToken(), menu);

char fir = result.charAt(0);// 获取字符串的第一个字符

if (fir == '0') {//微信返回的状态码

System.out.println("创建菜单成功");

} else {

System.err.println("出现错误:" + result);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

参考文章:https://blog.csdn.net/shuicsdn/article/details/72123980

自此,微信自定义菜单创建完成,大家可以拓展自己想要的其他功能,另外,很多微信功能需要认证的!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩Coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 创建 token 的 实体类
    • 声明
    • 1. 根据 XML 消息,创建按钮和菜单的 实体类
    • 2. 组装一个 menu
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档