zoukankan      html  css  js  c++  java
  • C# 微信公众号菜单创建(一)

    转载:搬山的蚂蚁 https://www.cnblogs.com/HappyAnt/p/5210927.html

    1. 自定义菜单最多包含3个一级菜单,每个一级菜单最多包含5个二级菜单
    2. 一级菜单最多4个汉字,二级菜单最多8个汉字,多出来的部分以“……”代替
    3. 创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

    自定义菜单接口可实现类型:(项目主要使用click、view和media_id,暂时说这三种)

    1. click:点击事件 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),

      并且带上按钮中开发者填写的key值, 开发者可以通过自定义的key值与用户进行交互;

    2. view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。

    3. media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。

    调用接口

    请求方式:POST (请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_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"
                }]
           },
            {
               "type": "media_id", 
               "name": "图片", 
               "media_id": "MEDIA_ID1"
            } 
         ]
     }
    

    示例是一串JSON数据,可以选择用字符串拼接形式存储,也可以选择文件存储。

    第一种方法

    用文件存储,将示例存储到txt文件中,最好是可以把自定义菜单与公众号开发的程序分开放。避免每次修改自定义菜单都要发布程序。

    建立一个存放自定义菜单功能的aspx页面

    public partial class wxMenuManage : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }
    
            /// <summary>
            /// 读取并创建自定义菜单
            /// </summary>
            private void CreateMenu()
            {
                FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(".") + "\menu.txt", FileMode.Open);
                StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("GBK"));
                string menu = sr.ReadToEnd();
                sr.Close();
                fs.Close();
                sr.Dispose();
                fs.Dispose();
    
                string access_token =wxAccess_token.IsExistAccess_Token(); //获取access_token
                string i = GetPage("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token, menu);
                Response.Write("创建菜单结果:" + i);
                Response.End();
            }
    
            /// <summary>
            /// 删除菜单
            /// </summary>
            private void DeleteMenu()
            {
                string access_token =wxAccess_token.IsExistAccess_Token(); //获取access_token
                string i = GetPage("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + access_token, "");
                Response.Write("删除菜单结果:" + i);
                Response.End();
            }
    
    
            /// <summary>
            /// 获取自定义菜单
            /// </summary>
            /// <param name="posturl">自定义菜单请求的地址</param>
            /// <param name="postData">自定义菜单内容</param>
            /// <returns></returns>
            private string GetPage(string posturl, string postData)
            {
                Stream outstream = null;
                Stream instream = null;
                StreamReader sr = null;
                HttpWebResponse response = null;
                HttpWebRequest request = null;
                Encoding encoding = Encoding.UTF8;
                byte[] data = null;
                if (postData.Length > 0) //有值代表创建菜单
                {
                    data = encoding.GetBytes(postData);
                }
                
                // 准备请求...
                try
                {
                    // 设置参数
                    request = WebRequest.Create(posturl) as HttpWebRequest;
                    CookieContainer cookieContainer = new CookieContainer();
                    request.CookieContainer = cookieContainer;
                    request.AllowAutoRedirect = true;
                    if (postData.Length > 0)
                    {
                        request.Method = "POST"; //创建菜单
                    }
                    else
                    {
                        request.Method = "GET"; //删除菜单
                    }
                    
                    request.ContentType = "application/x-www-form-urlencoded";
    
                    if (postData.Length > 0) //有值代表创建菜单
                    {
                        request.ContentLength = data.Length;
                        outstream = request.GetRequestStream();
                        outstream.Write(data, 0, data.Length);
                        outstream.Close();
                    }
                   
                    //发送请求并获取相应回应数据
                    response = request.GetResponse() as HttpWebResponse;
                    //直到request.GetResponse()程序才开始向目标网页发送Post请求
                    instream = response.GetResponseStream();
                    sr = new StreamReader(instream, encoding);
                    //返回结果网页(html)代码
                    string content = sr.ReadToEnd();
                    string err = string.Empty;
                    return content;
                }
                catch (Exception ex)
                {
                    string err = ex.Message;
                    Response.Write(err);
                    Response.End();
                    return string.Empty;
                }
            }
    
            /// <summary>
            /// 创建菜单
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void btnCreate_Click(object sender, EventArgs e)
            {
                CreateMenu();
            }
    
            /// <summary>
            /// 删除菜单
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void btnDelete_Click(object sender, EventArgs e)
            {
                DeleteMenu();
            }
        }
    

    在前端页面调用方法:

    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
        <asp:Button CssClass="Button" ID="btnCreate" runat="server" Text="生成菜单栏"  onclick="btnCreate_Click" />
        <asp:Button CssClass="Button" ID="btnDelete" runat="server" Text="删除菜单栏"  onclick="btnDelete_Click" />
    </asp:Content>
    

    注:

          1.  在创建菜单前必须要删除之前的菜单,
          2. 注意access_token的时效性,
          3. 注意txt和 aspx页面的存放路径。
          4. 使用media_id类型需要上传为永久素材
  • 相关阅读:
    #2019120500009-LG 数据结构 优先队列(1)
    #2019120500008-LG 数据结构 栈(1)
    2019D1T1 格雷码
    #2019120500006-LG 迷宫
    #2019120500004-LG 单词方阵
    #2019110700005
    hdu 1827强连通分量
    HDU 5691 状压dp
    HDU 4734--基础数位dp(递推)
    HDU 4638--莫队算法
  • 原文地址:https://www.cnblogs.com/cyapi/p/15271025.html
Copyright © 2011-2022 走看看