java创建自定义菜单_使用Java创建公众号自定义菜单

相信大家在微信公众号开发中都会遇到这样一个问题:启用服务器配置后,原先设置的公众号菜单都失效了,变成了下面这样:

f63fa3b8bbcc047f824e385316026449.png

关于这个问题,在启用服务器配置时,微信官方是有给出提示的,如下图:

32287af7068b1659294464e1b30e948f.png

那么,如果我们必须启用服务器配置,怎么设置我们的菜单呢?其实很简单,微信有给出相应的接口的,而且各种接口都有,包括增删改查。

6f4bcd0b1142f8f6e6ffb19b5eb05541.png

创建菜单就是一次简单的POST提交(需要access_token),菜单数据按微信给出的规则封装成一个json对象即可。

1. 获取access_token

获取access_token的请求如下:

https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

需要注意,第一次获取access_token时都是失败的,因为只有公众号IP白名单内的ip才可以获取access_token。通常我们第一次获取access_token都返回下面这样的错误信息:

{"errcode":40164,"errmsg":"invalid ip 113.91.141.47 ipv6 ::ffff:113.91.141.47, not in whitelist hint: [3h4r0a00314809]"}

通过错误信息我们可以看到,此ip是无效的,因而无法获取access_token。所以我们需要将此ip添加到公众号IP白名单。

56e53cc7755f00278437e71d0e8f69f1.png

然后再获取access_token就可以成功获取了,获取成功后的返回结果如下:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

2. 创建菜单

创建菜单的请求url如下:

http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

请求参数:

{

"button":[

{

"type":"click",

"name":"今日歌曲",

"key":"V1001_TODAY_MUSIC"

},

{

"name":"菜单",

"sub_button":[

{

"type":"view",

"name":"搜索",

"url":"http://www.soso.com/"

},

{

"type":"miniprogram",

"name":"wxa",

"url":"http://mp.weixin.qq.com",

"appid":"wx286b93c14bbf93aa",

"pagepath":"pages/lunar/index"

},

{

"type":"click",

"name":"赞一下我们",

"key":"V1001_GOOD"

}]

}]

}

请求结果:

{"errcode":0,"errmsg":"ok"}

3.完整代码

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.URL;

import java.net.URLConnection;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* @description 官方文档 https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html

* 所需依赖:

*

* com.alibaba

* fastjson

* 1.1.41

*

* @author: liyinlong

* @date 2020-01-05 22:09

*/

public class CreateWxMenu {

public static void main(String[] args) {

String appid = "你的公众号id";

String secret = "你的公众号密钥";

String accessTokenStr = sendGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret);

System.out.println("access_token获取结果:" + accessTokenStr);

JSONObject accessTokenObj = JSONObject.parseObject(accessTokenStr);

String access_token = accessTokenObj.getString("access_token");

System.out.println("access_token:" + access_token);

JSONObject menu = new JSONObject();

JSONArray buttonAry = new JSONArray();

Map object1 = new HashMap<>();

object1.put("type", "view");

object1.put("name", "官方文档");

object1.put("url", "https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html");

Map object2 = new HashMap<>();

object2.put("type", "view");

object2.put("name", "我的csdn");

object2.put("url", "https://blog.csdn.net/long_yi_1994");

buttonAry.add(object1);

buttonAry.add(object2);

menu.put("button", buttonAry);

String res = sendPost("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token, menu.toString());

System.out.println("菜单修改结果:" + res);

}

/**

* @param url 发送请求的URL

* @param param 请求参数

* @return 所代表远程资源的响应结果

* @description 向指定 URL 发送POST方法的请求

* @author: liyinlong

* @date 2020-01-05 21:00

*/

public static String sendPost(String url, String param) {

System.out.println("\n==============================POST请求开始==============================");

PrintWriter out = null;

BufferedReader in = null;

String result = "";

try {

URL realUrl = new URL(url);

// 打开和URL之间的连接

URLConnection conn = realUrl.openConnection();

// 设置通用的请求属性

conn.setRequestProperty("accept", "*/*");

conn.setRequestProperty("connection", "Keep-Alive");

conn.setRequestProperty("user-agent",

"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

// 发送POST请求必须设置如下两行

conn.setDoOutput(true);

conn.setDoInput(true);

// 获取URLConnection对象对应的输出流

out = new PrintWriter(conn.getOutputStream());

// 发送请求参数

out.print(param);

// flush输出流的缓冲

out.flush();

// 定义BufferedReader输入流来读取URL的响应

in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

result += line;

}

} catch (Exception e) {

System.out.println("发送 POST 请求出现异常!" + e);

e.printStackTrace();

}

//使用finally块来关闭输出流、输入流

finally {

try {

if (out != null) {

out.close();

}

if (in != null) {

in.close();

}

} catch (IOException ex) {

ex.printStackTrace();

}

}

System.out.println("url:" + url);

System.out.println("POST请求结果:" + result);

System.out.println("==============================POST请求结束==============================\n");

return result;

}

/**

* @param url 请求url,若有参数,则拼在里面

* @return 所代表远程资源的响应结果

* @description 发送GET请求,参数拼在url里

* @author: liyinlong

* @date 2020-01-05 21:56

*/

public static String sendGet(String url) {

System.out.println("\n==============================GET请求开始==============================");

String result = "";

BufferedReader in = null;

try {

String urlNameString = url;

URL realUrl = new URL(urlNameString);

// 打开和URL之间的连接

URLConnection connection = realUrl.openConnection();

// 设置通用的请求属性

connection.setRequestProperty("accept", "*/*");

connection.setRequestProperty("connection", "Keep-Alive");

connection.setRequestProperty("user-agent",

"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

// 建立实际的连接

connection.connect();

// 获取所有响应头字段

Map> map = connection.getHeaderFields();

// 遍历所有的响应头字段

/* for (String key : map.keySet()) {

System.out.println(key + "--->" + map.get(key));

}*/

// 定义 BufferedReader输入流来读取URL的响应

in = new BufferedReader(new InputStreamReader(

connection.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

result += line;

}

} catch (Exception e) {

System.out.println("发送GET请求出现异常!" + e);

e.printStackTrace();

}

// 使用finally块来关闭输入流

finally {

try {

if (in != null) {

in.close();

}

} catch (Exception e2) {

e2.printStackTrace();

}

}

System.out.println("url:" + url);

System.out.println("GET请求结果:" + result);

System.out.println("==============================GET请求结束==============================\n");

return result;

}

}

代码成功执行后,可以看到,公众号的菜单被成功修改了,如下图:

4354d55383cd731884632d8588c79c93.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值