Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 判断模板消息发送是否成功。
        /// </summary>
        /// <param name="sendWXTemplateMessageResponseModel"></param>
        /// <returns></returns>
        public static bool IsTemplateMessageSentSuccessfully(SendWXTemplateMessageResponseModel sendWXTemplateMessageResponseModel)
        {
            bool isSuccess = false;

            //判断是否成功
            if (sendWXTemplateMessageResponseModel != null && sendWXTemplateMessageResponseModel.ErrCode == 0) //不为空,并且错误码为 0时
            {
                isSuccess = true;
            }

            return(isSuccess);
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 判断是否为无效的推送号(模板消息openID)。
        /// </summary>
        /// <param name="sendWXPreviewMessageResponseModel">
        ///40003:invalid openid
        ///40036:invalid template_id size
        ///40037:invalid template_id
        ///47001:data format error
        ///</param>
        /// <returns></returns>
        private static bool IsInvalidPushNoForOpenID(SendWXTemplateMessageResponseModel sendWXTemplateMessageResponseModel)
        {
            var isInvalidPushNo = false;


            if (sendWXPreviewMessageResponseModel == null ||
                sendWXTemplateMessageResponseModel.ErrCode == 40003 ||
                sendWXTemplateMessageResponseModel.ErrCode == 40036 ||
                sendWXTemplateMessageResponseModel.ErrCode == 40037 ||
                sendWXTemplateMessageResponseModel.ErrCode == 47001 ||
                sendWXTemplateMessageResponseModel.ErrCode == -1
                )
            {
                isInvalidPushNo = true;
            }

            return(isInvalidPushNo);
        }
Ejemplo n.º 5
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);
            }
        }