Esempio n. 1
0
        /// <summary>
        /// 设置消息为无效推送号。
        /// </summary>
        /// <param name="apiBaseUrl"></param>
        /// <param name="mq"></param>
        /// <returns></returns>
        private static CommonResponseModel SetPreviewMessageInvalidPushNo(
            string apiBaseUrl,
            Proc_GetRobotServerMessageQueueForWXRobot_Result mq
            )
        {
            var    urlForUpdateMessageQueueToInvalidStatus  = string.Format("{0}/api/zcooApi/UpdateMessageQueueToInvalidStatus", apiBaseUrl);
            string dataForUpdateMessageQueueToInvalidStatus = Common.HTTP.PostDataHandler.GetPostData
                                                              (
                new List <PostDataRequestModel>()
            {
                new PostDataRequestModel()
                {
                    ParameterName = "MessageQueueID", ParameterValue = mq.ID, ConvertToHtml = false
                },
                new PostDataRequestModel()
                {
                    ParameterName = "InvalidReason", ParameterValue = string.Format("{0}此无效的微信号是:{1}", Common.Const.Zcoo.ZcooConst.INVALID_PUSH_NO_WHEN_SEND_PREVIEW_MESSAGE, mq.PushNo), ConvertToHtml = false
                }
            }
                                                              );

            var updateMessageQueueToInvalidStatusResultString = _httper.Post(urlForUpdateMessageQueueToInvalidStatus, dataForUpdateMessageQueueToInvalidStatus);

            var updateMessageQueueToInvalidStatusResponseModel = Newtonsoft.Json.JsonConvert.DeserializeObject <CommonResponseModel>(updateMessageQueueToInvalidStatusResultString);

            return(updateMessageQueueToInvalidStatusResponseModel);
        }
        /// <summary>
        /// 设置消息为无效推送号。
        /// </summary>
        /// <param name="apiBaseUrl"></param>
        /// <param name="mq"></param>
        /// <returns></returns>
        private static CommonResponseModel SetTemplateMessageInvalidPushNo(
            string apiBaseUrl,
            Proc_GetRobotServerMessageQueueForWXRobot_Result mq,
            SendWXTemplateMessageResponseModel sendWXTemplateMessageResponseModel
            )
        {
            var    urlForUpdateMessageQueueToInvalidStatus  = string.Format("{0}/api/zcooApi/UpdateMessageQueueToInvalidStatus", apiBaseUrl);
            string dataForUpdateMessageQueueToInvalidStatus = Common.HTTP.PostDataHandler.GetPostData
                                                              (
                new List <PostDataRequestModel>()
            {
                new PostDataRequestModel()
                {
                    ParameterName = "MessageQueueID", ParameterValue = mq.ID, ConvertToHtml = false
                },
                new PostDataRequestModel()
                {
                    ParameterName = "InvalidReason", ParameterValue = Newtonsoft.Json.JsonConvert.SerializeObject(sendWXTemplateMessageResponseModel), ConvertToHtml = false
                }
            }
                                                              );

            var updateMessageQueueToInvalidStatusResultString = _httper.Post(urlForUpdateMessageQueueToInvalidStatus, dataForUpdateMessageQueueToInvalidStatus);

            var updateMessageQueueToInvalidStatusResponseModel = Newtonsoft.Json.JsonConvert.DeserializeObject <CommonResponseModel>(updateMessageQueueToInvalidStatusResultString);

            return(updateMessageQueueToInvalidStatusResponseModel);
        }
