Java Springboot自定义微信公众号菜单
面向百度编程,代码拿来即用
自己做自定义微信公众号菜单是遇到了一些坑,现在已经把坑填平,拿来即用。
自定义菜单类型(实体类)
Button
/**
*
* 类名称: Button
* 类描述: 按钮
*/
public class Button {
private String name;//菜单标题
private String type;//菜单的响应动作类型
private Button[] sub_button;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Button[] getSub_button() {
return sub_button;
}
public void setSub_button(Button[] sub_button) {
this.sub_button = sub_button;
}
}
ClickButton
/**
*
* 类名称: ClickButton
* 类描述: 点击类型
*/
public class ClickButton extends Button{
private String key;//菜单KEY值
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
ViewButton
public class ViewButton extends Button{
private String url;//网页链接
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
Menu
/**
*
* 类名称: Menu
* 类描述: 菜单
*/
public class Menu {
private Button[] button;
public Button[] getButton() {
return button;
}
public void setButton(Button[] button) {
this.button = button;
}
}
AccessToken
/**
* 微信通用接口凭证
*
*/
public class AccessToken {
// 获取到的凭证
private String access_token;
// 凭证有效时间,单位:秒
private int expires_in;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public int getExpires_in() {
return expires_in;
}
public void setExpires_in(int expires_in) {
this.expires_in = expires_in;
}
}
自定义菜单工具类
WeiXinUtil
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import net.sf.json.JSONObject;
public class WeiXinUtil {
private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?"
+ "grant_type=client_credential&appid=APPID&secret=APPSECRET";
/**
* 处理doget请求
* @param url
* @return
*/
public static JSONObject doGetstr(String url){
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
JSONObject jsonObject = null;
try {
CloseableHttpResponse response = httpclient.execute(httpGet);
HttpEntity entity = response.getEntity();
if(entity!=null){
String result = EntityUtils.toString(entity);
jsonObject = JSONObject.fromObject(result);
}
} catch (IOException e) {
e.printStackTrace();
}
return jsonObject;
}
/**
* 处理post请求
* @param url
* @return
*/
public static JSONObject doPoststr(String url,String outStr){
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
JSONObject jsonObject = null;
try {
httpPost.setEntity(new StringEntity(outStr, "utf-8"));
CloseableHttpResponse response = httpclient.execute(httpPost);
String result = EntityUtils.toString(response.getEntity(),"utf-8");
jsonObject =JSONObject.fromObject(result);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonObject;
}
public static AccessToken getAccessToken(String appid,String appsecret){
AccessToken token = new AccessToken();
String url = ACCESS_TOKEN_URL.replace("APPID", appid).replace("APPSECRET", appsecret);
JSONObject json = doGetstr(url);
if(json!=null){
token.setAccess_token(json.getString("access_token"));
token.setExpires_in(json.getInt("expires_in"));
}
return token;
}
}
MemuUtil
import net.sf.json.JSONObject;
/**
*
* 类名称: MemuUtil
* 类描述: 菜单工具
*/
public class MenuUtil {
private static final String CTRATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
/**
* 创建菜单
* @param accessToken
* @param Menu 菜单json格式字符串
* @return
*/
public static int createMenu(String accessToken,String Menu){
int result = Integer.MIN_VALUE;
String url = CTRATE_MENU_URL.replaceAll("ACCESS_TOKEN", accessToken);
JSONObject json = WeiXinUtil.doPoststr(url, Menu);
if(json!=null){
//从返回的数据包中取数据{"errcode":0,"errmsg":"ok"}
result = json.getInt("errcode");
}
return result;
}
public static String initMenu(){
String result = "";
//创建点击一级菜单
ClickButton button11 = new ClickButton();
button11.setName("往期活动");
button11.setKey("11");
button11.setType("click");
//创建跳转型一级菜单
ViewButton button21 = new ViewButton();
button21.setName("百度一下");
button21.setType("view");
button21.setUrl("https://www.baidu.com");
//创建其他类型的菜单与click型用法一致
ClickButton button31 = new ClickButton();
button31.setName("拍照发图");
button31.setType("pic_photo_or_album");
button31.setKey("31");
ClickButton button32 = new ClickButton();
button32.setName("发送位置");
button32.setKey("32");
button32.setType("location_select");
//封装到一级菜单
Button button = new Button();
button.setName("菜单");
button.setType("click");
button.setSub_button(new Button[]{button31,button32});
//封装菜单
Menu menu = new Menu();
menu.setButton(new Button[]{button11,button21,button});
return JSONObject.fromObject(menu).toString();
}
创建自定义菜单
MenuCreat
public class MenuCreat {
public static void main(String[] args) {
String appid = "换成你自己的appid";
String appsecret = "开发秘钥";
String accessToken = WeiXinUtil.getAccessToken(appid, appsecret).getAccess_token();
String menu = MenuUtil.initMenu();
System.out.println(menu);
int result = MenuUtil.createMenu(accessToken, menu);
if (result == 0) {
System.out.println("菜单创建成功");
} else {
System.out.println("错误码" + result);
}
}
}