1. 程式人生 > 其它 >C# 微信公眾號選單建立(一)

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型別需要上傳為永久素材