Esempio n. 3
0
        /// <summary>
        /// 刷新微信公众账号Block模型。刷新意味关重新把所有公众账号中的IsBlocked,修改为false。
        /// 以便WXRobot(微信机器人),可以重新尝试这些公众账号。
        /// 刷新时,会考虑消息队列新加入的,同时也加入到微信公众账号Block模型中。
        /// </summary>
        /// <param name="wxPublicAccountBlockStatusModel"></param>
        /// <param name="messageQueues"></param>
        /// <returns></returns>
        private static IEnumerable <WXPublicAccountBlockStatusModel> RefreshWXPublicAccountBlockStatusModel(IEnumerable <WXPublicAccountBlockStatusModel> wxPublicAccountBlockStatusModel, IEnumerable <Proc_GetRobotServerMessageQueueForWXRobot_Result> messageQueues)
        {
            var wxPublicAccountBlockStatusModelList          = wxPublicAccountBlockStatusModel.ToList();
            var messageQueuesDistinctList                    = Common.Lists.ListHandler.DistinctBy(messageQueues, m => m.PublicAccountID).ToList();
            WXPublicAccountBlockStatusModel thePublicAccount = null;

            Proc_GetRobotServerMessageQueueForWXRobot_Result[] messageQueuesArray = new Proc_GetRobotServerMessageQueueForWXRobot_Result[messageQueuesDistinctList.Count];

            messageQueuesDistinctList.CopyTo(messageQueuesArray);

            //不存在的公众账号,加入到模型中
            foreach (var mqa in messageQueuesArray)
            {
                thePublicAccount = wxPublicAccountBlockStatusModel.FirstOrDefault(p => p.PublicAccountID == mqa.PublicAccountID);

                if (thePublicAccount == null)
                {
                    wxPublicAccountBlockStatusModelList.Add(new WXPublicAccountBlockStatusModel()
                    {
                        PublicAccountID = (int)mqa.PublicAccountID, BlockedDateTime = DateTime.MinValue, IsBlocked = false
                    });
                }
            }

            wxPublicAccountBlockStatusModel = wxPublicAccountBlockStatusModel.Select(c =>
            {
                c.IsBlocked = false;
                return(c);
            }).AsEnumerable();

            return(wxPublicAccountBlockStatusModel);
        }
Esempio n. 4
0
        /// <summary>
        /// 判断当前消息队列,是否应该尝试发送模板消息。
        /// </summary>
        /// <param name="messageQueue"></param>
        /// <returns></returns>
        private static bool IsShouldTrySendMessageQueue(Proc_GetRobotServerMessageQueueForWXRobot_Result messageQueue)
        {
            var shouldTry       = false;
            var currentDateTime = Common.Time.NowHandler.GetNowByTimeZone();

            if (messageQueue.NextSendDateTime < currentDateTime && messageQueue.ShouldDelete == false) //如果当前时间大于下次尝试时间
            {
                shouldTry = true;
            }

            return(shouldTry);
        }
Esempio n. 5
0
        /// <summary>
        /// 判断当前消息队列,是否应该尝试发送预览的。
        /// </summary>
        /// <param name="messageQueue"></param>
        /// <returns></returns>
        private static bool IsShouldTryMessageQueue(Proc_GetRobotServerMessageQueueForWXRobot_Result messageQueue, int checkWXIntervalWhenBlock)
        {
            var shouldTry       = false;
            var currentDateTime = Common.Time.NowHandler.GetNowByTimeZone();

            if (messageQueue.BlockedDateTime.AddSeconds(checkWXIntervalWhenBlock) < currentDateTime && messageQueue.ShouldDelete == false) //如果当前时间大于下次尝试时间
            {
                shouldTry = true;
            }

            return(shouldTry);
        }
        /// <summary>
        /// 设置模板消息发送成功
        /// </summary>
        /// <param name="apiBaseUrl"></param>
        /// <param name="serverID"></param>
        /// <param name="mq"></param>
        /// <param name="sendWXTemplateMessageResponseModel"></param>
        /// <param name="wxPublicAccountBlockStatuses"></param>
        /// <returns></returns>
        private static CommonResponseModel SetTemplateMessageSuccess(string apiBaseUrl, int serverID,
                                                                     Proc_GetRobotServerMessageQueueForWXRobot_Result mq,
                                                                     SendWXTemplateMessageResponseModel sendWXTemplateMessageResponseModel
                                                                     )
        {
            //更新消息队列状态
            var dataForUpdateMessageQueueStatusToSent = string.Format("serverID={0}&messageQueueIDs={1}&AppMsgIDs={2}", serverID, mq.ID, sendWXTemplateMessageResponseModel.MsgID);
            var updateMessageQueueStatusToSentString  = _httper.Post(string.Format("{0}/api/zcooApi/UpdateMessageQueueStatusToSent", apiBaseUrl), dataForUpdateMessageQueueStatusToSent);

            var updateMessageQueueStatusToSentResponseModel = Newtonsoft.Json.JsonConvert.DeserializeObject <CommonResponseModel>(updateMessageQueueStatusToSentString);

            mq.ShouldDelete = true;

            return(updateMessageQueueStatusToSentResponseModel);
        }
