热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#.net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单

这篇文章主要介绍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
{
    /// 
    /// 微信公共服务类
    /// 
    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 XmlEntityExchange where 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 + "");
                else
                    builder.Append("<" + 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微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单 相关文章请关注!

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
細亞米奇Mego_677
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有