微信公众号开发之设置自定义菜单实例代码【java版】

 更新时间:2018年06月20日 11:01:00   作者:YuanlongWang  
这篇文章主要介绍了微信公众号开发之设置自定义菜单实例代码,本实例是为了实现在管理后台实现微信菜单的添加删除管理。需要的朋友可以参考下

本实例是为了实现在管理后台实现微信菜单的添加删除管理。

1、首先我们需要新建一个数据库表用于存放menu菜单项

可包含的字段有id、父类id、name、排序、是否显示、类型(view、click)、链接、adddate

注意后台存menu菜单数据时,parentId=-1为一级菜单,或parendId为一级菜单的id作为该一级菜单下的二级菜单

2、在设置菜单时需要向微信接口传menuJson字符串,所以要先拼接字符串,后台定义一个creatMenu()

public bool creatMenu() 
    { 
      string menuJson = ""; 
      //这里默认parentId=-1为最外层菜单,isactive=1为显示,responseType=1为click类型 
      DataTable dtAMenu = Service.SelectDataTable("id, name, responseType, jsonStr,url", "WEIXINMENU", " parentId=-1 and isactive=1 order by sort"); 
      if (dtAMenu.Rows.Count > 0) 
      { 
        menuJson = "{\"button\":["; 
        for (int i = 0; i < dtAMenu.Rows.Count; i++) 
        { 
          DataTable dtBMenu = Service.SelectDataTable("id, name, responseType, jsonStr,url", wx, " parentId=" + dtAMenu.Rows[i]["id"].ToString() + " and isactive=1 order by sort"); 
          if (dtBMenu.Rows.Count > 0) 
          { 
            menuJson += "{\"name\":\"" + dtAMenu.Rows[i]["name"].ToString() + "\",\"sub_button\":["; 
            for (int j = 0; j < dtBMenu.Rows.Count; j++) 
            { 
              if (Convert.ToInt32(dtBMenu.Rows[j]["responseType"]) == 2) 
              { 
                menuJson += "{\"type\":\"view\",\"name\":\"" + dtBMenu.Rows[j]["name"].ToString() + "\",\"url\":\"" + dtBMenu.Rows[j]["jsonStr"].ToString() + "\"},"; 
              } 
              else 
              { 
                menuJson += "{\"type\":\"click\",\"name\":\"" + dtBMenu.Rows[j]["name"].ToString() + "\",\"key\":\"eventKey_" + dtBMenu.Rows[j]["id"].ToString() + "\"},"; 
              } 
            } 
            menuJson = menuJson.TrimEnd(','); 
            menuJson += "]},"; 
          } 
          else 
          { 
            //if (Convert.ToInt32(dtAMenu.Rows[i]["responseType"]) == 2) 
            //{ 
              menuJson += "{\"type\":\"view\",\"name\":\"" + dtAMenu.Rows[i]["name"].ToString() + "\",\"url\":\"" + dtAMenu.Rows[i]["jsonStr"].ToString() + "\"},"; 
            //} 
            //else 
            //{ 
            //  menuJson += "{\"type\":\"click\",\"name\":\"" + dtAMenu.Rows[i]["name"].ToString() + "\",\"key\":\"eventKey_" + dtAMenu.Rows[i]["id"].ToString() + "\"},"; 
            //} 
          } 
          dtBMenu.Dispose(); 
        } 
        dtAMenu.Dispose(); 
        menuJson = menuJson.TrimEnd(','); 
        menuJson += "]}"; 
        menuJson = menuJson.Trim(); 
        return requstZmToCreatMent(menuJson); 
      } 
      else 
      { 
        return false; 
      } 
    } 

3、获取到menujson字符串后调用微信接口创建菜单,需先获取assess token,有关assess token获取可参考:获取AccessToken