Esempio n. 7
0
        /// <summary>
        /// 设置短信消息发送成功
        /// </summary>
        /// <param name="apiBaseUrl"></param>
        /// <param name="serverID"></param>
        /// <param name="mq"></param>
        /// <returns></returns>
        private static CommonResponseModel SetShortMessageSuccess(string apiBaseUrl, int serverID,
                                                                  Proc_GetRobotServerMessageQueueForWXRobot_Result mq
                                                                  )
        {
            Random rand     = new Random();
            int    appMsgID = Convert.ToInt32(("5" + rand.Next(10000000, 99999999).ToString()));

            //更新消息队列状态
            var dataForUpdateMessageQueueStatusToSent = string.Format("serverID={0}&messageQueueIDs={1}&AppMsgIDs={2}", serverID, mq.ID, appMsgID);
            var updateMessageQueueStatusToSentString  = _httper.Post(string.Format("{0}/api/zcooApi/UpdateMessageQueueStatusToSent", apiBaseUrl), dataForUpdateMessageQueueStatusToSent);

            var updateMessageQueueStatusToSentResponseModel = Newtonsoft.Json.JsonConvert.DeserializeObject <CommonResponseModel>(updateMessageQueueStatusToSentString);

            mq.ShouldDelete = true;

            return(updateMessageQueueStatusToSentResponseModel);
        }
Esempio n. 8
0
        private static IEnumerable <WXPublicAccountBlockStatusModel> SetPreviewMessageSuccess(string apiBaseUrl, int serverID,
                                                                                              Proc_GetRobotServerMessageQueueForWXRobot_Result mq,
                                                                                              SendWXPreviewMessageResponseModel sendWXPreviewMessageResponseModel,
                                                                                              IEnumerable <WXPublicAccountBlockStatusModel> wxPublicAccountBlockStatuses)
        {
            #region 状态此消息队列状态为“已发送”【注:此接口,已经自动把公众账号修改为Unblocked状态,所以不用专门更新Unblock状态,以减少跟数据库的请求次数】
            var dataForUpdateMessageQueueStatusToSent = string.Format("serverID={0}&messageQueueIDs={1}&AppMsgIDs={2}", serverID, mq.ID, sendWXPreviewMessageResponseModel.AppMsgID);
            var updateMessageQueueStatusToSentString  = _httper.Post(string.Format("{0}/api/zcooApi/UpdateMessageQueueStatusToSent", apiBaseUrl), dataForUpdateMessageQueueStatusToSent);

            //得到返回Model
            var updateMessageQueueStatusToSentResponseModel = Newtonsoft.Json.JsonConvert.DeserializeObject <CommonResponseModel>(updateMessageQueueStatusToSentString);
            mq.ShouldDelete = true;
            #endregion

            #region 成功时,把公众账号改回Unblocked状态
            if (updateMessageQueueStatusToSentResponseModel != null &&
                string.Compare(updateMessageQueueStatusToSentResponseModel.ReturnMessage, "OK", StringComparison.InvariantCultureIgnoreCase) == 0)
            {
                wxPublicAccountBlockStatuses = UpdateWXPublicAccountBlockStatusModelToUnblockStatus(wxPublicAccountBlockStatuses, (int)mq.PublicAccountID);
            }
            #endregion

            return(wxPublicAccountBlockStatuses);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        /// <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);
            }
        }
