微信开发之自定义菜单创建

首先要了解,在做微信开发项目的时候,都是需要进行一个token验证的,微信服务端去验证你传来的token,校验通过之后,才能给你开放一些借口以便于你进行一些详细的读写操作,所以我们在做开发之前都是需要先通过微信端的接口来获取到access_token来进行接下来的一些操作,具体看代码
这是微信提供的获取access_token的地址
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
这其中有三个参数:

  • grant_type——获取access_token填写client_credential
  • appid——第三方用户唯一凭证
  • secret——第三方用户唯一凭证密钥,即appsecret
    通过你传来的appid和secret来识别唯一的用户,就是判断你是否是开发者并且你的账号没有异常,校验通过以后
    正常情况下,微信会返回下述JSON数据包:{“access_token”:“ACCESS_TOKEN”,“expires_in”:7200}
    这里的access_token就是你获取到的token,expires_in就是这个token的过期时间2个小时,当我们获取到这个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”
}]
}]
}

这样模块的一个菜单,通过一些json拼接数组的操作就可以得到这样的数据

//根据pid去数据库查询一级菜单
List<WeChatMenu> menuList = wechatMapper.findById(0);
JSONObject parentjson = new JSONObject();

JSONArray parentarray = new JSONArray();

//循环集合,拼接第一级菜单
for (int i = 0; i < menuList.size() ; i++) {
    WeChatMenu weChatMenu = menuList.get(i);//获取第一级菜单

    JSONObject jsonObject = new JSONObject();

    JSONArray jsonArray = new JSONArray();
    //判断同级菜单中是否存在type为null的情况
    if(!StringUtils.isBlank(weChatMenu.getM_type())){//type不为空,添加type类型,否则不添加
        jsonObject.put("type",weChatMenu.getM_type());
        jsonObject.put("name",weChatMenu.getM_name());
        //根据获取到的type类型判断增加的是key还是url
        if(weChatMenu.getM_type().equals("click")){
            jsonObject.put("key",weChatMenu.getM_key());
        }
        if(weChatMenu.getM_type().equals("view")){
            jsonObject.put("url",weChatMenu.getM_url());
        }
    }else{
        jsonObject.put("name",weChatMenu.getM_name());
        List<WeChatMenu> list = wechatMapper.findById(weChatMenu.getId());//根据一级菜单的id查询对应的子菜单
        for (int j = 0; j < list.size(); j++) {
            WeChatMenu menu = list.get(j);
            JSONObject childrenjson = new JSONObject();
            childrenjson.put("type",menu.getM_type());
            childrenjson.put("name",menu.getM_name());

            if(menu.getM_type().equals("click")){
                childrenjson.put("key",menu.getM_key());
            }

            if(menu.getM_type().equals("view")){
                childrenjson.put("url",menu.getM_url());
            }
            jsonArray.add(childrenjson);
        }
        jsonObject.put("sub_button",jsonArray);
    }

    parentarray.add(jsonObject);
}
//拼接一级菜单
parentjson.put("button", parentarray);//{"button":[]}

这是我的数据库的表结构,展示一下
在这里插入图片描述
这是嵌套循环的方式获取到的数据的代码,也可以通过递归的方法来获取,具体看个人喜好,在这里关于菜单的type类型我只判断了click和view,因为开发中基本上用的最多的就是这两种,如果还需要其他的那么久自行添加。拼接完这些数据之后,就需要通过调用微信提供的接口把我们的数据和获取到的access_token传过去,等微信端校验完成之后就可以看到新建好的菜单了。
那么怎么在项目中通过java代码来实现操作呢,就需要用到httpclient post请求方式

public static String postMethod(String url,String param){
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost post = new HttpPost(url);
    String result = null;
    try {
        StringEntity entity = new StringEntity(param,Charset.forName("UTF-8"));
        post.setEntity(entity);
        HttpResponse execute = httpClient.execute(post);
        result = EntityUtils.toString(execute.getEntity());//将返回来的实体对象转换成字符串

    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

这里我自定义了一个工具类,只需要把拼接好的数据放入进来就可以了

//将拼接好的字符串和地址通过httputils发送请求
String result = HttpClientUtils.postMethod(change_menulist_url, parentjson.toString());

如果校验成功并且拼接的数据没有错的话就会返回来{“errcode”:0,“errmsg”:“ok”}这样的result

这是关于返回来的状态码的详细解释

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页