首页 > 代码库 > 微信菜单更新,可以支持多个服务号更新C#。

微信菜单更新,可以支持多个服务号更新C#。

 微信菜单更新,可以支持多个服务号更新C#。

 

效果Demo页面

 

/// <summary>
/// 更新菜单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button4_Click(object sender, EventArgs e)
{
WXResponse.GetInstance().UpdateMenu(TextBox1.Text.Trim());

}

 

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Xml;
using LitJson;
using log4net;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace DemoWXUpdateMenu
{
public class WXResponse
{
/// <summary>
/// 构造方法
/// </summary>
public WXResponse()
{

}

private static WXResponse _instance;
public static WXResponse GetInstance()
{
if (_instance == null)
{
_instance = new WXResponse();
}

return _instance;
}

private ILog _log = log4net.LogManager.GetLogger(typeof(WXResponse));


/// <summary>
/// 加载菜单信息
/// </summary>
/// <param name="organID"></param>
/// <returns></returns>
public void UpdateMenu(string organID)
{
string json = GetJsonString(organID);
WXCreateMenu(json, organID);
}

public string GetJsonString(string organID)
{
string re = string.Empty;
try
{
//后期要改为从缓存中取数据,测试
OrganBankConfig menu = GetCacheOrganConfigMenu(organID);
#region 菜单格式化
if (menu != null)
{
MenuConfig mc = new MenuConfig();
List<Level1> l1List = new List<Level1>();
for (int i = 0; i < menu.Level1List.Count; i++)
{
Level1 l1 = new Level1();
l1.name = menu.Level1List[i].Name;
l1.type = menu.Level1List[i].Type;
l1.url = menu.Level1List[i].Url;
l1.key = menu.Level1List[i].Key;
if (menu.Level1List[i].Level2List != null && menu.Level1List[i].Level2List.Count > 0)
{
List<Level2> l2List = new List<Level2>();
for (int j = 0; j < menu.Level1List[i].Level2List.Count; j++)
{
Level2 l2 = new Level2();
l2.type = menu.Level1List[i].Level2List[j].Type;
l2.name = menu.Level1List[i].Level2List[j].Name;
l2.url = menu.Level1List[i].Level2List[j].Url;
l2.key = menu.Level1List[i].Level2List[j].Key;
if (l2 != null && l2.name != null)
{
l2List.Add(l2);
}
}
l1.sub_button = l2List;
}
if (l1 != null && l1.name != null)
{
l1List.Add(l1);

}
}
mc.button = l1List;
re = JsonMapper.ToJson(mc);
re = re.Replace("null", "\"\"");
//re=re.Replace("","\"sub_button"\"\:\"\"\"""");
string replaceString = ",\"sub_button\":\"\"";

re = re.Replace(replaceString, "");
}
#endregion
}
catch (Exception ex)
{
_log.Error("对象转换失败," + ex);
}
return re;
}

/// <summary>
/// 调用微信接口,自定义菜单token的获取 是用 下面的两个参数 获取的 不能直接用 公众平台的token
/// </summary>
public void WXCreateMenu(string json, string organID)
{
try
{
OrganBankConfig ob = GetCacheOrganConfigMenu(organID);
if (ob == null)
{
_log.Info("配置数据为空,请检查配置.");
}
string wXSAppId = ob.WXSAppId;
string wXSAppSecret = ob.WXSAppSecret;
if (wXSAppId == null || wXSAppSecret == null)
{
_log.Info("WXSAppId,WXSAppSecret为空,不能修改菜单");
return;
}
string wXAPIUrl = ConfigurationManager.AppSettings["WXAPIUrl"].ToString();
string weixin1 = json;

string to = GetData(wXAPIUrl + @"cgi-bin/token?grant_type=client_credential&appid=" + wXSAppId + "&secret=" + wXSAppSecret);
//后台 json的操作 得到的就是 token 或者 自己 获取 json的token
string token = string.Empty;
JObject jo = (JObject)JsonConvert.DeserializeObject(to);
if (jo != null && jo["access_token"] != null)
{
token = jo["access_token"].ToString().Replace("\"", "");
string re = GetPage(wXAPIUrl + @"cgi-bin/menu/create?access_token=" + token, weixin1);
_log.Info("创建或修改菜单成功" + re);
}
else
{
_log.Info("获取token失败,请查看日志");
}
}
catch (Exception ex)
{
_log.Error("创建或修改菜单失败," + ex);
}
}


#region 取配置文件或从缓存中取
/// <summary>
/// 根据机构号取菜单数据
/// </summary>
/// <param name="organId"></param>
/// <returns></returns>
public OrganBankConfig GetCacheOrganConfigMenu(string organId)
{
OrganBankConfig result = new OrganBankConfig();
result = LoadXMLMenu(organId);
return result;
}

/// <summary>
/// 根据机构号取回复数据
/// </summary>
/// <param name="organId"></param>
/// <returns></returns>
public Dictionary<string, ReplyInfo> GetCacheOrganConfigReply(string organId)
{
Dictionary<string, ReplyInfo> result = new Dictionary<string, ReplyInfo>();
result = LoadXMLReply(organId);
return result;
}

/// <summary>
/// 根据缓存中所有机构号数据
/// </summary>
/// <param name="organId"></param>
/// <returns></returns>
public Dictionary<string, string> GetCacheOrganBankIDList()
{
Dictionary<string, string> result = new Dictionary<string, string>();
result = LoadOrganBankIDList();
return result;
}

/// <summary>
/// 查询所有的机构银行编号
/// </summary>
/// <param name="BankSysNo"></param>
/// <returns></returns>
public Dictionary<string, string> LoadOrganBankIDList()
{
Dictionary<string, string> organIDList = new Dictionary<string, string>();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(HttpContext.Current.Server.MapPath("~/App_Data/Mis.xml"));
if (xmlDoc != null)
{
XmlNodeList nodes = xmlDoc.SelectSingleNode("//Mis").ChildNodes;
foreach (XmlNode node in nodes)
{
if (node.Attributes != null && node.Attributes["OrganBankID"] != null && node.Attributes["OrganBankID"].Value != null)
{
string organBankID = node.Attributes["OrganBankID"].Value;
organIDList.Add(organBankID, organBankID);
}
}
}
if (organIDList != null && organIDList.Count > 0)
{
return organIDList;
}
else
{
_log.Info("配置文件中找不到OrganBankID,请检查配置");
return null;
}
}

/// <summary>
/// 加载菜单信息
/// </summary>
/// <param name="organID"></param>
/// <returns></returns>
public OrganBankConfig LoadXMLMenu(string organID)
{
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(HttpContext.Current.Server.MapPath("~/App_Data/Mis.xml"));
if (xmlDoc != null)
{
XmlNode xmlOrganBank = xmlDoc.SelectSingleNode("//Mis//OrganBank[@OrganBankID=" + organID + "]");
OrganBankConfig menu = XmlMapEntity.XmlToObj<OrganBankConfig>("<OrganBankConfig>" + xmlOrganBank.InnerXml + "</OrganBankConfig>");
return menu;
}
}
catch (Exception ex)
{
_log.Error("App_Data/Mis.xml加载失败," + ex);
}
return null;

}

/// <summary>
/// 加载回复消息
/// </summary>
/// <param name="organID"></param>
/// <returns></returns>
public Dictionary<string, ReplyInfo> LoadXMLReply(string organID)
{
try
{
Dictionary<string, ReplyInfo> di = new Dictionary<string, ReplyInfo>();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(HttpContext.Current.Server.MapPath("~/App_Data/Mis.xml"));
if (xmlDoc != null)
{
XmlNodeList xnl = xmlDoc.SelectNodes("//Mis//OrganBank[@OrganBankID=" + organID + "]//ReplyList//ReplyInfo");
if (xnl == null)
{
_log.Info("xmlDoc.SelectNodes(//Mis//OrganBank[@OrganBankID=" + organID + "]//ReplyList//ReplyInfo)为null");
return null;
}
foreach (XmlNode btn in xnl)
{
ReplyInfo re = new ReplyInfo();
re.Key = btn.Attributes["Key"].Value;
re.Type = int.Parse(btn.Attributes["Type"].Value);
XmlNodeList ff = btn.ChildNodes;
foreach (XmlNode xxx in ff)
{
re.KeyInfo = xxx.InnerXml;
}
di.Add(re.Key, re);
}
}
return di;
}
catch (Exception ex)
{
_log.Error("回复消息App_Data/Mis.xml加载失败," + ex);
}
return null;
}
#endregion

#region 公共方法
/// <summary>
/// Get请求数据
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private string GetData(string url)
{
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "GET";
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
string content = reader.ReadToEnd();
_log.Info("GetData()content:" + content);
reader.Close();
return content;
}

/// <summary>
/// 保存结果返回
/// </summary>
/// <param name="posturl"></param>
/// <param name="postData"></param>
/// <returns></returns>
public 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 = http://www.mamicode.com/encoding.GetBytes(postData);
// 准备请求...
try
{
// 设置参数
request = WebRequest.Create(posturl) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
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();
_log.Info("GetPage()content:" + content);
string err = string.Empty;
return content;
}
catch (Exception ex)
{
_log.Error(ex.Message);
return string.Empty;
}
}

