TG.WXCRM.V4/AppletMvcService/Controllers/WxMessageSvrController.cs

715 lines
27 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AppletMvcService.Common;
using AppletMvcService.Hanlder;
using AppletMvcService.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using WX.CRM.Common;
using WX.CRM.Model.weapp;
namespace AppletMvcService.Controllers
{
//[EnableCors("http://localhost:10229", "*", "*")]
public class WxMessageSvrController : Controller
{
#region
//
// GET: /WxMessageSvr/
public string AppletMsg(AppletMsgModel appletMsg, string signature, string timestamp, string nonce)
{
try
{
if (ConfigurationManager.AppSettings["weappIsTest"] != null && ConfigurationManager.AppSettings["weappIsTest"] == "false")
{ //不是测试的有些数据需要转发到测试站点去
if (MessageHandler.GetWxAccount().ContainsKey(appletMsg.ToUserName) && MessageHandler.GetWxAccount()[appletMsg.ToUserName].isonline == 0)
{
return AppletMsgRedirect(appletMsg, signature, timestamp, nonce);
}
}
//LogHelper.Info("数据:" + Utility.ConvertToJSON(appletMsg));
if (!IsFromWxServ(signature, timestamp, nonce))
{
//LogHelper.Info("验证失败");
return "fail";
}
//LogHelper.Info("验证成功");
//LogHelper.Info(string.Format("FromUserName:{0},MsgId:{1},MsgType:{2},ToUserName:{3},Content:{4}", appletMsg.FromUserName, appletMsg.MsgId, appletMsg.MsgType, appletMsg.ToUserName, appletMsg.Content));
string eid = "1";
int isNew = 0;
int isNeedSendMsg = 1;//是否需要发送提示消息到前段
int ntype = 1;//1.普通消息 2.关注 3.取消关注 0界面操作
int isNeedFenPei = 1;
string msgType = "txt";//消息类型
if (MessageHandler.GetWxAccount().ContainsKey(appletMsg.ToUserName))
{
if (appletMsg.MsgType == "event" && appletMsg.Event == "subscribe")//关注和取消关注
{
msgType = "subscribe";
appletMsg.Content = "关注了公众号!";
ntype = 2;
MessageHandler.weapp_update_subscribe(appletMsg.FromUserName, appletMsg.Event, DateTimeTool.GetTimeFromLinuxShortTime(appletMsg.CreateTime), appletMsg.ToUserName);
}
else if (appletMsg.MsgType == "event" && appletMsg.Event == "unsubscribe")
{
msgType = "unsubscribe";
appletMsg.Content = "取消了公众号关注!";
ntype = 3;
MessageHandler.weapp_update_subscribe(appletMsg.FromUserName, appletMsg.Event, DateTimeTool.GetTimeFromLinuxShortTime(appletMsg.CreateTime), appletMsg.ToUserName);
//isNeedSendMsg = 0;
isNeedFenPei = 1;
}
else if (appletMsg.MsgType == "event")
{
ntype = 0;
isNeedSendMsg = 0;
}
if (isNeedFenPei == 1)//需要分配
eid = MessageHandler.GetFenPeiEID(ntype, appletMsg.FromUserName, "", appletMsg.ToUserName, MessageHandler.GetWxAccount()[appletMsg.ToUserName].fenPeiPoc, ref isNew);
}
//LogHelper.Error("isNew:" + isNew);
bool issucced = MessageHandler.appletmsg.WeapAddMessage(appletMsg, Convert.ToInt32(eid), 0, 0);//插入消息表
if (appletMsg.MsgType == "image")
{
//图片类型,进行图片下载
msgType = "image";
string imagepath = DownLoadPath(appletMsg.PicUrl);
MessageHandler.appletmsg.WeapAddFilePath(appletMsg.MsgId, appletMsg.MediaId, imagepath);
if (eid != "1" && isNeedSendMsg == 1)
ChatHub.SendAllMessage(eid, appletMsg.FromUserName, "[imagepath]:" + imagepath, msgType, appletMsg.ToUserName, isNew);
//else
// MessageHandler.SendNoLineMsg(appletMsg.FromUserName);
}
else if (appletMsg.MsgType == "voice")
{
//MessageHandler.GetSuCaiUrl(appletMsg.MediaId, appletMsg.ToUserName);
GetVoice(appletMsg.MediaId, appletMsg.ToUserName);
ChatHub.SendAllMessage(eid, appletMsg.FromUserName, "[voice]:" + appletMsg.MediaId, msgType, appletMsg.ToUserName, isNew);
}
else
{
if (eid != "1" && isNeedSendMsg == 1)
ChatHub.SendAllMessage(eid, appletMsg.FromUserName, appletMsg.Content, msgType, appletMsg.ToUserName, isNew);
//else
// MessageHandler.SendNoLineMsg(appletMsg.FromUserName);
}
if (issucced)
return "success";
else
return "fail";
}
catch (Exception ex)
{
LogHelper.Error(ex.ToString());
return "fail";
}
}
#endregion
#region
/// <summary>
/// 转发重定向消息
/// </summary>
/// <param name="appletMsg"></param>
/// <param name="signature"></param>
/// <param name="timestamp"></param>
/// <param name="nonce"></param>
/// <returns></returns>
public string AppletMsgRedirect(AppletMsgModel appletMsg, string signature, string timestamp, string nonce)
{
string nul = "";
try
{
string url = ConfigurationManager.AppSettings["weappTestService"] + "/WxMessageSvr/AppletMsg?signature=" + signature + "&timestamp=" + timestamp + "&nonce=" + nonce;
nul = url;
string result = RequestHelper.WebClientRequest(url, Utility.ConvertToJSON(appletMsg), Encoding.UTF8);
}
catch (Exception ex)
{
LogHelper.Error("转接出现错误:" + ex.ToString());
LogHelper.Error("转接出现数据:" + Utility.ConvertToJSON(appletMsg));
LogHelper.Error("转接出现地址:" + nul);
}
return "success";
}
#endregion
#region
public string UserInfoReceive(web_push_wxUserServiceModel t)
{
bool issucced = true;
try
{
ValidationErrors errors = new ValidationErrors();
DateTime time = DateTimeTool.GetTimeFromLinuxShortTime(t.SubscribeTime);
issucced = MessageHandler.userinfo.weapp_userinfo_Storage(t.OpenId, t.NickName, t.Gender, t.Language, t.City, t.Province, t.Country, t.AvatarUrl, t.Type, t.UnionId, t.Subscribe, time, t.AccountNum);
}
catch (Exception ex)
{
issucced = false;
LogHelper.Error("数据:" + JsonConvert.SerializeObject(t));
LogHelper.Error(ex.ToString());
}
if (issucced)
return "success";
else
return "fail";
}
#endregion
#region
//保存文件
public JsonResult UploadImage(string toUser, string accountnum, int eid)
{
string filepath = string.Empty;
string erromsg = string.Empty;
int issucced = 1;
try
{
HttpPostedFileBase file = Request.Files["uploadFile"];
var yearMonth = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString();
string uploadFolder = (ConfigurationManager.AppSettings["weappfile"] ?? "weappfile") + "/" + yearMonth;
string filename = file.FileName;
string suffix = filename.Substring(filename.LastIndexOf(".") + 1, (filename.Length - filename.LastIndexOf(".") - 1)); //扩展名
suffix = suffix.ToLower();
string fileType = "image";
if (suffix == "amr" || suffix == "mp3")
{
fileType = "voice";
}
else if (suffix == "mp4")
{
fileType = "video";
}
else if (suffix == "png" || suffix == "jpeg" || suffix == "jpg" || suffix == "gif")
{
fileType = "image";
}
else
{
var json2 = new
{
fileName = "",
result = 0,
erro = "文件格式不对!"
};
JsonResult rs2 = Json(json2);
rs2.ContentType = "text/html";
return rs2;
}
//string suffix = "png";
if (!Directory.Exists(uploadFolder))
{
Directory.CreateDirectory(uploadFolder);
}
string imgname = "S" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + "." + suffix;//文件名称
string path = Path.Combine(uploadFolder, imgname);
filepath = "/" + yearMonth + "/" + imgname;
file.SaveAs(path);
ImageMsg imgmodel = MessageHandler.SendImg(fileType, accountnum, path, "/" + yearMonth + "/" + imgname);
if (imgmodel == null)
{
filepath = "";
erromsg = "发送临时素材失败!";
issucced = 0;
}
else
{
string[] opeIds = toUser.Split(',');
string content = string.Empty;
foreach (string opeId in opeIds)
{
if (string.IsNullOrEmpty(opeId))
continue;
MessageHandler.SendImgMsg(imgmodel, fileType, opeId, accountnum, eid, "", ref content);
}
}
}
catch (Exception ex)
{
filepath += "";
erromsg = ex.ToString();
issucced = 0;
}
var json = new
{
fileName = filepath,
result = issucced,
erro = erromsg
};
JsonResult rs = Json(json);
rs.ContentType = "text/html";
return rs;
}
#endregion
#region
public JsonResult SendSuCai(string toUserId, string name, string media_id, string sucaitype, string url, string accountnum, int eid)
{
string filepath = string.Empty;
string erromsg = string.Empty;
int issucced = 1;
string content = string.Empty;
try
{
//if (sucaitype != "news")
//{
ImageMsg msg = new ImageMsg();
msg.media_id = media_id;
string[] openIds = toUserId.Split(',');
foreach (string openId in openIds)
{
if (string.IsNullOrEmpty(openId))
continue;
MessageHandler.SendImgMsg(msg, sucaitype, openId, accountnum, eid, name, ref content);
}
if (sucaitype == "image")
{
DataTable tab = MessageHandler.IsNeedDownLoadSuCai(media_id);
if (tab != null && tab.Rows.Count == 0)
{
if (!string.IsNullOrEmpty(url) && url != "null")
{
string imagepath = MessageHandler.DownLoadSuCaiPath(media_id, url);
MessageHandler.appletmsg.WeapAddFilePath(0, media_id, imagepath);
filepath = imagepath;
}
}
else if (tab != null && tab.Rows.Count > 0)
{
filepath = tab.Rows[0]["Path"].ToString();
}
}
//}
}
catch (Exception ex)
{
LogHelper.Error(ex.ToString());
filepath += "";
erromsg = ex.ToString();
issucced = 0;
}
var json = new
{
fileName = filepath,
result = issucced,
erro = erromsg,
content = content
};
JsonResult rs = Json(json);
rs.ContentType = "text/html";
return rs;
}
#endregion
#region
/// <summary>
/// 预览图片素材
/// </summary>
/// <param name="media_id">素材ID</param>
/// <param name="url">素材URL</param>
/// <returns></returns>
public JsonResult ImgPreview(string media_id, string url)
{
string filepath = string.Empty;
string erromsg = string.Empty;
int issucced = 1;
try
{
DataTable tab = MessageHandler.IsNeedDownLoadSuCai(media_id);
if (tab != null && tab.Rows.Count == 0)
{
string imagepath = MessageHandler.DownLoadSuCaiPath(media_id, url);
MessageHandler.appletmsg.WeapAddFilePath(0, media_id, imagepath);
filepath = imagepath;
}
else if (tab != null && tab.Rows.Count > 0)
{
filepath = tab.Rows[0]["Path"].ToString();
}
}
catch (Exception ex)
{
LogHelper.Error(ex.ToString());
filepath += "";
erromsg = ex.ToString();
issucced = 0;
}
var json = new
{
fileName = filepath,
result = issucced,
erro = erromsg
};
JsonResult rs = Json(json);
rs.ContentType = "text/html";
return rs;
}
#endregion
#region
/// <summary>
/// 下载文件
/// </summary>
/// <param name="URLAddress"></param>
/// <returns></returns>
private string DownLoadPath(string URLAddress)
{
string filepath = string.Empty;
try
{
WebClient client = new WebClient();
Stream str = client.OpenRead(URLAddress);
StreamReader reader = new StreamReader(str);
byte[] mbyte = new byte[1000000];
int allmybyte = (int)mbyte.Length;
int startmbyte = 0;
while (allmybyte > 0)
{
int m = str.Read(mbyte, startmbyte, allmybyte);
if (m == 0)
break;
startmbyte += m;
allmybyte -= m;
}
reader.Dispose();
str.Dispose();
var yearMonth = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString();
string uploadFolder = (ConfigurationManager.AppSettings["weappfile"] ?? "weappfile") + "/" + yearMonth;
if (!Directory.Exists(uploadFolder))
{
Directory.CreateDirectory(uploadFolder);
}
string imgname = "G" + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".jpg";
string path = Path.Combine(uploadFolder, imgname);
filepath = "/" + yearMonth + "/" + imgname;
FileStream fstr = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
fstr.Write(mbyte, 0, startmbyte);
fstr.Flush();
fstr.Close();
}
catch (Exception ex)
{
LogHelper.Error("download erro:" + ex.ToString());
filepath = "";
}
return filepath;
}
#endregion
#region
/// <summary>
/// 获取素材列表
/// </summary>
/// <param name="type">素材类型 图片image、视频video、语音 voice、图文news</param>
/// <param name="count">显示数量</param>
/// <returns></returns>
public JsonResult GetSuCai(string type, int count, int offset, string accountnum)
{
try
{
string[] ntypes = { "image", "video", "voice", "news" };
if (!type.Contains(type))
return Json(new { result = false, msg = "参数错误" });
object obj = MessageHandler.GetSucaiModel(type, count, offset, accountnum);
return Json(obj);
}
catch (Exception ex)
{
LogHelper.Error(ex.ToString());
return Json(new { result = false, msg = "系统错误:" + ex.ToString() });
}
}
#endregion
#region
private const string Token = "wxapi_hc";
private bool IsFromWxServ(string signature, string timestamp, string nonce)
{
var strArray = new string[] { nonce, timestamp, Token };
Array.Sort(strArray);
string strContent = string.Join("", strArray);
strContent = EncryptSHA1(strContent);//进行sha1加密
strContent = strContent.ToLower();
if (signature == strContent)
{
return true;
}
else
return false;
}
public static string EncryptSHA1(string value)
{
if (value == null || value.Trim() == "")
{
return string.Empty;
}
else
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(value, "SHA1");
}
}
#endregion
#region
/// <summary>
/// 获取未读消息
/// </summary>
/// <param name="eid">工号</param>
/// <returns></returns>
public JsonResult GetUnReadMsg(int eid, string accountnum)
{
DataTable tab = MessageHandler.appletmsg.GetUnReadMsg(eid, accountnum);
List<UnReadMsgModel> list = new List<UnReadMsgModel>();
if (tab != null && tab.Rows.Count > 0)
{
UnReadMsgModel model = null;
foreach (DataRow row in tab.Rows)
{
model = new UnReadMsgModel();
model.id = Convert.ToInt32(row["id"]);
model.issend = Convert.ToInt32(row["issend"]);
model.msgtype = row["msgtype"].ToString();
model.openId = row["fromusername"].ToString();
model.content = row["content"].ToString();
model.createtime = Convert.ToInt64(row["createtime"]);
model.eid = Convert.ToInt32(row["eid"]);
if (row["Path"] != DBNull.Value)
model.filepath = row["Path"].ToString();
else
model.filepath = "";
list.Add(model);
}
}
return Json(list);
}
#endregion
#region JSON文件中
/// <summary>
/// 获取已读的新消息虽然已读但是未生成在JSON文件中
/// </summary>
/// <param name="eid">工号</param>
/// <param name="accountnum">公众号</param>
/// <param name="pkid">界面加载的最大PKID</param>
/// <returns></returns>
public JsonResult GetNewAndIsReadMsg(int eid, string accountnum, string openid, long pkid)
{
DataTable tab = MessageHandler.appletmsg.GetNewAndIsReadMsg(eid, accountnum, openid, pkid);
List<UnReadMsgModel> list = new List<UnReadMsgModel>();
if (tab != null && tab.Rows.Count > 0)
{
UnReadMsgModel model = null;
foreach (DataRow row in tab.Rows)
{
model = new UnReadMsgModel();
model.id = Convert.ToInt32(row["id"]);
model.issend = Convert.ToInt32(row["issend"]);
model.msgtype = row["msgtype"].ToString();
model.openId = row["fromusername"].ToString();
model.content = row["content"].ToString();
model.createtime = Convert.ToInt64(row["createtime"]);
model.eid = Convert.ToInt32(row["eid"]);
if (row["Path"] != DBNull.Value)
model.filepath = row["Path"].ToString();
else
model.filepath = "";
if (row["mediaid"] != DBNull.Value)
model.mediaid = row["mediaid"].ToString();
else
model.mediaid = "";
list.Add(model);
}
}
return Json(list);
}
#endregion
#region
/// <summary>
/// 修改状态
/// </summary>
/// <returns></returns>
public JsonResult UpdateIsAlreadyRead(int eid, string openId, string accountnum)
{
string erromsg = string.Empty;
int issucced = 1;
try
{
if (!MessageHandler.appletmsg.UpdateIsAlreadyRead(eid, openId, accountnum))
issucced = 0;
}
catch (Exception ex)
{
LogHelper.Error(ex.ToString());
erromsg = ex.ToString();
issucced = 0;
}
var json = new
{
result = issucced,
erro = erromsg
};
JsonResult rs = Json(json);
rs.ContentType = "text/html";
return rs;
}
#endregion
#region
public JsonResult GetHisMsgFile(string openid, string accountnum)
{
string erroMsg = string.Empty;
List<string> list = new List<string>();//定义list变量存放获取到的路径
int issucced = 0;
try
{
string path = ConfigurationManager.AppSettings["WxMsgFile"] == null ? "D:\\web\\WXCRM\\MessageGh\\" : System.Configuration.ConfigurationManager.AppSettings["WxMsgFile"] + accountnum + "/" + openid + "/";
DirectoryInfo dir = new DirectoryInfo(path);
if (dir.Exists)
{
FileInfo[] fil = dir.GetFiles();
DirectoryInfo[] dii = dir.GetDirectories();
foreach (FileInfo f in fil)
{
list.Add(f.Name);//添加文件的路径到列表
}
list = list.OrderByDescending(m => m).ToList();
}
issucced = 1;
}
catch (Exception ex)
{
LogHelper.Error(ex.ToString());
erroMsg = ex.ToString();
}
JsonResult rs = Json(new { result = issucced, data = list, erro = erroMsg });
rs.ContentType = "text/html";
return rs;
}
#endregion
#region
public JsonResult GetVoice(string MediaId, string accountNum)
{
if (string.IsNullOrEmpty(MediaId))
return Json(new { result = false, msg = "参数错误" });
bool result = false;
string erro = string.Empty;
string filepath = string.Empty;
try
{
DataTable tab = MessageHandler.IsNeedDownLoadSuCai(MediaId);
if (tab != null && tab.Rows.Count == 0)//需要进行文件下载
{
string voicePath = MessageHandler.GetSuCaiUrl(MediaId, accountNum, ref erro);//先进行文件下载
if (!string.IsNullOrEmpty(voicePath))
{
MessageHandler.appletmsg.WeapAddFilePath(0, MediaId, voicePath);//然后进行
filepath = voicePath;
result = true;
}
}
else if (tab != null && tab.Rows.Count > 0)
{
filepath = tab.Rows[0]["Path"].ToString();
result = true;
}
}
catch (Exception ex)
{
erro = ex.ToString();
LogHelper.Error(ex.ToString());
}
return Json(new { result = result, voicePath = filepath, msg = erro });
}
#endregion
#region
/// <summary>
/// 将客户转接给目标客服
/// </summary>
/// <param name="fromEid">原工号</param>
/// <param name="toEid">目标工号</param>
/// <param name="openId">openId</param>
/// <param name="accountNum">公众号</param>
/// <returns></returns>
public JsonResult TransferEid(int fromEid, int toEid, string openId, string accountNum)
{
string erro = string.Empty;
int result = 0;
try
{
DataTable tab = MessageHandler.userinfo.TransferEid(fromEid, toEid, openId, accountNum);
if (tab != null)
{
result = Convert.ToInt32(tab.Rows[0]["xresult"]);
erro = tab.Rows[0]["message"].ToString();
}
if (result == 1)//转接数据修改成功,进行推送一条通知
{
AppletMsgModel appletMsg = new AppletMsgModel()
{
Content = "系统提示:[" + fromEid + "]将此客户转接给你!",
CreateTime = DateTimeTool.ConvertDateTimeInt(DateTime.Now),
FromUserName = openId,
MsgId = 1,
ToUserName = accountNum,
MsgType = "txt"
};
bool issucced = MessageHandler.appletmsg.WeapAddMessage(appletMsg, toEid, 0, 0);//插入消息表
ChatHub.SendAllMessage(toEid.ToString(), openId, appletMsg.Content, "txt", accountNum, 1);
}
//result = 1;
}
catch (Exception ex)
{
erro = ex.ToString();
LogHelper.Error(ex.ToString());
}
return Json(new { result = result, msg = erro });
}
#endregion
}
}