zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HTML标签和属性三
    HTML标签和属性二
    HTML标签和属性一
    小程序相关面试题
    Vue路由的hash模式与history模式的区别?
    android中VideoView播放sd卡上面的视频
    Android中app开机自启动的开发
    java中byte,byte[]和int之间的转换
    Android多activity启动两种方式浅谈
    Android开发用到的几种常用设计模式浅谈(一):组合模式
  • 原文地址:https://www.cnblogs.com/qidian10/p/3492751.html
Copyright © 2011-2022 走看看