/// <summary>
/// 发送Post数据
/// </summary>
/// <param name="para"></param>
/// <returns></returns>
private string PostData(string para, string url)
{
Encoding encoding = Encoding.UTF8;
byte[] data = http://www.mamicode.com/encoding.GetBytes(para);
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
req.Method = "POST";
//req.ContentType = "application/x-www-form-urlencoded";
req.ContentType = "application/json";

req.ContentLength = data.Length;

System.IO.Stream newStream = req.GetRequestStream();
//发送数据
newStream.Write(data, 0, data.Length);
newStream.Close();

System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse();
StreamReader reader = new StreamReader(res.GetResponseStream(), Encoding.UTF8);
string re = reader.ReadToEnd();
_log.Info("SendDataPost返回字符:" + re);
return re;
}

 

#endregion

}

#region 菜单配置数据

/// <summary>
/// 菜单配置数据
/// </summary>
[Serializable]
public class OrganBankConfig
{
public List<Level1Info> Level1List { get; set; }
public string WXToken { get; set; }
public string WXID { get; set; }

public string WXSAppId { get; set; }
public string WXSAppSecret { get; set; }

public string MisApiBasePath { get; set; }
public string MisAppKey { get; set; }
public string MisAppValue { get; set; }
}

#region JSON格式数据

