微信公眾號開發(fā)之設(shè)置自定義菜單實例代碼【java版】
本實例是為了實現(xiàn)在管理后臺實現(xiàn)微信菜單的添加刪除管理。
1、首先我們需要新建一個數(shù)據(jù)庫表用于存放menu菜單項

可包含的字段有id、父類id、name、排序、是否顯示、類型(view、click)、鏈接、adddate
注意后臺存menu菜單數(shù)據(jù)時,parentId=-1為一級菜單,或parendId為一級菜單的id作為該一級菜單下的二級菜單
2、在設(shè)置菜單時需要向微信接口傳menuJson字符串,所以要先拼接字符串,后臺定義一個creatMenu()
public bool creatMenu()
{
string menuJson = "";
//這里默認(rèn)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字符串后調(diào)用微信接口創(chuàng)建菜單,需先獲取assess token,有關(guān)assess token獲取可參考:獲取AccessToken
/// <summary>
/// 向微信服務(wù)器請求創(chuàng)建自定義菜單
/// </summary>
/// <param name="jsonStr"></param>
/// <returns></returns>
///
private bool requstZmToCreatMent(string jsonStr)
{
try
{
var AccessToken = "";//accesstoken需例外獲取,一般可開始時獲取后存數(shù)據(jù)庫,下次從數(shù)據(jù)庫取,注意accesstoken有效期為7200秒
//聲明一個HttpWebRequest請求
string interfaceUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + AccessToken;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(interfaceUrl);
//設(shè)置連接超時時間
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;
//發(fā)送數(shù)據(jù)
using (Stream writer = request.GetRequestStream())
{
writer.Write(Bytes, 0, Bytes.Length);
writer.Close();
}
StringBuilder strb = new StringBuilder();
//接收數(shù)據(jù)
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;
}
}
總結(jié)
以上所述是小編給大家介紹的微信公眾號開發(fā)之設(shè)置自定義菜單實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java INPUTSTREAM如何實現(xiàn)重復(fù)使用
這篇文章主要介紹了Java INPUTSTREAM如何實現(xiàn)重復(fù)使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
MyBatis中example.createCriteria()方法的具體使用
本文詳細(xì)介紹了MyBatis的Example工具的使用方法,包括鏈?zhǔn)秸{(diào)用指定字段、設(shè)置查詢條件、支持多種查詢方式等,還介紹了mapper的crud方法、and/or方法的使用,以及如何進(jìn)行多條件和多重條件查詢,感興趣的可以了解一下2024-10-10
解決idea中maven項目打包成jar報錯:沒有主清單屬性的問題
這篇文章主要給大家分享了idea中maven項目打包成jar,報錯沒有主清單屬性解決方法,文中有詳細(xì)的解決方法,如果又遇到同樣問題的朋友可以參考一下本文2023-09-09
Kafka中的producer攔截器與consumer攔截器詳解
這篇文章主要介紹了Kafka中的producer攔截器與consumer攔截器詳解,Producer 的Interceptor使得用戶在消息發(fā)送前以及Producer回調(diào)邏輯前有機(jī)會對消息做 一些定制化需求,比如修改消息等,需要的朋友可以參考下2023-12-12
Springboot解決ajax+自定義headers的跨域請求問題
由于瀏覽器同源策略(同源策略,它是由Netscape提出的一個著名的安全策略,現(xiàn)在所有支持JavaScript 的瀏覽器都會使用這個策略。接下來通過本文給大家介紹Springboot如何優(yōu)雅的解決ajax+自定義headers的跨域請求 ,需要的朋友可以參考下2019-05-05
Javaweb mybatis接口開發(fā)實現(xiàn)過程詳解
這篇文章主要介紹了Javaweb mybatis接口開發(fā)實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07

