C# 微信公眾號選單建立(一)
阿新 • • 發佈:2021-09-15
建立微信公眾號選單
轉載:搬山的螞蟻 https://www.cnblogs.com/HappyAnt/p/5210927.html
- 自定義選單最多包含3個一級選單,每個一級選單最多包含5個二級選單
- 一級選單最多4個漢字,二級選單最多8個漢字,多出來的部分以“……”代替
- 建立自定義選單後,選單的重新整理策略是,在使用者進入公眾號會話頁或公眾號profile頁時,如果發現上一次拉取選單的請求在5分鐘以前,就會拉取一下選單,如果選單有更新,就會重新整理客戶端的選單。測試時可以嘗試取消關注公眾賬號後再次關注,則可以看到建立後的效果。
自定義選單介面可實現型別:(專案主要使用click、view和media_id,暫時說這三種)
-
click:點選事件 使用者點選click型別按鈕後,微信伺服器會通過訊息介面推送訊息型別為event的結構給開發者(參考訊息介面指南),
並且帶上按鈕中開發者填寫的key值, 開發者可以通過自定義的key值與使用者進行互動;
-
view:跳轉URL使用者點選view型別按鈕後,微信客戶端將會開啟開發者在按鈕中填寫的網頁URL,可與網頁授權獲取使用者基本資訊介面結合,獲得使用者基本資訊。
-
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型別需要上傳為永久素材