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<WxMediaModel> _wxMedia = new List<WxMediaModel>();
|
/// <summary>
|
/// 处理微信客服消息
|
/// </summary>
|
/// <param name="message"></param>
|
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(),"微信客服消息错误");
|
}
|
|
}
|
|
/// <summary>
|
/// 文本消息
|
/// </summary>
|
/// <param name="msgItem"></param>
|
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
|
/// <summary>
|
/// 获取mediaId
|
/// </summary>
|
/// <param name="mediaType"></param>
|
/// <returns></returns>
|
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<SendMsgOnEventReqMenuList> menuList = new List<SendMsgOnEventReqMenuList>();
|
//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
|
}
|
}
|