Esempio n. 1
0
        /// <summary>
        /// 配置关键字响应,菜单响应
        /// </summary>
        /// <param name="sid">公众账号ID</param>
        /// <param name="type">类型,text,news,svrtext,svrnews</param>
        /// <param name="msg">消息</param>
        /// <param name="kid">关键字ID</param>
        /// <param name="keyword">用户输入的值需要传递过来</param>
        /// <returns></returns>
        private static string KeyWordRouter(string sid, string type, WxTextMsg msg, Guid kid, string keyword = "")
        {
            if (type == "text" || type == "svrtext" || type == "svrnews")
            {
                IEnumerable<WX_RespImgTxt> rspList = WMFactory.WXRespImgTxt.FindByConditions(null, f => f.KwId == kid);
                if (rspList == null || rspList.Count() <= 0)
                    return null;
                WX_RespImgTxt resp = rspList.FirstOrDefault();

                if (type == "text")
                {
                    //替换关键字
                    msg.MsgType = "text";
                    msg.Content = resp.Content.Replace("{SID}", sid).Replace("{OID}", msg.ToUserName).Replace("{KID}", kid.ToString());
                    return XmlEntityExchange<WxTextMsg>.ConvertEntity2Xml(msg);
                }
                else if (type == "svrnews")
                {

                    resp.AbsUrl += resp.AbsUrl.Contains("?") ? "&" : "?" + "sid=" + sid + "&oid=" + msg.ToUserName + "&mid=" + kid + "&kw=" + HttpUtility.UrlEncode(keyword);
                    string svrRst = Tools.HttpCrossDomain.Post(resp.AbsUrl, resp.Content);
                    string template = @"<xml>
                                            <ToUserName><![CDATA[{0}]]></ToUserName>
                                            <FromUserName><![CDATA[{1}]]></FromUserName>
                                            <CreateTime>{2}</CreateTime>
                                            <MsgType><![CDATA[news]]></MsgType><ArticleCount>{4}</ArticleCount>{3}</xml>";

                    //获取记录条数Regex.Matches(svrXml, "<item>").Count
                    return string.Format(template, msg.ToUserName, msg.FromUserName, msg.CreateTime, svrRst, Regex.Matches(svrRst, "<item>").Count);
                }
                else if (type == "svrtext")
                {
                    resp.AbsUrl += resp.AbsUrl.Contains("?") ? "&" : "?" + "sid=" + sid + "&oid=" + msg.ToUserName + "&mid=" + kid + "&kw=" + HttpUtility.UrlEncode(keyword);
                    string svrRst = Tools.HttpCrossDomain.Post(resp.AbsUrl, resp.Content);
                    msg.MsgType = "text";
                    msg.Content = svrRst.Replace("{SID}", sid).Replace("{OID}", msg.ToUserName).Replace("{KID}", kid.ToString());
                    return XmlEntityExchange<WxTextMsg>.ConvertEntity2Xml(msg);
                }
            }
            else if (type == "news")
            {
                int total = 0;
                //随机
                //IEnumerable<WX_RespImgTxt> rspNewsList = WMFactory.WXRespImgTxt.FindByPage(0, 10, out total, o => o.OrderBy(n => Guid.NewGuid()), f => f.KwId == kid && f.IsShow == 0);

                //不随机
                IEnumerable<WX_RespImgTxt> rspNewsList = WMFactory.WXRespImgTxt.FindByPage(0, 10, out total, o => o.OrderByDescending(a => a.IsMain).ThenBy(x => x.OrderIndex), f => f.KwId == kid && f.IsShow == 0);

                if (rspNewsList != null && rspNewsList.Count() > 0)
                {
                    string dns = "http://" + HttpContext.Current.Request.Url.Authority;
                    WxNewsMsg newsMsg = new WxNewsMsg();
                    newsMsg.MsgType = "news";
                    newsMsg.ToUserName = msg.ToUserName;
                    newsMsg.FromUserName = msg.FromUserName;
                    newsMsg.CreateTime = DateTime.Now.Ticks;
                    newsMsg.Articles = new List<Article>();

                    //newsMsg.ArticleCount = 1;
                    //WX_RespImgTxt rsp = rspNewsList.FirstOrDefault();
                    //Article art = new Article();
                    //art.Description = rsp.Description;
                    //art.Title = rsp.Title;
                    //if (rsp.AbsUrl == "NULL")
                    //    art.Url = "";
                    //else
                    //    art.Url = (string.IsNullOrEmpty(rsp.AbsUrl) ? dns + "/WeiXin/Article/Index/" + rsp.Id.ToString() : rsp.AbsUrl.Trim());
                    ////将当前服务号和当前用户openid传到url里
                    //string prms = art.Url.Contains("?") ? "&" : "?";
                    //art.Url += prms + "sid=" + sid + "&oid=" + msg.ToUserName + "&kid=" + kid.ToString();
                    //art.PicUrl = (string.IsNullOrEmpty(rsp.ImageUrl)) ? "" : dns + "/Content/Uploads/" + rsp.ImageUrl;
                    //newsMsg.Articles.Add(art);

                    newsMsg.ArticleCount = rspNewsList.Count();//图文数量
                    foreach (WX_RespImgTxt rsp in rspNewsList)
                    {
                        Article art = new Article();
                        art.Description = rsp.Description;
                        art.Title = rsp.Title;
                        if (rsp.AbsUrl == "NULL")
                            art.Url = "";
                        else
                            art.Url = (string.IsNullOrEmpty(rsp.AbsUrl) ? dns + "/WeiXin/Article/Index/" + rsp.Id.ToString() : rsp.AbsUrl.Trim());
                        //将当前服务号和当前用户openid传到url里
                        string prms = art.Url.Contains("?") ? "&" : "?";
                        art.Url += prms + "sid=" + sid + "&oid=" + msg.ToUserName + "&kid=" + kid.ToString();
                        art.PicUrl = (string.IsNullOrEmpty(rsp.ImageUrl)) ? "" : dns + "/Content/Uploads/" + rsp.ImageUrl;
                        newsMsg.Articles.Add(art);
                    }


                    return XmlEntityExchange<WxNewsMsg>.ConvertEntity2Xml(newsMsg);
                }
            }
            return null;
        }
