/// <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. 2
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. 3
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);
        }