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