/// <summary> /// 构造函数 /// </summary> /// <param name="toUserName"></param> /// <param name="fromUserName"></param> /// <param name="createTime"></param> /// <param name="eventType"></param> /// <param name="eventKey"></param> /// <param name="scanCodeInfo"></param> public RequestScanCodeMessage(string toUserName, string fromUserName, DateTime createTime, RequestEventTypeEnum eventType, string eventKey, ScanCodeInfo scanCodeInfo) : base(toUserName, fromUserName, createTime, eventType) { if (eventType != RequestEventTypeEnum.scancode_push && eventType != RequestEventTypeEnum.scancode_waitmsg) { throw new ArgumentOutOfRangeException("EventType", "事件类型错误。"); } ScanCodeInfo = scanCodeInfo; }
/// <summary> /// 构造函数 /// </summary> /// <param name="toUserName"></param> /// <param name="fromUserName"></param> /// <param name="createTime"></param> /// <param name="eventType"></param> /// <param name="eventKey"></param> /// <param name="sendPicsInfo"></param> public RequestPicMessage(string toUserName, string fromUserName, DateTime createTime, RequestEventTypeEnum eventType, string eventKey, SendPicsInfo sendPicsInfo) : base(toUserName, fromUserName, createTime, eventType) { if (eventType != RequestEventTypeEnum.pic_sysphoto && eventType != RequestEventTypeEnum.pic_photo_or_album && eventType != RequestEventTypeEnum.pic_weixin) { throw new ArgumentOutOfRangeException("Event", "错误的事件类型。"); } EventKey = eventKey; SendPicsInfo = sendPicsInfo; }
/// <summary> /// 构造函数 /// </summary> /// <param name="toUserName"></param> /// <param name="fromUserName"></param> /// <param name="createTime"></param> /// <param name="eventType"></param> /// <param name="eventKey"></param> /// <param name="scanType"></param> /// <param name="scanResult"></param> public RequestScanCodeMessage(string toUserName, string fromUserName, DateTime createTime, RequestEventTypeEnum eventType, string eventKey, string scanType, string scanResult) : this(toUserName, fromUserName, createTime, eventType, eventKey, new ScanCodeInfo(scanType, scanResult)) { }
/// <summary> /// 构造函数 /// </summary> /// <param name="toUserName"></param> /// <param name="fromUserName"></param> /// <param name="createTime"></param> /// <param name="eventType"></param> /// <param name="eventKey"></param> /// <param name="pic"></param> public RequestPicMessage(string toUserName, string fromUserName, DateTime createTime, RequestEventTypeEnum eventType, string eventKey, string pic) : this(toUserName, fromUserName, createTime, eventType, eventKey, new string[] { pic }) { }
/// <summary> /// 构造函数 /// </summary> /// <param name="toUserName"></param> /// <param name="fromUserName"></param> /// <param name="createTime"></param> /// <param name="eventType"></param> /// <param name="eventKey"></param> /// <param name="pics"></param> public RequestPicMessage(string toUserName, string fromUserName, DateTime createTime, RequestEventTypeEnum eventType, string eventKey, IEnumerable <string> pics) : this(toUserName, fromUserName, createTime, eventType, eventKey, new SendPicsInfo(pics)) { }
/// <summary> /// 构造函数 /// </summary> /// <param name="toUserName"></param> /// <param name="fromUserName"></param> /// <param name="createTime"></param> /// <param name="eventKey"></param> public RequestEventMessage(string toUserName, string fromUserName, DateTime createTime, RequestEventTypeEnum eventType) : base(toUserName, fromUserName, createTime, RequestMessageTypeEnum.Event) { Event = eventType; }
/// <summary> /// 解析弹出发送图片的推送事件消息 /// </summary> /// <param name="baseMessage">消息基类</param> /// <param name="eventType">事件类型</param> /// <param name="jo">消息对象</param> /// <returns>返回弹出发送图片的推送事件消息</returns> private static RequestPicMessage ParsePicMessage(RequestBaseMessage baseMessage, RequestEventTypeEnum eventType, JObject jo) { string eventKey = (string)jo["EventKey"][CDATA_KEY]; if (string.IsNullOrWhiteSpace(eventKey)) { throw new ArgumentNullException("EventKey", "EventKey为空。"); } JObject joSendPicsInfo = (JObject)jo["SendPicsInfo"]; int count = (int)joSendPicsInfo["Count"]; if (count <= 0) { throw new ArgumentOutOfRangeException("Count", "解析弹出发送图片的推送事件消息出错,图片数量必须大于0。"); } else { JToken jtPicList = joSendPicsInfo["PicList"]; if (jtPicList.Type == JTokenType.Array) { string[] pics = new string[count]; JArray jaPicList = (JArray)jtPicList; int idx = 0; foreach (JObject joItem in jaPicList) { string pic = (string)joItem["item"]["PicMd5Sum"][CDATA_KEY]; pics[idx] = pic; idx++; } return(new RequestPicMessage(baseMessage.ToUserName, baseMessage.FromUserName, baseMessage.CreateTime, eventType, eventKey, pics)); } else if (jtPicList.Type == JTokenType.Object) { JObject joPicList = (JObject)jtPicList; string pic = (string)joPicList["item"]["PicMd5Sum"][CDATA_KEY]; return(new RequestPicMessage(baseMessage.ToUserName, baseMessage.FromUserName, baseMessage.CreateTime, eventType, eventKey, pic)); } else { throw new ArgumentOutOfRangeException("PicList", "解析弹出发送图片的推送事件消息出错,图片列表不正确。"); } } }
/// <summary> /// 解析扫码的推送事件消息 /// </summary> /// <param name="baseMessage">消息基类</param> /// <param name="eventType">事件类型</param> /// <param name="jo">消息对象</param> /// <returns>返回扫码的推送事件消息</returns> private static RequestScanCodeMessage ParseScanCodeMessage(RequestBaseMessage baseMessage, RequestEventTypeEnum eventType, JObject jo) { string eventKey = (string)jo["EventKey"][CDATA_KEY]; if (string.IsNullOrWhiteSpace(eventKey)) { throw new ArgumentNullException("EventKey", "EventKey为空。"); } JObject joScanCodeInfo = (JObject)jo["ScanCodeInfo"]; string scanType = (string)joScanCodeInfo["ScanType"][CDATA_KEY]; string scanResult = (string)joScanCodeInfo["ScanResult"][CDATA_KEY]; return(new RequestScanCodeMessage(baseMessage.ToUserName, baseMessage.FromUserName, baseMessage.CreateTime, eventType, eventKey, scanType, scanResult)); }
/// <summary> /// 解析事件消息 /// </summary> /// <param name="baseMessage">消息基类</param> /// <param name="jo">消息对象</param> /// <returns>返回事件消息</returns> private static RequestBaseMessage ParseEventMessage(RequestBaseMessage baseMessage, JObject jo) { RequestBaseMessage msg = null; string strEvent = (string)jo["Event"][CDATA_KEY]; if (string.IsNullOrWhiteSpace(strEvent)) { throw new ArgumentNullException("Event", "Event为空。"); } RequestEventTypeEnum eventType = (RequestEventTypeEnum)Enum.Parse(typeof(RequestEventTypeEnum), strEvent, true); switch (eventType) { case RequestEventTypeEnum.subscribe: msg = ParseSubscribeMessage(baseMessage, jo); break; case RequestEventTypeEnum.unsubscribe: msg = ParseUnsubscribeMessage(baseMessage, jo); break; case RequestEventTypeEnum.SCAN: msg = ParseScanMessage(baseMessage, jo); break; case RequestEventTypeEnum.LOCATION: msg = ParseReportLocationMessage(baseMessage, jo); break; case RequestEventTypeEnum.CLICK: msg = ParseClickMessage(baseMessage, jo); break; case RequestEventTypeEnum.VIEW: msg = ParseViewMessage(baseMessage, jo); break; case RequestEventTypeEnum.scancode_push: case RequestEventTypeEnum.scancode_waitmsg: msg = ParseScanCodeMessage(baseMessage, eventType, jo); break; case RequestEventTypeEnum.pic_sysphoto: case RequestEventTypeEnum.pic_photo_or_album: case RequestEventTypeEnum.pic_weixin: msg = ParsePicMessage(baseMessage, eventType, jo); break; case RequestEventTypeEnum.location_select: msg = ParseLocationSelectMessage(baseMessage, jo); break; case RequestEventTypeEnum.MASSSENDJOBFINISH: msg = ParseMassSendJobFinishMessage(baseMessage, jo); break; case RequestEventTypeEnum.TEMPLATESENDJOBFINISH: msg = ParseTemplateSendJobFinishMessage(baseMessage, jo); break; case RequestEventTypeEnum.kf_create_session: msg = ParseKfCreateAccountMessage(baseMessage, jo); break; case RequestEventTypeEnum.kf_close_session: msg = ParseKfCloseAccountMessage(baseMessage, jo); break; case RequestEventTypeEnum.kf_switch_session: msg = ParseKfSwitchAccountMessage(baseMessage, jo); break; default: throw new NotImplementedException(string.Format("未实现消息类型{0:g}解析。", msg.MsgType)); } return(msg); }