/// <summary>
/// 自定义的菜单
/// </summary>
[Serializable]
public class MenuConfig
{
public List<Level1> button { get; set; }
//public string name { get; set; }

}

/// <summary>
/// 一级菜单里面的数据,属性
/// </summary>
[Serializable]
public class Level1
{
public string name { get; set; }
public string type { get; set; }
public string url { get; set; }
public string key { get; set; }
public List<Level2> sub_button { get; set; }
}

/// <summary>
/// 二级菜单里面的数据,属性
/// </summary>
[Serializable]
public class Level2
{
public string type { get; set; }
public string name { get; set; }
public string url { get; set; }
public string key { get; set; }
}

#endregion


/// <summary>
/// 一级菜单里面的数据,属性
/// </summary>
[Serializable]
public class Level1Info
{
public string Name { get; set; }
public string Type { get; set; }
public string Url { get; set; }
public string Key { get; set; }
public List<Level2Info> Level2List { get; set; }
}

/// <summary>
/// 二级菜单里面的数据,属性
/// </summary>
[Serializable]
public class Level2Info
{
public string Name { get; set; }
public string Type { get; set; }
public string Url { get; set; }
public string Key { get; set; }
}

/// <summary>
/// 回复属性,回复菜单配置数据
/// </summary>
[Serializable]
public class ReplyInfo
{
public string Key { get; set; }
public string KeyInfo { get; set; }
public int Type { get; set; } //0文本,1图文
}

#endregion

}

 

下载