/// <summary> /// 发送模板消息 /// </summary> /// <param name="apiBaseUrl"></param> /// <param name="message"></param> /// <param name="mq"></param> /// <returns></returns> private static SendWXTemplateMessageResponseModel SendTemplateMessage( string apiBaseUrl, Proc_GetMessageInfoByMessageIDs_Result message, Proc_GetRobotServerMessageQueueForWXRobot_Result mq ) { SendWXTemplateMessageResponseModel sendWXTemplateMessageResponseModel = null; try { //模板消息post路径 string urlForSendTemplateMessage = _httper.Get(string.Format("{0}/api/wx/GetTemplateMessageBaseUrl?publicAccountID={1}", apiBaseUrl, mq.PublicAccountID)); //fuxily urlForSendTemplateMessage = urlForSendTemplateMessage.Replace("\"", ""); string TemplateMessageBaseUrl = string.Format("{0}/api/wx/SendWXTemplateMessage", apiBaseUrl); //fuxily int toUserID = mq.ToUserID ?? 0; if (mq.MoreParams != null) { var morePara = Common.GetUrlParas.GetUrlParasHandler.GetUrlParas(mq.MoreParams); if (morePara != null) { foreach (var item in morePara) { if (item.Key == "copyToUserID") { toUserID = Common.DataTypes.IntHandler.ToInt32(item.Value); } } } } string TemplateMessageData = Common.HTTP.PostDataHandler.GetPostData ( new List <PostDataRequestModel>() { new PostDataRequestModel() { ParameterName = "schoolPublicAccountID", ParameterValue = message.SchoolPublicAccountID }, new PostDataRequestModel() { ParameterName = "messageFunctionID", ParameterValue = message.MessageFunctionID }, new PostDataRequestModel() { ParameterName = "messageID", ParameterValue = message.ID }, new PostDataRequestModel() { ParameterName = "messageQueueID", ParameterValue = mq.ID }, new PostDataRequestModel() { ParameterName = "toUserID", ParameterValue = toUserID }, new PostDataRequestModel() { ParameterName = "fromUserID", ParameterValue = mq.FromUserID } } ); //模板消息json数据 string xmlData = _httper.Post(TemplateMessageBaseUrl, TemplateMessageData); if (!string.IsNullOrEmpty(xmlData)) { //移除xmlData首尾的引号 xmlData = xmlData.Remove(0, 1); xmlData = xmlData.Remove(xmlData.Length - 1, 1); //加载XML XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlData); // XmlNode node = doc.SelectSingleNode("xml/data/keyword1"); XmlNode contentNode = null; switch (message.MessageFunctionID) { case 1: case 2: case 3: case 4: case 17: case 3000: contentNode = doc.SelectSingleNode("xml/data/keyword3/value"); break; default: contentNode = doc.SelectSingleNode("xml/data/keyword1/value"); break; } string content = contentNode.InnerText; //content = Regex.Replace(content, @"\p{Cs}", "");//把手机中Emoji表情字符去掉。解决出现Emoji表情字符时,LoadXml加载失败,导致机器人发送总是返回Null问题(一直发送失败) string replaceContent = content.Replace("\\\"", "”");//把发送信息中的"替换成中文的” content = string.IsNullOrEmpty(content) ? "内容为空" : content; if (replaceContent.Length > 140) //当消息内容超过140字时,截取前140个字,并显示【更多】 { replaceContent = replaceContent.Substring(0, 140); replaceContent += "【更多】"; } string replaceXml = xmlData.Replace(content, replaceContent); doc.LoadXml(replaceXml); var jsonData = XmlToJson.XmlToJSON(doc); var dataForSendTemplateMessage = jsonData.Remove(jsonData.LastIndexOf("}")).Remove(0, 8); //dataForSendTemplateMessage = ClearImageHtml(dataForSendTemplateMessage); //清除模版消息中的图片html标签-Haley var sendTemplateMessageResultString = ""; lock (sendMessageLock) { var model = messageQueueIDs.Where( p => p.MessageQueueID == mq.ID && (Common.Time.NowHandler.GetNowByTimeZone() - p.Created).TotalSeconds < 60 ).FirstOrDefault(); //去重,1分钟之内,没有发送过的MessageQueueID才去发送 if (model == null) { sendTemplateMessageResultString = _httper.Post(urlForSendTemplateMessage, dataForSendTemplateMessage); sendWXTemplateMessageResponseModel = Newtonsoft.Json.JsonConvert.DeserializeObject <SendWXTemplateMessageResponseModel>(sendTemplateMessageResultString); if (sendWXTemplateMessageResponseModel.ErrCode == 0) { messageQueueIDs.Add(new Models.MessageQueues.MessageQueueIDModel() { MessageQueueID = mq.ID ?? 0, Created = Common.Time.NowHandler.GetNowByTimeZone() }); } } } //删除1分钟后的消息队列ID messageQueueIDs.RemoveAll( p => (Common.Time.NowHandler.GetNowByTimeZone() - p.Created).TotalSeconds > 70 ); if (!string.IsNullOrEmpty(sendTemplateMessageResultString)) { //将json转换成对象 if (sendWXTemplateMessageResponseModel.ErrCode == 42001 || //当AccessToken无效时 sendWXTemplateMessageResponseModel.ErrCode == 40001) //当AccessToken过期时(有可能刚好过期)) { string[] urls = urlForSendTemplateMessage.Split('='); string invalidToken = urls[1]; string urlForRefreshWXAccessToken = string.Format("{0}/api/ZcooApi/RefreshWXAccessToken?publicAccountID={1}&invalidToken={2}", apiBaseUrl, mq.PublicAccountID, invalidToken); _httper.Get(urlForRefreshWXAccessToken); } } } return(sendWXTemplateMessageResponseModel); } catch (Exception e) { if (e.Message.Contains("字符串的长度不能为零")) { templateMessageQueues.RemoveAll(c => c.MessageID == mq.MessageID); messages.RemoveAll(c => c.ID == mq.MessageID); string failUrl = string.Format("{0}/api/zcooapi/UpdateMessageStatus?messageID={1}&messageStatusID={2}&remark={3}&isIncludeSender={4}", apiBaseUrl, mq.MessageID, 3, e.Message, true); var result = _httper.Get(failUrl); if (result != "OK") { _httper.Get(failUrl); } sendWXTemplateMessageResponseModel = new SendWXTemplateMessageResponseModel(); sendWXTemplateMessageResponseModel.ErrCode = -1000; return(sendWXTemplateMessageResponseModel); } return(sendWXTemplateMessageResponseModel); } }
private static SendWXPreviewMessageResponseModel SendPreviewMessage( string apiBaseUrl, string urlForSendPreviewMessage, string dataForSendPreviewMessage, Proc_GetMessageInfoByMessageIDs_Result message, Proc_GetRobotServerMessageQueueForWXRobot_Result mq, int showCoverInContent, int showSourceUrlInContent, int relogin) { var sendWXPreviewMessageResponseModel = new SendWXPreviewMessageResponseModel() { Ret = -1000 }; //默认让错误码为 -1000,这样当返回为0时,就是成功的 urlForSendPreviewMessage = string.Format("{0}/api/wx/SendWXPreviewMessage", apiBaseUrl); //fuxily string sourceUrl = null; if (!string.IsNullOrEmpty(mq.MoreParams) && !string.IsNullOrEmpty(message.SourceUrl)) { if (message.MessageFunctionID != 12) { string secret = WebConfigurationManager.AppSettings["AESEncryptSecret"].ToString(); string newSD = ""; try { newSD = Common.Encryptor.AESEncryptor.AESEncrypt(mq.ID.ToString(), secret); newSD = System.Web.HttpUtility.UrlEncode(newSD); } catch { } sourceUrl = message.SourceUrl + "?messageQueueID=" + newSD; } else { sourceUrl = message.SourceUrl + ",messageQueueID@" + mq.ID + ",ToUserID@" + mq.ToUserID + "," + mq.MoreParams; } } else { sourceUrl = message.SourceUrl; } dataForSendPreviewMessage = Common.HTTP.PostDataHandler.GetPostData ( new List <PostDataRequestModel>() { new PostDataRequestModel() { ParameterName = "schoolPublicAccountID", ParameterValue = message.SchoolPublicAccountID }, new PostDataRequestModel() { ParameterName = "messageFunctionID", ParameterValue = message.MessageFunctionID }, new PostDataRequestModel() { ParameterName = "toWxNo", ParameterValue = mq.PushNo }, new PostDataRequestModel() { ParameterName = "title", ParameterValue = message.Title }, new PostDataRequestModel() { ParameterName = "digest", ParameterValue = message.Digest }, new PostDataRequestModel() { ParameterName = "content", ParameterValue = message.Content, ConvertToHtml = true }, new PostDataRequestModel() { ParameterName = "sourceUrl", ParameterValue = sourceUrl }, new PostDataRequestModel() { ParameterName = "author", ParameterValue = "志酷通" }, new PostDataRequestModel() { ParameterName = "showCoverPic", ParameterValue = showCoverInContent }, new PostDataRequestModel() { ParameterName = "showSourceUrl", ParameterValue = showSourceUrlInContent }, new PostDataRequestModel() { ParameterName = "relogin", ParameterValue = relogin }, new PostDataRequestModel() { ParameterName = "greeting", ParameterValue = mq.Greeting }, new PostDataRequestModel() { ParameterName = "signature", ParameterValue = mq.NickName }, new PostDataRequestModel() { ParameterName = "toUserID", ParameterValue = mq.ToUserID }, new PostDataRequestModel() { ParameterName = "fromUserID", ParameterValue = mq.FromUserID } } ); var sendPreviewMessageResultString = _httper.Post(urlForSendPreviewMessage, dataForSendPreviewMessage); sendWXPreviewMessageResponseModel = Newtonsoft.Json.JsonConvert.DeserializeObject <SendWXPreviewMessageResponseModel>(sendPreviewMessageResultString); return(sendWXPreviewMessageResponseModel); }
/// <summary> /// 发送短信 /// </summary> /// <param name="apiBaseUrl"></param> /// <param name="message"></param> /// <param name="mq"></param> /// <returns></returns> public static ShortMessageResponseModel SendShortMessage(string apiBaseUrl, Proc_GetMessageInfoByMessageIDs_Result message, Proc_GetRobotServerMessageQueueForWXRobot_Result mq) { //短信宝帐号类型ID int accountID = Convert.ToInt32(WebConfigurationManager.AppSettings["SMSAccountID"].ToString()); ShortMessageResponseModel shortMessageResponseModel = new ShortMessageResponseModel() { ReturnCode = -1 }; try { string urlForSendShortMessage = string.Format("{0}/api/zcooapi/SendShortMessage", apiBaseUrl); //消息的类型名 string title = message.Title.Substring(message.Title.IndexOf("《") + 1, message.Title.LastIndexOf("》") - 1); title = "【" + title + "】"; string Content = message.Content; string Sendname = "(" + mq.NickName + ")"; //发送消息者 string greeting = "尊敬的家长"; if (mq.MoreParams.Contains("isSendToSMSUser")) { greeting = "尊敬的用户"; } Content = Regex.Replace(Content, @"<\/?[^>]*>", ""); //去除HTML tag Content = Regex.Replace(Content, "((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)", "【链接】"); #region 转化为短链接 暂停使用 //if (Content.Length > 35) //35 //{ // string sd = mq.ID.ToString(); // string secret = WebConfigurationManager.AppSettings["AESEncryptSecret"].ToString(); // sd = Common.Encryptor.AESEncryptor.AESEncrypt(sd, secret); // //需要编码三次。。。。醉了 // sd = System.Web.HttpUtility.UrlEncode(sd); // sd = System.Web.HttpUtility.UrlEncode(sd); // string messageURL = string.Format("{0}/html5/ShowDetail?sd={1}", apiBaseUrl, sd); // messageURL = System.Web.HttpUtility.UrlEncode(messageURL); // string GETshorURL = string.Format("{0}/api/ZcooApi/getShortUrl?Ursl={1}", apiBaseUrl, messageURL); // string shorURL = _httper.Get(GETshorURL); // Content = Content.Substring(0, 9) + "..." + "\n" + "更多内容:" + shorURL; //} #endregion Content = "\n" + greeting + "," + Content + "\n"; if (title.Contains("学习成长")) { int lenth = Sendname.Length + title.Length; if (Content.Length > 64 - lenth) { string prompt = "[部分消息被截取,请微信关注:zcootong]\n"; Content = Content.Substring(0, 64 - lenth - prompt.Length); Content = Content + prompt; } } string digest = title + Content + Sendname; string dataForSendShortMessage = Common.HTTP.PostDataHandler.GetPostData ( new List <PostDataRequestModel>() { new PostDataRequestModel() { ParameterName = "accountID", ParameterValue = accountID }, new PostDataRequestModel() { ParameterName = "toMobileNo", ParameterValue = mq.PushNo }, new PostDataRequestModel() { ParameterName = "content", ParameterValue = digest } } ); //发送短信消息 string sendShortMessageResult = _httper.Post(urlForSendShortMessage, dataForSendShortMessage); shortMessageResponseModel.ReturnCode = Newtonsoft.Json.JsonConvert.DeserializeObject <int>(sendShortMessageResult); } catch (Exception) { shortMessageResponseModel.ReturnCode = -1; } return(shortMessageResponseModel); }