/*-------------------------------------------------------------------------- * CustomMenu.cs *Auth:deepleo * Date:2013.12.31 * Email:2586662969@qq.com * Website:http://www.weixinsdk.net *--------------------------------------------------------------------------*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Http; using Codeplex.Data; using System.Xml; namespace LYFZ.Weixin.SDK { /// <summary> /// "自定义菜单” /// http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E5%88%9B%E5%BB%BA%E6%8E%A5%E5%8F%A3 /// 注意:自定义菜单事件推送接口见:AcceptMessageAPI /// 创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来,测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。 /// 自定义菜单种类如下: /// 1、click:点击推事件 /// 2、view:跳转URL /// 3、scancode_push:扫码推事件 /// 4、scancode_waitmsg:扫码推事件且弹出“消息接收中”提示框 /// 5、pic_sysphoto:弹出系统拍照发图 /// 6、pic_photo_or_album:弹出拍照或者相册发图 /// 7、pic_weixin:弹出微信相册发图器 /// 8、location_select:弹出地理位置选择器 /// </summary> public class CustomMenuAPI { public static T parse<T>(string jsonString) { using (var ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonString))) { return (T)new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T)).ReadObject(ms); } } /// <summary> /// 获取要创建的菜单数据字符串 /// </summary> /// <param name="menu_buttons"></param> /// <returns></returns> public static string GetMenuDataString(List<MenuModel> menu_buttons) { string menuModelString = ""; for (int i = 0; i < 3; i++) { if (i < menu_buttons.Count) { MenuModel button = menu_buttons[i]; menuModelString += button.ToString() + ","; } else { break; } } string dataString = "{\"button\":[" + menuModelString.Trim(',') + "]}"; return dataString; } /// <summary> /// 获取要创建的菜单数据XML /// </summary> /// <param name="menu_buttons"></param> /// <returns></returns> public static string GetMenuDataXML(List<MenuModel> menu_buttons) { string menuModelString = ""; if (menu_buttons.Count > 0) { for (int i = 0; i < 3; i++) { if (i < menu_buttons.Count) { MenuModel button = menu_buttons[i]; menuModelString += button.ToXml(); } else { break; } } return "<menu>" + menuModelString + "</menu>"; } return ""; } /// <summary> /// 测试用 /// </summary> /// <returns></returns> public static string GetTempXmlString() { return "<menu>" +" <button> " +" <name>工具箱</name> " +" <sub_button> " +" <type>view</type> " +" <name>百度搜索</name> " +" <url>http://www.baidu.com/</url> " +" </sub_button> " +" <sub_button> " +" <type>view</type> " +" <name>QQ视频</name> " +" <url>http://v.qq.com/</url> " +" </sub_button> " +" <sub_button> " +" <type>view</type> " +" <name>手机APP</name> " +" <url>http://yifox.oicp.net/WebMobile/Main.aspx/</url> " +" </sub_button> " +" <sub_button> " +" <type>scancode_waitmsg</type> " +" <name>扫码带提示</name> " +" <key>rselfmenu_0_0</key> " +" </sub_button> " +" <sub_button> " +" <type>scancode_push</type> " +" <name>扫码推事件</name> " +" <key>rselfmenu_0_1</key> " +" </sub_button> " +" </button> " +" <button> " +" <name>业务查询</name> " +" <sub_button> " +" <type>click</type> " +" <name>订单查询</name> " +" <key>Order_Query</key> " +" </sub_button> " +" " +" <sub_button> " +" <type>click</type> " +" <name>流程查询</name> " +" <key>Process_Query</key> " +" </sub_button> " +" <sub_button> " +" <type>click</type> " +" <name>会员查询</name> " +" <key>Member_Query</key> " +" </sub_button> " +" </button> " +" <button> " +" <type>click</type> " +" <name>帮助</name> " +" <key>BTN_HELP</key> " +" </button> " +" </menu>"; } /// <summary> /// 获取菜单对象集合 /// </summary> /// <param name="xml"></param> /// <returns></returns> public static List<MenuModel> GetMenuModelList(System.Xml.XmlDocument xml) { //xml = new XmlDocument(); // xml.LoadXml(GetTempXmlString());测试用 List<MenuModel> menu_buttons = new List<MenuModel>(); XmlNode xmlNode = xml.SelectSingleNode("menu"); XmlNodeList nodeList = xmlNode.SelectNodes("button"); foreach (XmlNode node in nodeList) { MenuModel menu_button = getMenuModel(node); menu_buttons.Add(menu_button); } return menu_buttons; } static MenuModel getMenuModel(XmlNode node) { MenuModel menu_button = new MenuModel(); try { if (node.SelectSingleNode("name") != null) { menu_button.Name = node.SelectSingleNode("name").InnerText; } if (node.SelectSingleNode("type") != null) { menu_button.Type = (WXMenuType)Enum.Parse(typeof(WXMenuType), node.SelectSingleNode("type").InnerText); } if (node.SelectSingleNode("key") != null) { menu_button.Key = node.SelectSingleNode("key").InnerText; } if (node.SelectSingleNode("url") != null) { menu_button.Url = System.Web.HttpUtility.UrlDecode(node.SelectSingleNode("url").InnerText.Replace("&","&")); } if (node.SelectSingleNode("media_id") != null) { menu_button.Media_id = node.SelectSingleNode("media_id").InnerText; } XmlNodeList sub_nodeList = node.SelectNodes("sub_button"); if (sub_nodeList != null && sub_nodeList.Count > 0) { List<MenuModel> subMenuModelList = new List<MenuModel>(); foreach (XmlNode subNode in sub_nodeList) { subMenuModelList.Add(getMenuModel(subNode)); } menu_button.Sub_buttons = subMenuModelList; } } catch { } return menu_button; } //回调验证证书问题 public static bool CheckValidationResult(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors errors) { // 总是接受 return true; } public static void SetServicePointManagerSecurityProtocol(string url) { System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); if (url.ToLower().StartsWith("https")) { System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls; } else { System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3; } } /// <summary> /// 自定义菜单创建接口 直接返回字符串信息 /// </summary> public static string CreateMenu(string access_token, string content) { SetServicePointManagerSecurityProtocol("https:"); var client = new HttpClient(); var result = client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", access_token), new StringContent(content)).Result; return result.Content.ReadAsStringAsync().Result; } /// <summary> /// 自定义菜单创建接口 /// </summary> /// <param name="token"></param> /// <param name="content"></param> /// <returns></returns> public static bool Create(string access_token, string content) { SetServicePointManagerSecurityProtocol("https:"); var client = new HttpClient(); var result = client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", access_token), new StringContent(content)).Result; return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result).errcode == 0; } /// <summary> /// 自定义菜单查询接口 直接返回字符串信息 /// </summary> public static string GetMenu(string access_token) { SetServicePointManagerSecurityProtocol("https:"); var client = new HttpClient(); var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", access_token)).Result; // if (!result.IsSuccessStatusCode) return "自定义菜单查询接口请求失败..."; return result.Content.ReadAsStringAsync().Result; } /// <summary> /// 自定义菜单查询接口 /// </summary> /// <param name="token"></param> /// <returns></returns> public static dynamic Query(string access_token) { SetServicePointManagerSecurityProtocol("https:"); var client = new HttpClient(); var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", access_token)).Result; if (!result.IsSuccessStatusCode) return null; return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result); } /// <summary> /// 自定义菜单删除接口 /// </summary> /// <param name="token"></param> /// <returns></returns> public static bool Delete(string access_token) { SetServicePointManagerSecurityProtocol("https:"); var client = new HttpClient(); var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", access_token)).Result; if (!result.IsSuccessStatusCode) return false; return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result).errmsg == "ok"; } /// <summary> /// 自定义菜单删除接口 /// </summary> /// <param name="token"></param> /// <returns></returns> public static string DeleteMenu(string access_token) { SetServicePointManagerSecurityProtocol("https:"); var client = new HttpClient(); var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", access_token)).Result; if (!result.IsSuccessStatusCode) return "自定义菜单删除求失败..."; return result.Content.ReadAsStringAsync().Result; } } }