这篇文章创建一下菜单
public class MyX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateEncodingException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateEncodingException{
}
@Override
public X509Certificate[] getAcceptedIssuers(){
return null;
}
}
@Component
public class HttpRequestUtil {
public JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr){
JSONObject jsonObject = null;
try {
TrustManager[] tmManagers = {new MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, tmManagers, new java.security.SecureRandom());
SSLSocketFactory sslSocket = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpsURLConnection = (HttpsURLConnection)url.openConnection();
httpsURLConnection.setSSLSocketFactory(sslSocket);
httpsURLConnection.setDoOutput(true);
httpsURLConnection.setDoInput(true);
httpsURLConnection.setUseCaches(false);
httpsURLConnection.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod)) {
httpsURLConnection.connect();
}
if (null != outputStr) {
OutputStream outputStream = httpsURLConnection.getOutputStream();
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
InputStream inputStream = httpsURLConnection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer stringBuffer = new StringBuffer();
while((str = bufferedReader.readLine()) != null){
stringBuffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
httpsURLConnection.disconnect();
jsonObject = JSONObject.fromObject(stringBuffer.toString());
} catch (ConnectException ce) {
ce.printStackTrace();
} catch(Exception e){
e.printStackTrace();
}
return jsonObject;
}
}
封装菜单类
public class Menu {
private Button[] button;
public Button[] getButton() {
return button;
}
public void setButton(Button[] button) {
this.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;
}
}
public class ClickButton extends Button {
private String key;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
public class ViewButton extends Button {
public String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
开始创建菜单
/**
* APPID、GET_CODE_URL、URL
* 在下面的常量类里
*/
public class WechatMenuManagerUtil {
public Menu getMenu() throws UnsupportedEncodingException {
ClickButton firstClickButton = new ClickButton();
firstClickButton.setName("扫一扫");
firstClickButton.setKey("16");
firstClickButton.setType("scancode_push");
ViewButton button2=new ViewButton();
button2.setName("Hello");
button2.setType("view");
String url2=URL+"/log/login";
button2.setUrl(GET_CODE_URL.replace("APPID", APPID).replace("REDIRECT_URI", URLEncoder.encode(url2,"UTF-8")).replace("SCOPE", "snsapi_userinfo"));
Menu menu = new Menu();
Button[] boButtons = {firstClickButton, button2};
menu.setButton(boButtons);
return menu;
}
}
//写一个controller控制器进行页面跳转或者逻辑实现
@Controller
@RequestMapping(value="/log")
public class logController {
@RequestMapping("/{pages}")
String home(@PathVariable String pages) {
return pages;
}
}
菜单管理类
@Component
public class MenuManageUtil {
@Autowired
private HttpRequestUtil httpRequestUtil;
public boolean creatMenu(Menu menu, String accessToken){
boolean result = false;
String url = Constant.MENU_CREATE_URL.replace("ACCESS_TOKEN", accessToken);
String jsonMenu = JSONObject.fromObject(menu).toString();
JSONObject jsonObject = httpRequestUtil.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;
logger.error("创建菜单失败 errcode:{} errmsg:{} ",errorCode,errorMsg);
}
}
return result;
}
public String getMenu(String accessToken){
String result = null;
String requestUrl = Constant.MENU_GET_URL.replace("ACCESS_TOKEN", accessToken);
JSONObject jsonObject = httpRequestUtil.httpsRequest(requestUrl, "GET", null);
if (null != jsonObject) {
result = jsonObject.toString();
}
return result;
}
public boolean deleteMenu(String accessToken){
boolean result = false;
String requestUrl = Constant.MENU_DELETE_URL.replace("ACCESS_TOKEN", accessToken);
JSONObject jsonObject = httpRequestUtil.httpsRequest(requestUrl, "GET", null);
if (null != jsonObject) {
int errorCode = jsonObject.getInt("errcode");
String errorMsg = jsonObject.getString("errmsg");
if (0== errorCode) {
result = true;
} else {
result = false;
logger.error("创建菜单失败 errcode:{} errmsg:{} ",errorCode,errorMsg);
}
}
return result;
}
}
获取access_token
@Component
public class GetAccessTokenUtil {
private static String token_url = Constant.ACCESS_TOKEN_URL;
@Autowired
private HttpRequestUtil httpRequestUtil;
@Autowired
MenuManageUtil menuManageUtil;
public AccessToken getAccessToken(String appid, String appsecret){
String url = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
AccessToken accessToken = new AccessToken();
JSONObject jsonObject = httpRequestUtil.httpsRequest(url,"GET",null);
if (jsonObject!=null) {
try {
accessToken.setAccess_token(jsonObject.getString("access_token"));
accessToken.setExpires_in(jsonObject.getInt("expires_in"));
} catch (Exception e) {
accessToken = null;
logger.error("获取token失败 errcode:{} errmsg:{}",
jsonObject.getInt("errcode"),
jsonObject.getString("errmsg"));
}
}
return accessToken;
}
//写一个初始化方法,每次启动项目时,自动创建菜单及相关的操作
@PostConstruct
public void init() throws UnsupportedEncodingException {
CreateMenuUtil wechatMenuManagerUtil = new CreateMenuUtil();
String appid = Constant.APPID;
String appsecret = Constant.APPSECRET;
String accessToken = getAccessToken(appid, appsecret).getAccess_token();
Menu menu = wechatMenuManagerUtil.getMenu();
if (accessToken!=null) {
boolean result = menuManageUtil.creatMenu(menu, accessToken);
if (result) {
System.out.println("菜单创建成功");
}else {
System.out.println("菜单创建失败");
}
}else {
System.out.println("token为空");
}
}
}
//AccessToken实体类
@Component
public class AccessToken {
private String access_token;
private int expires_in;
private String errcode;
private String errmsg;
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;
}
public String getErrcode() {
return errcode;
}
public void setErrcode(String errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
}
我这个微信公众号是借鉴了别人的成果,原作者的链接在这里https://blog.csdn.net/qq_40715775/article/details/82776882,但是我当时运行这个这个代码时access_token一直为空,具体因为什么不清楚,自己弄了半天之后换了上面的方法就好了
上面涉及到的常量都封装在了下面的Constant类里
public class Constant {
public static final String TOKEN = 你公众号里设置的TOKEN;
public static final String APPID = 你公众号里设置的APPID;
public static final String APPSECRET = 你公众号里设置的APPSECRET;
public static final String URL= 你的URL地址;
public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
public static final String JS_SDK_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
public static final String OAUTH2_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
public static final String GET_CODE_URL="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
public static final String MENU_DELETE_URL = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN";
public static final String MENU_CREATE_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
public static final String MENU_GET_URL = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN";
public static final String CUSTOM_SERVICE_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN";
public static final String SEND_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
public static final String USE_TAG_CREATE_URL = "https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN";
public static final String GET_INUSER_TAG_URL = "https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=ACCESS_TOKEN";
public static final String UNTAGGING_USER_BATCH_URL = "https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging?access_token=ACCESS_TOKEN";
public static final String CREATE_PERSONALIZED_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=ACCESS_TOKEN";
public static final String DELETE_PERSONAL_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token=ACCESS_TOKEN";
public static final String CREATE_USERTAG_URL = "https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=ACCESS_TOKEN";
public static final String GET_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
public static final String OPENID_USERINFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
}
项目结构截图
代码借鉴自:https://blog.csdn.net/qq_40715775/article/details/82776882