/// <summary> 
    /// 向微信服务器请求创建自定义菜单 
    /// </summary> 
    /// <param name="jsonStr"></param> 
    /// <returns></returns> 
    ///  
    private bool requstZmToCreatMent(string jsonStr) 
    { 
      try 
      { 
        var AccessToken = "";//accesstoken需例外获取,一般可开始时获取后存数据库,下次从数据库取,注意accesstoken有效期为7200秒 
        //声明一个HttpWebRequest请求 
        string interfaceUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + AccessToken; 
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(interfaceUrl); 
        //设置连接超时时间  
        request.Timeout = 30000; 
        request.KeepAlive = true; 
        Encoding encodeType = Encoding.GetEncoding("UTF-8"); 
        request.Headers.Set("Pragma", "no-cache"); 
        request.Method = "POST"; 
        request.ContentType = "application/x-www-form-urlencoded"; 
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322); Http STdns"; 
        request.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"; 
        request.CookieContainer = new CookieContainer(); 
        byte[] Bytes = encodeType.GetBytes(jsonStr); 
        request.ContentLength = Bytes.Length; 
        request.AllowAutoRedirect = true; 
        //发送数据 
        using (Stream writer = request.GetRequestStream()) 
        { 
          writer.Write(Bytes, 0, Bytes.Length); 
          writer.Close(); 
        } 
        StringBuilder strb = new StringBuilder(); 
        //接收数据 
        using (Stream reader = request.GetResponse().GetResponseStream()) 
        { 
          StreamReader sr = new StreamReader(reader, encodeType); 
          strb.Append(sr.ReadToEnd()); 
          sr.Close(); 
          reader.Close(); 
        } 
        if ((strb.ToString().IndexOf("\"errcode\":42001") != -1) || (strb.ToString().IndexOf("\"errcode\":40001") != -1) || (strb.ToString().IndexOf("\"errcode\":40014") != -1) || (strb.ToString().IndexOf("\"errcode\":41001") != -1)) //access_token错误 
        { 
          // AccessToken = getAccessToken(); 
          getzmAccessToken(); 
          return requstZmToCreatMent(jsonStr); 
        } 
        else 
        { 
          if (strb.ToString() == "{\"errcode\":0,\"errmsg\":\"ok\"}") 
          { 
            return true; 
          } 
          else 
          { 
            return false; 
          } 
        } 
      } 
      catch (Exception exp) 
      { 
        return false; 
      } 
    } 

总结

以上所述是小编给大家介绍的微信公众号开发之设置自定义菜单实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java INPUTSTREAM如何实现重复使用

    Java INPUTSTREAM如何实现重复使用

    这篇文章主要介绍了Java INPUTSTREAM如何实现重复使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • MyBatis中example.createCriteria()方法的具体使用

    MyBatis中example.createCriteria()方法的具体使用

    本文详细介绍了MyBatis的Example工具的使用方法,包括链式调用指定字段、设置查询条件、支持多种查询方式等,还介绍了mapper的crud方法、and/or方法的使用,以及如何进行多条件和多重条件查询,感兴趣的可以了解一下
    2024-10-10
  • 解决idea中maven项目打包成jar报错:没有主清单属性的问题

    解决idea中maven项目打包成jar报错:没有主清单属性的问题

    这篇文章主要给大家分享了idea中maven项目打包成jar,报错没有主清单属性解决方法,文中有详细的解决方法,如果又遇到同样问题的朋友可以参考一下本文
    2023-09-09
  • 没有外网IDEA离线使用maven仓库的方法

    没有外网IDEA离线使用maven仓库的方法

    这篇文章主要介绍了没有外网,IDEA如何离线使用maven仓库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java中数据库加密的方式有哪些

    Java中数据库加密的方式有哪些

    这篇文章主要介绍了Java中数据库加密的方式有哪些,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Kafka中的producer拦截器与consumer拦截器详解

    Kafka中的producer拦截器与consumer拦截器详解

    这篇文章主要介绍了Kafka中的producer拦截器与consumer拦截器详解,Producer 的Interceptor使得用户在消息发送前以及Producer回调逻辑前有机会对消息做 一些定制化需求,比如修改消息等,需要的朋友可以参考下
    2023-12-12
  • Springboot解决ajax+自定义headers的跨域请求问题

    Springboot解决ajax+自定义headers的跨域请求问题

    由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。接下来通过本文给大家介绍Springboot如何优雅的解决ajax+自定义headers的跨域请求 ,需要的朋友可以参考下
    2019-05-05
  • 使用BigInteger实现除法取余

    使用BigInteger实现除法取余

    这篇文章主要介绍了使用BigInteger实现除法取余操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Javaweb mybatis接口开发实现过程详解

    Javaweb mybatis接口开发实现过程详解

    这篇文章主要介绍了Javaweb mybatis接口开发实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java基础题新手练习(一)

    Java基础题新手练习(一)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07

最新评论