SpringBoot开发微信公众号(三)

这篇文章创建一下菜单

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值