Esempio n. 11
0
        /// <summary>
        /// 同步公众账号Block模型。
        /// </summary>
        /// <param name="wxPublicAccountBlockStatusModel"></param>
        /// <param name="messageQueues"></param>
        /// <param name="refresh">是否重新刷新WXPublicAccountBlockStatusModel。如果是:把WXPublicAccountBlockStatusModel下所有的IsBlocked改回为false。</param>
        /// <param name="autoRefreshAfter15">超过15秒的,是否自动把对应的公众账号修改为IsBlocked = false。</param>
        /// <returns></returns>
        private static IEnumerable <WXPublicAccountBlockStatusModel> SyncWXPublicAccountBlockStatusModel(IEnumerable <WXPublicAccountBlockStatusModel> wxPublicAccountBlockStatusModel, IEnumerable <Proc_GetRobotServerMessageQueueForWXRobot_Result> messageQueues, bool refresh, bool autoRefreshAfter15, double checkWXIntervalWhenBlock)
        {
            var wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModel.ToList();
            var messageQueuesDistinctList           = Common.Lists.ListHandler.DistinctBy(messageQueues, m => m.PublicAccountID).ToList();

            #region 如果公众Block模型中,在消息队列不存在,要删除
            Proc_GetRobotServerMessageQueueForWXRobot_Result theMessageQueue       = null;
            WXPublicAccountBlockStatusModel[] wxPublicAccountBlockStatusModelArray = new WXPublicAccountBlockStatusModel[wxPublicAccountBlockStatusModelList.Count];

            wxPublicAccountBlockStatusModelList.CopyTo(wxPublicAccountBlockStatusModelArray);

            foreach (var pba in wxPublicAccountBlockStatusModelArray)
            {
                theMessageQueue = messageQueuesDistinctList.FirstOrDefault(mqd => mqd.PublicAccountID == pba.PublicAccountID);

                if (theMessageQueue == null)
                {
                    wxPublicAccountBlockStatusModelList.Remove(pba);
                }
            }
            #endregion

            #region 确保公众账号中,加入了消息队列中,新进的公众账号,也要记录
            WXPublicAccountBlockStatusModel thePublicAccount = null;
            Proc_GetRobotServerMessageQueueForWXRobot_Result[] messageQueuesArray = new Proc_GetRobotServerMessageQueueForWXRobot_Result[messageQueuesDistinctList.Count];

            messageQueuesDistinctList.CopyTo(messageQueuesArray);

            foreach (var mqd in messageQueuesArray)
            {
                thePublicAccount = wxPublicAccountBlockStatusModelList.FirstOrDefault(p => p.PublicAccountID == mqd.PublicAccountID);

                if (thePublicAccount == null)
                {
                    wxPublicAccountBlockStatusModelList.Add(new WXPublicAccountBlockStatusModel()
                    {
                        PublicAccountID = (int)mqd.PublicAccountID, IsBlocked = false, BlockedDateTime = DateTime.MinValue
                    });
                }
            }
            #endregion

            if (refresh)
            {
                wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModelList.Select(c =>
                {
                    c.IsBlocked = false;
                    return(c);
                }).ToList();
            }
            else if (autoRefreshAfter15) //如果没有强制指定要刷新,但那些超过15秒的公众账号,也应该自动刷新为IsBlocked = false
            {
                DateTime currentDT = Common.Time.NowHandler.GetNowByTimeZone();

                wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModelList.Select(p =>
                {
                    if (p.BlockedDateTime != DateTime.MinValue &&
                        p.BlockedDateTime < currentDT.AddSeconds(-checkWXIntervalWhenBlock))
                    {
                        p.IsBlocked = false;
                    }

                    return(p);
                }).ToList();
            }

            return(wxPublicAccountBlockStatusModelList);
        }
Esempio n. 12
0
        /// <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);
        }