123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- /*--------------------------------------------------------------------------
- * 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;
- }
- }
- }
|