示例#1
0
        /// <summary>
        /// 处理图片请求
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage)
        {
            var content = new
            {
                msgType = "image",
                mediaId = requestMessage.MediaId
            };

            var data = new RequestMsgData();

            data.MsgId        = requestMessage.MsgId;
            data.Content      = Newtonsoft.Json.JsonConvert.SerializeObject(content);
            data.CreateTime   = requestMessage.CreateTime;
            data.FromUserName = requestMessage.FromUserName;
            data.ToUserName   = requestMessage.ToUserName;
            data.MsgType      = requestMessage.MsgType;
            db.AddToRequestMsgData(data);
            db.SaveChanges();

            var accessToken = Senparc.Weixin.MP.Containers.AccessTokenContainer.TryGetAccessToken(appId, appSecret);
            var fileName    = CustomerMessage.GetCachePathForTemporaryMedia(requestMessage.MediaId);

            using (FileStream fs = new FileStream(fileName, FileMode.Create))
            {
                MediaApi.Get(accessToken, requestMessage.MediaId, fs);
            }

            return(null);
        }
示例#2
0
        public static RequestMsgData AddToRequestMsgData(this DbContext db, RequestMsgData model)
        {
            db.Set <RequestMsgData>().Add(model);
            //判断接入表
            var session = db.QueryCustomerSession()
                          .Where(m => m.OpenId == model.FromUserName)
                          .FirstOrDefault();

            if (session == null)
            {
                //未接入
                //添加一条接入纪录
                session = new CustomerSession()
                {
                    OpenId = model.FromUserName,
                    Time   = model.CreateTime,
                    Worker = "",
                    Status = CustomerSessionStatus.未接入
                };
                db.AddToCustomerSession(session);
            }
            //更新时间
            session.Time = DateTime.Now;
            //插入到客服的聊天纪录中
            var msg = new CustomerMessage()
            {
                FromUser = model.FromUserName,
                Time     = model.CreateTime,
                ToUser   = session.Worker,    //如果为关闭或者未接入,这里是空
                Content  = model.Content,
                ChatFlag = model.FromUserName //这里使用OpenId作为交流的标识
            };

            db.AddToCustomerMessage(msg);

            //客服接入
            if (session.Status == CustomerSessionStatus.客服接入)
            {
            }
            else if (session.Status == CustomerSessionStatus.序接入)
            {
                //暂时未实现
            }
            else if (session.Status == CustomerSessionStatus.未接入)
            {
                //暂时未实现
            }
            else if (session.Status == CustomerSessionStatus.关闭)
            {
                //重启为未接入
                session.Status = CustomerSessionStatus.未接入;
            }
            //程序接入
            return(model);
        }
示例#3
0
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            _logger.LogTrace(string.Format("post:进入handler"));
            try
            {
                var defaultResponseMessage = base.CreateResponseMessage <ResponseMessageText>();

                var xml = RequestDocument.ToString();
                _logger.LogTrace(string.Format("post:{0}", xml));

                var data = new RequestMsgData();
                data.MsgId   = requestMessage.MsgId;
                data.Content = Newtonsoft.Json.JsonConvert.SerializeObject(new
                {
                    msgType = "text",
                    text    = requestMessage.Content
                });
                data.CreateTime   = requestMessage.CreateTime;
                data.FromUserName = requestMessage.FromUserName;
                data.ToUserName   = requestMessage.ToUserName;
                data.MsgType      = requestMessage.MsgType;
                db.AddToRequestMsgData(data);
                db.SaveChanges();

                _logger.LogTrace(string.Format("post:原始数据保存成功"));


                //绑定会员功能,此处用输入账号密码来实现
                if (!string.IsNullOrWhiteSpace(requestMessage.Content) && requestMessage.Content.StartsWith("bd#"))
                {
                    string emailPwd = requestMessage.Content.Substring(2);
                    var    member   = db.MemberDbSet().FirstOrDefault(p => p.Email != null && p.Email.Trim() != string.Empty && (p.Email + p.Password) == emailPwd);
                    if (member != null)
                    {
                        var memberWechat = db.QueryMemberWechat().FirstOrDefault(p => p.MemberId == member.Id);
                        if (memberWechat != null)
                        {
                            memberWechat.OpenId = requestMessage.FromUserName;
                        }
                        else
                        {
                            memberWechat = new MemberWechat()
                            {
                                OpenId = requestMessage.FromUserName, MemberId = member.Id
                            };
                            db.Add(memberWechat);
                        }
                        db.SaveChanges();
                    }
                }

                var robotMessages = db.QueryRobotMessage()
                                    .Where(m => !m.IsDel)
                                    .Where(m => m.Status == RobotMessageStatus.正常)
                                    .Select(m => new
                {
                    Question     = m.Question,
                    Answer       = m.Answer,
                    QuestionType = m.QuestionType
                })
                                    .ToList();
                _logger.LogTrace($"post:尝试自动回复,共条{robotMessages.Count}自动回复内容");

                var question     = requestMessage.Content;
                var textResponse = robotMessages.Where(m => m.QuestionType == RobotMessageQuestionType.文本)
                                   .Where(m => m.Question == question)
                                   .FirstOrDefault();
                if (textResponse != null)
                {
                    if (textResponse.Answer.StartsWith("image:"))
                    {
                        var tmpMessage = CreateResponseMessage <ResponseMessageImage>();
                        tmpMessage.Image.MediaId = textResponse.Answer.Replace("images:", "");
                        return(tmpMessage);
                    }
                    else if (textResponse.Answer.StartsWith("video:"))
                    {
                        var tmpMessage = CreateResponseMessage <ResponseMessageVideo>();
                        tmpMessage.Video.MediaId = textResponse.Answer.Replace("video:", "");
                        return(tmpMessage);
                    }
                    else if (textResponse.Answer.StartsWith("voice:"))
                    {
                        var tmpMessage = CreateResponseMessage <ResponseMessageVoice>();
                        tmpMessage.Voice.MediaId = textResponse.Answer.Replace("voice:", "");
                        return(tmpMessage);
                    }
                    else if (textResponse.Answer.StartsWith("music:"))
                    {
                        var tmpMessage = CreateResponseMessage <ResponseMessageMusic>();
                        tmpMessage.Music.ThumbMediaId = textResponse.Answer.Replace("music:", "");
                        return(tmpMessage);
                    }
                    else if (textResponse.Answer.StartsWith("news:"))
                    {
                        var mediaId = textResponse.Answer.Replace("news:", "");
                        Task.Factory.StartNew(() =>
                        {
                            Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendMpNews(GetAccessToken(), base.WeixinOpenId, mediaId);
                        });
                        return(null);
                    }
                    else
                    {
                        defaultResponseMessage.Content = textResponse.Answer;
                        return(defaultResponseMessage);
                    }
                }

                var regexResponse = robotMessages.Where(m => m.QuestionType == RobotMessageQuestionType.正则)
                                    .Where(m => System.Text.RegularExpressions.Regex.IsMatch(question, m.Question, System.Text.RegularExpressions.RegexOptions.None))
                                    .FirstOrDefault();

                if (regexResponse != null)
                {
                    defaultResponseMessage.Content = regexResponse.Answer;
                    return(defaultResponseMessage);
                }

                //这个没效果,仍然会弹出“该公众号暂时无法提供服务,请稍后再试”
                //return base.CreateResponseMessage<ResponseMessageNoResponse>();
                return(new SuccessResponseMessage());
            }
            catch (Exception ex)
            {
                _logger.LogError(new EventId(-100), ex, "OnTextRequest Error");
                return(new SuccessResponseMessage());
            }
        }