C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定
成为开发者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{/// <summary>/// 微信公共服务类/// </summary>public class RobotController : BaseController{/// <summary>/// 接收微信请求接口,认证的接口/// </summary>/// <returns></returns>public ContentResult Index(){string result = AnalyzeXmlFromWeiXin();return Content(result);}/// <summary>/// 分析微信POST到本服务器的XML数据/// </summary>/// <param name="xmlStream"></param>/// <returns></returns>private string AnalyzeXmlFromWeiXin(){StreamReader reader = new StreamReader(Request.InputStream);string xml = reader.ReadToEnd();//获取MsgTypelog.Info(xml);string msgType = XmlHelper.ReadXmlStr(xml, "/xml/MsgType", "");switch (msgType){case "event"://如果是事件return OnAttention(xml);case "text"://如果是文本消息return OnReceiveTextMsg(xml);default:return "不被支持的关键字!";}}/// <summary>/// 响应文本消息/// </summary>/// <param name="xml"></param>/// <returns></returns>private string OnReceiveTextMsg(string xml){WxTextMsg msg = XmlEntityExchange<WxTextMsg>.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<WxTextMsg>.ConvertEntity2Xml(msg);}/// <summary>/// 获取帮助菜单文档/// </summary>/// <returns></returns>private string HelpDocument(){StringBuilder sb = new StringBuilder();sb.Append("HI,请回复数字,选择服务").Append("nn");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();}/// <summary>/// 当用户关注微信帐号的时候触发,事件响应/// </summary>/// <param name="xml"></param>private string OnAttention(string xml){WxEvent wxevent = XmlEntityExchange<WxEvent>.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<WxTextMsg>.ConvertEntity2Xml(msg);log.Info(rst);return rst;}}}辅助类//实体public class WxEvent{/// <summary>/// 接收人/// </summary>public string ToUserName { get; set; }/// <summary>/// 发送人/// </summary>public string FromUserName { get; set; }/// <summary>/// 时间/// </summary>public string CreateTime { get; set; }/// <summary>/// 类型/// </summary>public string MsgType { get; set; }/// <summary>/// 事件/// </summary>public string Event { get; set; }public string EventKey { get; set; }}public class WxTextMsg{/// <summary>/// 接收人/// </summary>public string ToUserName { get; set; }/// <summary>/// 发送人/// </summary>public string FromUserName { get; set; }/// <summary>/// 时间/// </summary>public long CreateTime { get; set; }/// <summary>/// 类型/// </summary>public string MsgType { get; set; }/// <summary>/// 内容/// </summary>public string Content { get; set; }}//XML和实体对象间的相互转化namespace ElegantWM.WebUI.Areas.WeiXin{public class XmlEntityExchange<T> where T : new(){/// <summary>/// 将XML转换为对象/// </summary>/// <param name="xml"></param>/// <returns></returns>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){//初始化propertyinfoif (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;}/// <summary>/// 构造微信消息/// </summary>/// <param name="t">对象实体</param>/// <returns>返回微信消息xml格式</returns>public static string ConvertEntity2Xml(T t){StringBuilder builder = new StringBuilder();builder.Append("<xml>");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 + ">");elsebuilder.Append("<" + pi.Name + "><![CDATA[" + value + "]]></" + pi.Name + ">");}builder.Append("</xml>");return builder.ToString();}}}
基础类:http请求/* * * Copyright