• 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();
                //获取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 "不被支持的关键字!";
                }
            }
    
            /// <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("
    
    ");
                sb.Append("1. 当前时间").Append("
    ");
                sb.Append("2. 天气信息").Append("
    ");
                sb.Append("3. 聊天唠嗑").Append("
    ");
                sb.Append("n. 更多服务开发中...").Append("
    ");
                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)
                {
                    //初始化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;
            }
    
            /// <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 + ">");
                    else
                        builder.Append("<" + pi.Name + "><![CDATA[" + value + "]]></" + pi.Name + ">");
                }
                builder.Append("</xml>");
                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
        {
            /// <summary>
            /// 跨域访问
            /// </summary>
            /// <param name="url"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            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);
            }
    
            /// <summary>
            /// 跨域访问
            /// </summary>
            /// <param name="url"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            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
        {
            /// <summary>
            /// 获取微信凭证
            /// </summary>
            /// <returns></returns>
            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);
            }
        }

    获取和更新菜单

    /// <summary>
            /// 获取微信菜单
            /// </summary>
            /// <returns></returns>
            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);
            }
            /// <summary>
            /// 创建Menu
            /// </summary>
            /// <param name="json"></param>
            /// <returns></returns>
            [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);
            }

    菜单的json格式: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

  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/qidian10/p/3492751.html
Copyright © 2020-2023  润新知