string[] ArrTmp = { "token", Request["timestamp"], Request["nonce"] }; Array.Sort(ArrTmp); //字典排序string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); tmpStr = tmpStr.ToLower();if (tmpStr != Request["signature"].ToLower()) { Response.Write(Request["echostr"]); }
namespace ElegantWM.WebUI.Areas.WeiXin.Controllers { ////// 微信公共服务类 /// public class RobotController : BaseController { ////// 接收微信请求接口,认证的接口 /// ///public ContentResult Index() { string result = AnalyzeXmlFromWeiXin(); return Content(result); } /// /// 分析微信POST到本服务器的XML数据 /// /// ///private string AnalyzeXmlFromWeiXin() { StreamReader reader = new StreamReader(Request.InputStream); string xml = reader.ReadToEnd(); //获取MsgType log.Info(xml); string msgType = XmlHelper.ReadXmlStr(xml, "/xml/MsgType", ""); switch (msgType) { case "event"://如果是事件 return OnAttention(xml); case "text"://如果是文本消息 return OnReceiveTextMsg(xml); default: return "不被支持的关键字!"; } } /// /// 响应文本消息 /// /// ///private string OnReceiveTextMsg(string xml) { WxTextMsg msg = XmlEntityExchange .ConvertXml2Entity(xml); //返回消息,互换收发用户 string toUser = msg.FromUserName; msg.FromUserName = msg.ToUserName; msg.ToUserName = toUser; switch (msg.Content.Trim()) { case "?": msg.COntent= HelpDocument(); break; case "?": msg.COntent= HelpDocument(); break; case "1": msg.COntent= DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); break; case "2": msg.COntent= Tools.HttpCrossDomain.Get("http://www.weather.com.cn/data/sk/101210301.html"); break; case "3": msg.COntent= "来吧,想唠点什么呢? [偷笑]"; break; case "你是男的女的": msg.COntent= "姑娘一枚 [偷笑]"; break; default: msg.COntent= "抱歉哦,我不认识您输入的命令。/害羞 /:,@-D"; break; } return XmlEntityExchange .ConvertEntity2Xml(msg); } /// /// 获取帮助菜单文档 /// ///private string HelpDocument() { StringBuilder sb = new StringBuilder(); sb.Append("HI,请回复数字,选择服务").Append("\n\n"); sb.Append("1. 当前时间").Append("\n"); sb.Append("2. 天气信息").Append("\n"); sb.Append("3. 聊天唠嗑").Append("\n"); sb.Append("n. 更多服务开发中...").Append("\n"); sb.Append("回复【?】显示此帮助菜单"); return sb.ToString(); } /// /// 当用户关注微信帐号的时候触发,事件响应 /// /// private string OnAttention(string xml) { WxEvent wxevent = XmlEntityExchange.ConvertXml2Entity(xml); WxTextMsg msg = new WxTextMsg(); msg.ToUserName = wxevent.FromUserName; msg.FromUserName = wxevent.ToUserName; msg.CreateTime = DateTime.Now.Ticks; msg.MsgType = "text"; //如果是关注,则发送欢迎消息 switch (wxevent.Event) { case "subscribe": msg.COntent= System.Configuration.ConfigurationManager.AppSettings["DefaultWxMsg"]; break; case "CLICK": msg.COntent= "您单击的是:" + wxevent.EventKey; break; default: msg.COntent= "暂未处理的事件:Event" + wxevent.Event + ";EventKey:" + wxevent.EventKey; break; } string rst = XmlEntityExchange .ConvertEntity2Xml(msg); log.Info(rst); return rst; } } }
辅助类
//实体 public class WxEvent { ////// 接收人 /// public string ToUserName { get; set; } ////// 发送人 /// public string FromUserName { get; set; } ////// 时间 /// public string CreateTime { get; set; } ////// 类型 /// public string MsgType { get; set; } ////// 事件 /// public string Event { get; set; } public string EventKey { get; set; } } public class WxTextMsg { ////// 接收人 /// public string ToUserName { get; set; } ////// 发送人 /// public string FromUserName { get; set; } ////// 时间 /// public long CreateTime { get; set; } ////// 类型 /// public string MsgType { get; set; } ////// 内容 /// public string Content { get; set; } }
//XML和实体对象间的相互转化 namespace ElegantWM.WebUI.Areas.WeiXin { public class XmlEntityExchangewhere T : new() { /// /// 将XML转换为对象 /// /// ///public static T ConvertXml2Entity(string xml) { XmlDocument doc = new XmlDocument(); PropertyInfo[] propinfos = null; doc.LoadXml(xml); XmlNodeList nodelist = doc.SelectNodes("/xml"); T entity = new T(); foreach (XmlNode node in nodelist) { //初始化propertyinfo if (propinfos == null) { Type objtype = entity.GetType(); propinfos = objtype.GetProperties(); } //填充entity类的属性 foreach (PropertyInfo pi in propinfos) { XmlNode cnode = node.SelectSingleNode(pi.Name); pi.SetValue(entity, Convert.ChangeType(cnode.InnerText, pi.PropertyType), null); } } return entity; } /// /// 构造微信消息 /// /// 对象实体 ///返回微信消息xml格式 public static string ConvertEntity2Xml(T t) { StringBuilder builder = new StringBuilder(); builder.Append(""); Type objtype = t.GetType(); //填充entity类的属性 foreach (PropertyInfo pi in objtype.GetProperties()) { object obj = pi.GetValue(t); string value = obj == null ? "" : obj.ToString(); if (pi.PropertyType.Name.ToLower() == "int64") builder.Append("<" + pi.Name + ">" + value + "" + pi.Name + ">"); else builder.Append("<" + pi.Name + ">" + pi.Name + ">"); } builder.Append(" "); return builder.ToString(); } } }
基础类:http请求
/* * * Copyright © 2013 CCT All Rights Reserved * 作者:JackChain * 时间:2013/8/23 18:21:23 * 功能:跨域访问 * 版本:V1.0 * * 修改人: * 修改点: * */namespace ElegantWM.Tools { public class HttpCrossDomain { ////// 跨域访问 /// /// /// ///public static string Post(string url, string param, int time = 60000) { Uri address = new Uri(url); HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; request.Method = "POST"; request.COntentType= "application/json;charset=utf-8"; //"application/x-www-form-urlencoded"; request.Timeout = time; byte[] byteData = UTF8Encoding.UTF8.GetBytes(param == null ? "" : param); request.COntentLength= byteData.Length; using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } string result = ""; using (HttpWebResponse respOnse= request.GetResponse() as HttpWebResponse) { StreamReader reader = new StreamReader(response.GetResponseStream()); result = reader.ReadToEnd(); } return (result); } /// /// 跨域访问 /// /// /// ///public static string Get(string url, int time = 60000) { Uri address = new Uri(url); HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; request.Method = "GET"; request.COntentType= "application/json;charset=utf-8"; //"application/x-www-form-urlencoded"; request.Timeout = time; string result = ""; using (HttpWebResponse respOnse= request.GetResponse() as HttpWebResponse) { StreamReader reader = new StreamReader(response.GetResponseStream()); result = reader.ReadToEnd(); } return (result); } } }
获取Token:
public class CommonController : Controller { ////// 获取微信凭证 /// ///public JsonResult GetWxCredential() { string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}"; url = string.Format(url, ConfigurationManager.AppSettings["AppId"], ConfigurationManager.AppSettings["AppSecret"]); string rst = HttpCrossDomain.Get(url); if (rst.Contains("access_token")) { string tokenId=rst.Replace("{\"access_token\":\"", "").Replace("\",\"expires_in\":7200}", ""); CacheHelper.CacheInsertAddMinutes("access_token",tokenId,120); return Json(tokenId, JsonRequestBehavior.AllowGet); } else return Json(rst, JsonRequestBehavior.AllowGet); } }
获取和更新菜单
////// 获取微信菜单 /// ///public JsonResult Get() { string url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token="; if (CacheHelper.CacheValue("access_token") != null) { url = url + CacheHelper.CacheValue("access_token").ToString(); } string rst = HttpCrossDomain.Get(url); return Json(rst,JsonRequestBehavior.AllowGet); } /// /// 创建Menu /// /// ///[HttpPost] public JsonResult Create(string json) { string url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="; if (CacheHelper.CacheValue("access_token") != null) { url = url+CacheHelper.CacheValue("access_token").ToString(); } string rst = HttpCrossDomain.Post(url, json); return Json(rst); }
更多C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单 相关文章请关注PHP中文网!