//保存用户回复 public IActionResult SaveReply() { var temp = JsonHelper.DeserializeStringToDictionary <string, string>(Request.Form["json"]); var db = new EFContext(); var userAdvise = db.UserAdvises.Single(u => u.ID == Convert.ToInt64(temp["id"])); userAdvise.IsReply = 1; userAdvise.ReplyMsg = temp["replyMsg"]; var templateId = WxCommonService.GetTemplateId("回复用户"); var data = new ReplyTemplate(); data.UserMsg.Value = userAdvise.Msg; data.ReplyMsg.Value = userAdvise.ReplyMsg; data.Time.Value = userAdvise.UploadTime.ToString("yyyy年MM月dd日hh时mm分ss秒"); if (WxCommonService.SendMsgToUser(userAdvise.OpenId, templateId, data)) { db.SaveChanges(); return(Content("success")); } return(Content("fail")); }
/// <summary> /// 开始处理微信请求 /// </summary> /// <param name="appidSecret"></param> private void ExecHandler(WeiXinConfiguration weiXinConfiguration) { #region 接收普通消息 #region 文本消息类型 /* * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType text * Content 文本消息内容 * MsgId 消息id,64位整型 * * * * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>1348831860</CreateTime> * <MsgType><![CDATA[text]]></MsgType> * <Content><![CDATA[this is a test]]></Content> * <MsgId>1234567890123456</MsgId> * </xml> */ #endregion #region 图片消息 /* * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>1348831860</CreateTime> * <MsgType><![CDATA[image]]></MsgType> * <PicUrl><![CDATA[this is a url]]></PicUrl> * <MediaId><![CDATA[media_id]]></MediaId> * <MsgId>1234567890123456</MsgId> * </xml> * * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType image * PicUrl 图片链接 * MediaId 图片消息媒体id,可以调用多媒体文件下载接口拉取数 据。 * MsgId 消息id,64位整型 */ #endregion #region 语音消息 /* * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>1357290913</CreateTime> * <MsgType><![CDATA[voice]]></MsgType> * <MediaId><![CDATA[media_id]]></MediaId> * <Format><![CDATA[Format]]></Format> * <MsgId>1234567890123456</MsgId> * </xml> * * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 语音为voice * MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数 据。 * Format 语音格式,如amr,speex等 * MsgID 消息id,64位整型 */ #endregion #region 视频消息 /* * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>1357290913</CreateTime> * <MsgType><![CDATA[video]]></MsgType> * <MediaId><![CDATA[media_id]]></MediaId> * <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId> * <MsgId>1234567890123456</MsgId> * </xml> * * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 视频为video * MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数 据。 * ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下 载接 口拉 取数 据。 * MsgId 消息id,64位整型 */ #endregion #region 小视频消息 /* * 小视频消息 * * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>1357290913</CreateTime> * <MsgType><![CDATA[shortvideo]]></MsgType> * <MediaId><![CDATA[media_id]]></MediaId> * <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId> * <MsgId>1234567890123456</MsgId> * </xml> * * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 小视频为shortvideo * MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 * ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 * MsgId 消息id,64位整型 */ #endregion #region 地理位置消息 /* * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>1351776360</CreateTime> * <MsgType><![CDATA[location]]></MsgType> * <Location_X>23.134521</Location_X> * <Location_Y>113.358803</Location_Y> * <Scale>20</Scale> * <Label><![CDATA[位置信息]]></Label> * <MsgId>1234567890123456</MsgId> * </xml> * * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType location * Location_X 地理位置维度 * Location_Y 地理位置经度 * Scale 地图缩放大小 * Label 地理位置信息 * MsgId 消息id,64位整型 */ #endregion #region 链接消息 /* * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>1351776360</CreateTime> * <MsgType><![CDATA[link]]></MsgType> * <Title><![CDATA[公众平台官网链接]]></Title> * <Description><![CDATA[公众平台官网链接]]></Description> * <Url><![CDATA[url]]></Url> * <MsgId>1234567890123456</MsgId> * </xml> * * 参数 描述 * ToUserName 接收方微信号 * FromUserName 发送方微信号,若为普通用户,则是一个OpenID * CreateTime 消息创建时间 * MsgType 消息类型,link * Title 消息标题 * Description 消息描述 * Url 消息链接 * MsgId 消息id,64位整型 */ #endregion #endregion #region 接收事件推送 #region 关注/取消关注事件 /* * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[FromUser]]></FromUserName> * <CreateTime>123456789</CreateTime> * <MsgType><![CDATA[event]]></MsgType> * <Event><![CDATA[subscribe]]></Event> * </xml> * * 参数说明: * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 消息类型,event * Event 事件类型,subscribe(订阅)、unsubscribe(取消订阅) */ #endregion #region 扫描带参数二维码事件 /* * 用户扫描带场景值二维码时,可能推送以下两种事件: * * 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。 * 如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。 * * 1. 用户未关注时,进行关注后的事件推送 * * 推送XML数据包示例: * * <xml><ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[FromUser]]></FromUserName> * <CreateTime>123456789</CreateTime> * <MsgType><![CDATA[event]]></MsgType> * <Event><![CDATA[subscribe]]></Event> * <EventKey><![CDATA[qrscene_123123]]></EventKey> * <Ticket><![CDATA[TICKET]]></Ticket> * </xml> * * 参数说明: * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 消息类型,event * Event 事件类型,subscribe * EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值 * Ticket 二维码的ticket,可用来换取二维码图片 * * 2. 用户已关注时的事件推送 * * 推送XML数据包示例: * * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[FromUser]]></FromUserName> * <CreateTime>123456789</CreateTime> * <MsgType><![CDATA[event]]></MsgType> * <Event><![CDATA[SCAN]]></Event> * <EventKey><![CDATA[SCENE_VALUE]]></EventKey> * <Ticket><![CDATA[TICKET]]></Ticket> * </xml> * * 参数说明: * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 消息类型,event * Event 事件类型,SCAN * EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id * Ticket 二维码的ticket,可用来换取二维码图片 */ #endregion #region 报地理位置事件 /** * 用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,或在进入会话后每5秒上报一次地理位置,公众号可以在公众平台网站中修改以上设置。上报地理位置时,微信会将上报地理位置事件推送到开发者填写的URL。 * * 推送XML数据包示例: * * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>123456789</CreateTime> * <MsgType><![CDATA[event]]></MsgType> * <Event><![CDATA[LOCATION]]></Event> * <Latitude>23.137466</Latitude> * <Longitude>113.352425</Longitude> * <Precision>119.385040</Precision> * </xml> * * 参数说明: * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 消息类型,event * Event 事件类型,LOCATION * Latitude 地理位置纬度 * Longitude 地理位置经度 * Precision 地理位置精度 */ #endregion #region 点击菜单拉取消息时的事件推送 /** * 推送XML数据包示例: * * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[FromUser]]></FromUserName> * <CreateTime>123456789</CreateTime> * <MsgType><![CDATA[event]]></MsgType> * <Event><![CDATA[CLICK]]></Event> * <EventKey><![CDATA[EVENTKEY]]></EventKey> * </xml> * * 参数说明: * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 消息类型,event * Event 事件类型,CLICK * EventKey 事件KEY值,与自定义菜单接口中KEY值对应 */ #endregion #region 点击菜单跳转链接时的事件推送 /** * 推送XML数据包示例: * * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[FromUser]]></FromUserName> * <CreateTime>123456789</CreateTime> * <MsgType><![CDATA[event]]></MsgType> * <Event><![CDATA[VIEW]]></Event> * <EventKey><![CDATA[www.qq.com]]></EventKey> * </xml> * * 参数说明: * 参数 描述 * ToUserName 开发者微信号 * FromUserName 发送方帐号(一个OpenID) * CreateTime 消息创建时间 (整型) * MsgType 消息类型,event * Event 事件类型,VIEW * EventKey 事件KEY值,设置的跳转URL */ #endregion #endregion //接收 xml数据包 Stream xmlStream = _httpContext.Request.InputStream; //构造xml对象 XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(xmlStream); //获取的xml完整文本 _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是入口:" + xmlDocument.OuterXml); //获取根节点 XmlElement rootXmlElement = xmlDocument.DocumentElement; if (rootXmlElement != null) { //开发者微信号 _toUserName = rootXmlElement.SelectSingleNode("ToUserName").InnerText; _fromUserName = rootXmlElement.SelectSingleNode("FromUserName").InnerText; _reciveSender.ToUserName = _fromUserName; _reciveSender.FromUserName = _toUserName; _reciveSender.CreateTime = new GetCreateTime().CreateTime(); _replyTemplate = new ReplyTemplate(_reciveSender); //获取消息类型 转化为小写,方便与全局枚举类对比 _msgType = rootXmlElement.SelectSingleNode("MsgType").InnerText.ToLower(); //推送过来文本消息 全部转化为小写来比较 if (_msgType.Equals(AllEnum.MsgTypeEnum.text.ToString())) { //写入日志 _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条文本消息:" + rootXmlElement.OuterXml); //推送过来的内容 _content = rootXmlElement.SelectSingleNode("Content").InnerText; //回复内容 Reply(weiXinConfiguration, _content); } else if (_msgType.Equals(AllEnum.MsgTypeEnum.link.ToString())) { _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条链接消息:" + rootXmlElement.OuterXml); } else if (_msgType.Equals(AllEnum.MsgTypeEnum.image.ToString())) { _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条图片消息:" + rootXmlElement.OuterXml); } else if (_msgType.Equals(AllEnum.MsgTypeEnum.location.ToString())) { _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条地理位置消息:" + rootXmlElement.OuterXml); } else if (_msgType.Equals(AllEnum.MsgTypeEnum.voice.ToString())) { _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条语音消息:" + rootXmlElement.OuterXml); } else if (_msgType.Equals(AllEnum.MsgTypeEnum.video.ToString())) { _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条视频消息:" + rootXmlElement.OuterXml); } else if (_msgType.Equals(AllEnum.MsgTypeEnum.shortvideo.ToString())) { _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条小视频消息:" + rootXmlElement.OuterXml); } else if (_msgType.Equals("event"))//菜单按钮消息类型 { _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条菜单事件消息:" + rootXmlElement.OuterXml); //事件类型 _menuEvent = rootXmlElement.SelectSingleNode("Event").InnerText.ToLower(); //获取点击按钮的key string menuButtonKey = rootXmlElement.SelectSingleNode("EventKey").InnerText.ToLower(); //订阅关注事件 if (_menuEvent.Equals(AllEnum.EventEnum.subscribe.ToString())) { DefaultReply(); }//取消关注事件 else if (_menuEvent.Equals(AllEnum.EventEnum.unsubscribe.ToString())) { } //点击事件 else if (_menuEvent.Equals(AllEnum.CustomerMenuButtonEvent.click.ToString())) { _debugLog.BugWriteTxt(_log.LogTxtPhyPath, "这是一条点击事件:" + menuButtonKey); if (menuButtonKey.Equals("tsrx")) { MenuName("您 好:\n\r这里是投诉热线:1234567"); } } } } xmlStream.Close(); }