using Operater.DTO.TopMessage; using System; using System.Collections.Generic; using System.Text; using System.Xml; using WeiXinKfSDK.Response; using CommonUtil; using WeiXinKfSDK; using System.Linq; using Operater.DAL; using Operater.DbModel; namespace TradeInterflow.Handle { public class WxKfHandle { public static WxKfToken _wxkfToken = new WxKfToken(); public static List _wxMedia = new List(); /// /// 处理微信客服消息 /// /// public static void HandleExecute(string xmlMessage) { try { Console.WriteLine("微信客服消息"); XmlDocument doc = new XmlDocument(); XmlNode root; doc.LoadXml(xmlMessage); root = doc.FirstChild; string token = root["Token"].InnerText; //根据token获取 信息内容 string accessToken = GetWxKfToken(false); if (accessToken.IsNullOrEmpty()) { return; } SyncMsgResponse msgModel = new SyncMsgResponse(); //获取nextcursor if (_wxkfToken.NextCursor.IsNullOrEmpty()) { var appSet = new AppsetDAL().ListGet(t => t.Id != null); _wxkfToken.NextCursor = appSet[0].WxNextCursor; } while (true) { msgModel = WeiXinKfClient.SyncMsg(token, _wxkfToken.NextCursor, accessToken); if (msgModel.IsNull()) { return; } else if (msgModel.errcode != 0 && (msgModel.errmsg.Contains("invalid access_token") || msgModel.errmsg.Contains("access_token expired"))) {//token不对 accessToken = GetWxKfToken(true); } else if (msgModel.errcode == 0) { break; } else { return; } } //记录nextcursor if (msgModel.msg_list.Count == 0 && msgModel.next_cursor == _wxkfToken.NextCursor) { return; } _wxkfToken.NextCursor = msgModel.next_cursor; Appset appset = new Appset() { WxNextCursor = msgModel.next_cursor }; new AppsetDAL().Update(appset, i => new { i.WxNextCursor }, t => t.Id != null); foreach (var msgItem in msgModel.msg_list) { switch (msgItem.msgtype) { case "event"://事件消息 EventHandle(msgItem); break; case "text"://文本消息 TextHandle(msgItem); break; } } } catch(Exception e) { LogUtil.Info(e.ToString(),"微信客服消息错误"); } } /// /// 文本消息 /// /// private static void TextHandle(SyncMsgListDto msgItem) { switch (msgItem.text.content) { case "100"://发送企微码 SendQwQR(msgItem); break; default: break; } } private static void SendQwQR(SyncMsgListDto msgItem) { //获取图片id string mediaId = GetMediaId("smssign", _wxkfToken.AccessToken); if (mediaId.IsNullOrEmpty()) { return; } SendMsgImgDomain sendMsgImgDomain = new SendMsgImgDomain() { media_id = mediaId }; SendMsgRequest request = new SendMsgRequest() { touser = msgItem.external_userid, open_kfid = msgItem.open_kfid, msgtype = "image", image = sendMsgImgDomain }; //string accessToken = GetWxKfToken(false); //if (accessToken.IsNullOrEmpty()) //{ // return; //} var sendRsp = WeiXinKfClient.SendMsg(request, _wxkfToken.AccessToken); //发送文案 SendMsgTextDomain sendMsgTextDomain = new SendMsgTextDomain() { content = "点开图片-长按识别二维码-添加诺诺领福利啦~" }; request = new SendMsgRequest() { touser = msgItem.external_userid, open_kfid = msgItem.open_kfid, msgtype = "text", text = sendMsgTextDomain }; sendRsp = WeiXinKfClient.SendMsg(request, _wxkfToken.AccessToken); } #region 获取mediaId /// /// 获取mediaId /// /// /// public static string GetMediaId(string mediaType,string accessToken) { var media = _wxMedia.Where(t => t.MediaType == mediaType).ToList(); if (media.IsNull() || media.Count == 0 || media[0].ExpreTime < DateTime.Now) { WxMediaModel wxMediaModel = new WxMediaModel(); var mediaDb = new WxMediaDAL().ListGet(t => t.HandleType == mediaType); if (!mediaDb.IsNull() && mediaDb.Count > 0 && mediaDb[0].ExpireTime > DateTime.Now) { //先从数据库获取 wxMediaModel.MediaId = mediaDb[0].MediaId; wxMediaModel.ExpreTime = (DateTime)mediaDb[0].ExpireTime; wxMediaModel.MediaType = mediaType; } else { //接口获取 string imagName = mediaType + ".png"; string imgPath = System.Environment.CurrentDirectory + "/" + imagName; //string accessToken = GetWxKfToken(false); //if (accessToken.IsNullOrEmpty()) //{ // return null; //} var imgUp = WeiXinKfClient.ImgMediaUpload(imgPath, imagName, accessToken); if (imgUp.IsNull() || imgUp.errcode != 0) { LogUtil.Info($"上传图片错误:{JSONUtil.ObjectToJson(imgUp)}", "错误"); return null; } wxMediaModel.MediaId = imgUp.media_id; wxMediaModel.ExpreTime = DateTime.Now.AddHours(68); wxMediaModel.MediaType = mediaType; //修改数据库 WxMedia wxMedia = new WxMedia() { Id = Guid.NewGuid().ToString(), MediaId = imgUp.media_id, ExpireTime = wxMediaModel.ExpreTime, HandleType = mediaType }; if (!mediaDb.IsNull() && mediaDb.Count > 0) {//修改 new WxMediaDAL().Update(wxMedia, i => new { i.MediaId, i.ExpireTime }, t => t.HandleType == mediaType); } else {//新增 new WxMediaDAL().Insert(wxMedia); } } if (media.Count > 0) { _wxMedia.Remove(media[0]); } _wxMedia.Add(wxMediaModel); return wxMediaModel.MediaId; } return media[0].MediaId; } #endregion private static void EventHandle(SyncMsgListDto msgItem) { if (msgItem.Event.event_type != "enter_session") {//非进入对话框 return; } switch (msgItem.Event.scene) {//进入会话的场景值 case "jd": break; default: EnterSession(msgItem); break; } } #region 处理欢迎语 private static void EnterSession(SyncMsgListDto msgItem) { try { if (msgItem.Event.welcome_code.IsNullOrEmpty()) { return; } SendMsgOnEventRequest welReq = new SendMsgOnEventRequest(); welReq.code = msgItem.Event.welcome_code; welReq.msgid = TopUtil.GetId().ToString(); welReq.msgtype = "text"; string content = "哈喽~\n\n这里是小欧智能小助手\n\n☞回复100\n\n添加专属福利官~"; SendMsgOnEventReqTxt sendMsgOnEventReqTxt = new SendMsgOnEventReqTxt { content = content }; welReq.text = sendMsgOnEventReqTxt; #region msgmenu类型 if (false) { welReq.msgtype = "msgmenu"; List menuList = new List(); //click MenuClick menuClick = new MenuClick() { id = "101", content = "点击按钮" }; SendMsgOnEventReqMenuList click = new SendMsgOnEventReqMenuList() { type = "click", click = menuClick }; menuList.Add(click); //view MenuView menuView = new MenuView() { url = "https://shop120092226.youzan.com/v2/showcase/homepage?alias=EdS1U5LdGX", content = "点击领取优惠" }; SendMsgOnEventReqMenuList view = new SendMsgOnEventReqMenuList() { type = "view", view = menuView }; menuList.Add(view); //miniprogram MenuMiniprogram menuMiniprogram = new MenuMiniprogram() { appid = "wx47cef388625e8b93", pagepath = "pages/home/dashboard/index", content = "点击打开小程序,享受优惠", }; SendMsgOnEventReqMenuList miniprogram = new SendMsgOnEventReqMenuList() { type = "miniprogram", miniprogram = menuMiniprogram }; menuList.Add(miniprogram); //text MenuTxt menuTxt = new MenuTxt() { content = "纯文本的展示展示展示", no_newline = 0 }; SendMsgOnEventReqMenuList text = new SendMsgOnEventReqMenuList() { type = "text", text = menuTxt }; menuList.Add(text); SendMsgOnEventReqMenu menuObj = new SendMsgOnEventReqMenu() { head_content = "头部欢迎语", tail_content = "尾部结束语", list = menuList }; welReq.msgmenu = menuObj; } #endregion string accessToken = GetWxKfToken(false); if (accessToken.IsNullOrEmpty()) { return; } var sendRsp = WeiXinKfClient.SendMsgOnEvent(welReq, accessToken); } catch (Exception e) { LogUtil.Info($"处理欢迎语失败:{e.ToString()}", "微信客服error"); } } #endregion #region 获取微信客服accesstoken public static string GetWxKfToken(bool isRestart) { string cacheName = "wxkf_acctoken"; if (isRestart) { _wxkfToken = null; } if (_wxkfToken.IsNull() || _wxkfToken.AccessToken.IsNullOrEmpty() || _wxkfToken.ExpressTime < DateTime.Now) {//从接口获取 var topToken = WeiXinKfClient.GetAccessToken(); if (topToken.IsNull()) { return null; } if (topToken.errcode != 0) { LogUtil.Info($"获取accesstoken失败:{topToken.errmsg}", "微信客服error"); return null; } _wxkfToken = new WxKfToken(); _wxkfToken.AccessToken = topToken.access_token; _wxkfToken.ExpressTime = DateTime.Now.AddHours(2); return topToken.access_token; } return _wxkfToken.AccessToken; } #endregion } }