Esempio n. 2
0
        /// <summary>
        /// 响应事件
        /// </summary>
        /// <param name="xml"></param>
        private static string EventRouter(string sid, 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;
            string strScene_ID; //场景号
            Guid guidAccountid = Guid.Parse(sid);
            WX_Account account = (WX_Account)CacheHelper.CacheValue(sid);

            //如果是关注,则发送欢迎消息
            switch (wxevent.Event)
            {
                #region 关注
                case "subscribe":   //关注
                    {
                        if (wxevent.EventKey.Contains("qrscene") == true)//关注如果包含二维码扫描参数
                        {
                            strScene_ID = wxevent.EventKey.Substring(8, wxevent.EventKey.Length - 8) + ",";
                            IEnumerable<WX_KeyWord> KeyWordFirst = WMFactory.WXKeyWord.FindByConditions(null, f => f.AccountId == guidAccountid
                                                                                                        && f.KwList == strScene_ID, null);
                            if (KeyWordFirst == null)
                            {
                                msg.MsgType = "text";
                                msg.Content = account.WelcomeWord;
                                AddFans(wxevent, account);
                                break;
                            }
                            else
                            {
                                AddFans(wxevent, account);
                                AddSCANWxEvent(wxevent, account, true);
                                return KeyWordRouter(sid, KeyWordFirst.First().RespType, msg, KeyWordFirst.First().Id);
                            }
                        }
                        else
                        {
                            msg.Content = account.WelcomeWord;
                            if (account.WelcomeWord.Contains("首次关注图文"))
                            {
                                msg.Content = "首次关注图文";

                                IEnumerable<WX_KeyWord> KeyWordFirst = WMFactory.WXKeyWord.FindByConditions(null, f => f.AccountId == guidAccountid && "首次关注图文,".Contains(f.KwList), null);
                                if (KeyWordFirst == null)
                                {
                                    msg.MsgType = "text";
                                    msg.Content = account.WelcomeWord;
                                    AddFans(wxevent, account);
                                    break;
                                }
                                else
                                {
                                    AddFans(wxevent, account);
                                    return KeyWordRouter(sid, KeyWordFirst.First().RespType, msg, KeyWordFirst.First().Id);
                                }
                            }
                            else
                            {
                                msg.MsgType = "text";
                                msg.Content = account.WelcomeWord;
                                AddFans(wxevent, account);
                                break;
                            }
                        }
                    }
                case "unsubscribe": //取消关注
                    msg.MsgType = "text";
                    RemoveFans(wxevent, Guid.Parse(sid));
                    break;

                #endregion

                #region 单击

                case "CLICK":
                    //单击菜单的时候,获取菜单ID,找到该菜单的类型,找到对应的文本
                    WX_Menu menu = WMFactory.WXMenu.GetById(wxevent.EventKey);
                    if (menu == null)
                    {
                        msg.MsgType = "text";
                        msg.Content = "暂无事件设定!";
                        break;
                    }
                    return KeyWordRouter(sid, menu.RespType, msg, menu.Id);

                #endregion

                #region 扫描二维码

                case "SCAN":


                    //strScene_ID = int.Parse(wxevent.EventKey.Substring(8, wxevent.EventKey.Length - 8));
                    string iEventKey = wxevent.EventKey + ",";
                    //WX_QR_Code WX_QR_CodeListQR = WMFactory.WX_QR_Code.FindByConditions(null, f => f.AccountId == AccountidSCAN && f.Scene_ID == iEventKey, null).First();
                    //string KwListQR = WX_QR_CodeListQR.Scene_ID.ToString() + ",";
                    //string KwListQR = "1000,";
                    //IEnumerable<WX_KeyWord> KeyWordFirstQR = WMFactory.WXKeyWord.FindByConditions(null, f => f.AccountId == AccountidSCAN && f.KwList == KwListQR, null);
                    WX_KeyWord KeyWordFirstQR = WMFactory.WXKeyWord.FindByConditions(null, f => f.AccountId == guidAccountid && f.KwList == iEventKey, null).First();

                    if (KeyWordFirstQR == null)
                    {
                        break;
                    }
                    else
                    {
                        AddSCANWxEvent(wxevent, account, false);
                        return KeyWordRouter(sid, KeyWordFirstQR.RespType, msg, KeyWordFirstQR.Id);
                    }

                #endregion

                default:
                    msg.MsgType = "text";
                    msg.Content = "暂未处理的事件:Event" + wxevent.Event + ";EventKey:" + wxevent.EventKey;
                    break;
            }
            string rst = XmlEntityExchange<WxTextMsg>.ConvertEntity2Xml(msg);
            return rst;
        }