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