C# .net微信開發,開發認證,關注觸發訊息,自動應答,事件回應,自訂選單

高洛峰
發布: 2017-02-13 12:00:29
原創
2725 人瀏覽過
成為開發者


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"]);
}
登入後複製


關注帳號,訊息,自動應答,事件回應

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

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("\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();
        }

        /// <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;
        }
    }
}
登入後複製

C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单 基礎類:http請求C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单

//实体
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; }
    }
登入後複製

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

//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();
        }
    }
}
登入後複製


獲取和更新選單

事件回應,自訂選單 相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!