Ejemplo n.º 1
0
        /// <summary>
        /// 获取请求消息和实体之间的映射结果
        /// </summary>
        /// <param name="requestMsgType"></param>
        /// <returns></returns>
        public override IRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null)
        {
            RequestMessageBase requestMessage;

            switch (requestMsgType)
            {
            case RequestMsgType.Text:
                requestMessage = new RequestMessageText();
                break;

            case RequestMsgType.Image:
                requestMessage = new RequestMessageImage();
                break;

            case RequestMsgType.MiniProgramPage:    //小程序页面
                requestMessage = new RequestMessageMiniProgramPage();
                break;

            case RequestMsgType.NeuChar:
                requestMessage = new RequestMessageNeuChar();
                break;

            case RequestMsgType.Event:
                //判断Event类型
                switch (doc.Root.Element("Event").Value.ToUpper())
                {
                case "USER_ENTER_TEMPSESSION":        //进入客服会话
                    requestMessage = new RequestMessageEvent_UserEnterTempSession();
                    break;

                case "WEAPP_AUDIT_SUCCESS":         //小程序审核成功
                    requestMessage = new RequestMessageEvent_WeAppAuditSuccess();
                    break;

                case "WEAPP_AUDIT_FAIL":         //小程序审核失败
                    requestMessage = new RequestMessageEvent_WeAppAuditFail();
                    break;

                case "WEAPP_AUDIT_DELAY":         //小程序审核延后
                    requestMessage = new RequestMessageEvent_WeAppAuditDelay();
                    break;

                case "WXA_NICKNAME_AUDIT":         //名称审核结果
                    requestMessage = new RequestMessageEvent_NicknameAudit();
                    break;

                default:        //其他意外类型(也可以选择抛出异常)
                    requestMessage = new RequestMessageEventBase();
                    break;
                }
                break;

            default:
                throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", requestMsgType), new ArgumentOutOfRangeException());    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
            }
            return(requestMessage);
        }
        //<?xml version="1.0" encoding="utf-8"?>
        //<xml>
        //  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
        //  <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
        //  <CreateTime>1357986928</CreateTime>
        //  <MsgType><![CDATA[text]]></MsgType>
        //  <Content><![CDATA[中文]]></Content>
        //  <MsgId>5832509444155992350</MsgId>
        //</xml>

        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null)
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType     msgType;
            int aaa;
            int bbb;

            try
            {
                msgType = MsgTypeHelper.GetRequestMsgType(doc);
                switch (msgType)
                {
                case RequestMsgType.Text:
                    requestMessage = new RequestMessageText();
                    break;

                case RequestMsgType.Image:
                    requestMessage = new RequestMessageImage();
                    break;

                case RequestMsgType.NeuChar:
                    requestMessage = new RequestMessageNeuChar();
                    break;

                case RequestMsgType.Event:
                    //判断Event类型
                    switch (doc.Root.Element("Event").Value.ToUpper())
                    {
                    case "USER_ENTER_TEMPSESSION":        //进入客服会话
                        requestMessage = new RequestMessageEvent_UserEnterTempSession();
                        break;

                    default:        //其他意外类型(也可以选择抛出异常)
                        requestMessage = new RequestMessageEventBase();
                        break;
                    }
                    break;

                default:
                    throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                }
                Senparc.NeuChar.Helpers.EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(requestMessage);
        }
        /// <summary>
        /// 获取请求消息和实体之间的映射结果
        /// </summary>
        /// <param name="requestMsgType"></param>
        /// <returns></returns>
        public override IRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null)
        {
            RequestMessageBase requestMessage;

            switch (requestMsgType)
            {
            case RequestMsgType.Text:
                requestMessage = new RequestMessageText();
                break;

            case RequestMsgType.Image:
                requestMessage = new RequestMessageImage();
                break;

            case RequestMsgType.NeuChar:
                requestMessage = new RequestMessageNeuChar();
                break;

            case RequestMsgType.Event:
                //判断Event类型
                switch (doc.Root.Element("Event").Value.ToUpper())
                {
                case "USER_ENTER_TEMPSESSION":        //进入客服会话
                    requestMessage = new RequestMessageEvent_UserEnterTempSession();
                    break;

                default:        //其他意外类型(也可以选择抛出异常)
                    requestMessage = new RequestMessageEventBase();
                    break;
                }
                break;

            default:
                throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", requestMsgType), new ArgumentOutOfRangeException());    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
            }
            return(requestMessage);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// NeuChar 请求
        /// </summary>
        public virtual async Task <IResponseMessageBase> OnNeuCharRequestAsync(RequestMessageNeuChar requestMessage)
        {
            try
            {
                var path = ServerUtility.ContentRootMapPath("~/App_Data/NeuChar");
                //SenparcTrace.SendCustomLog("OnNeuCharRequest path", path);

                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                var    file    = Path.Combine(path, "NeuCharRoot.config");
                bool   success = true;
                string result  = null;

                var configFileExisted = File.Exists(file);
                if (!configFileExisted)
                {
                    using (var fs = new FileStream(file, FileMode.CreateNew))
                    {
                        using (var sw = new StreamWriter(fs))
                        {
                            await sw.WriteLineAsync(NeuralSystem.DEFAULT_CONFIG_FILE_CONENT).ConfigureAwait(false);
                        }
                        await fs.FlushAsync().ConfigureAwait(false);
                    }
                }

                switch (requestMessage.NeuCharMessageType)
                {
                case NeuCharActionType.GetConfig:
                {
                    if (configFileExisted)
                    {
                        //文件刚创建,但不再读取,此时读取可能会发生“无法访问已关闭文件”的错误
                        using (var fs = FileHelper.GetFileStream(file))
                        {
                            using (var sr = new StreamReader(fs, Encoding.UTF8))
                            {
                                var json = await sr.ReadToEndAsync().ConfigureAwait(false);

                                result = json;
                            }
                        }
                    }
                    else
                    {
                        result = NeuralSystem.DEFAULT_CONFIG_FILE_CONENT;        //TODO:初始化一个对象
                    }
                }
                break;

                case NeuCharActionType.SaveConfig:
                {
                    var configRootJson = requestMessage.ConfigRoot;
                    SenparcTrace.SendCustomLog("收到NeuCharRequest", "字符串长度:" + configRootJson.Length.ToString());
                    var configRoot = SerializerHelper.GetObject <ConfigRoot>(configRootJson);       //这里只做序列化校验

                    //TODO:进行验证


                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }

                    var fileTemp = Path.Combine(path, $"NeuCharRoot.temp.{SystemTime.Now.ToString("yyyyMMdd-HHmmss")}.config");
                    //TODO:后期也可以考虑把不同模块分离到不同的文件中

                    using (var fs = new FileStream(fileTemp, FileMode.Create))
                    {
                        using (var sw = new StreamWriter(fs))
                        {
                            await sw.WriteAsync(configRootJson).ConfigureAwait(false);

                            await sw.FlushAsync().ConfigureAwait(false);
                        }
                    }

                    //历史文件备份,并替换临时文件
                    File.Move(file, file.Replace(".config", $".bak.{SystemTime.Now.ToString("yyyyMMdd-HHmmss")}.config"));
                    File.Move(fileTemp, file);

                    //刷新数据
                    var neuralSystem = NeuralSystem.Instance;
                    neuralSystem.ReloadNode();
                }
                break;

                case NeuCharActionType.CheckNeuChar:
                {
                    //TODO:进行有效性检验
                    var configRoot = requestMessage.ConfigRoot?.GetObject <APMDomainConfig>();

                    if (configRoot == null || configRoot.Domain.IsNullOrWhiteSpace())
                    {
                        success = false;
                        result  = "未指定 Domain!";
                        break;
                    }

                    var co2netDataOperation = new DataOperation(configRoot.Domain);

                    //获取所有数据
                    var dataItems = await co2netDataOperation.ReadAndCleanDataItemsAsync(configRoot.RemoveData, true).ConfigureAwait(false);

                    result = dataItems.ToJson();
                }
                break;

                case NeuCharActionType.PushNeuCharAppConfig:    //推送 NeuChar App 配置
                {
                    var configFileDir = Path.Combine(path, "AppConfig");
                    if (!Directory.Exists(configFileDir))
                    {
                        Directory.CreateDirectory(configFileDir);        //这里也可以不创建,除非是为了推送
                    }

                    //还原一次,为了统一格式,并未后续处理提供能力(例如调整缩进格式)
                    var requestData = requestMessage.RequestData.GetObject <PushConfigRequestData>();
                    var mainVersion = requestData.Version.Split('.')[0];        //主版本号
                    //配置文件路径:~/App_Data/NeuChar/AppConfig/123-v1.config
                    var configFilePath = Path.Combine(configFileDir, $"{requestData.AppId}-v{mainVersion}.config");

                    using (var fs = new FileStream(configFilePath, FileMode.Create))
                    {
                        using (var sw = new StreamWriter(fs, Encoding.UTF8))
                        {
                            var json = requestData.Config.ToJson(true);        //带缩进格式的 JSON 字符串
                            await sw.WriteAsync(json).ConfigureAwait(false);   //写入 Json 文件

                            await sw.FlushAsync().ConfigureAwait(false);
                        }
                    }
                    result = "OK";
                }
                break;

                case NeuCharActionType.PullNeuCharAppConfig:    //拉取 NeuCharApp 配置
                {
                    var requestData = requestMessage.RequestData.GetObject <PullConfigRequestData>();
                    var mainVersion = requestData.Version.Split('.')[0];        //主版本号

                    var configFileDir = Path.Combine(path, "AppConfig");
                    //配置文件路径:~/App_Data/NeuChar/AppConfig/123-v1.config
                    var configFilePath = Path.Combine(configFileDir, $"{requestData.AppId}-v{mainVersion}.config");
                    if (!File.Exists(configFilePath))
                    {
                        //文件不存在
                        result  = $"配置文件不存在,请先推送或设置配置文件,地址:{configFilePath}";
                        success = false;
                    }
                    else
                    {
                        //读取内容
                        using (var fs = FileHelper.GetFileStream(configFilePath))
                        {
                            using (var sr = new StreamReader(fs, Encoding.UTF8))
                            {
                                var json = await sr.ReadToEndAsync().ConfigureAwait(false);        //带缩进格式的 JSON 字符串(文件中的原样)

                                result = json;
                            }
                        }
                    }
                }
                break;

                default:
                    break;
                }

                var successMsg = new
                {
                    success = success,
                    result  = result
                };
                TextResponseMessage = successMsg.ToJson();
            }
            catch (Exception ex)
            {
                var errMsg = new
                {
                    success = false,
                    result  = ex.Message
                };
                TextResponseMessage = errMsg.ToJson();
            }

            return(null);
        }
Ejemplo n.º 5
0
 public virtual async Task <IResponseMessageBase> OnNeuCharRequest(RequestMessageNeuChar requestMessage)
 {
     return(await OnNeuCharRequestAsync(requestMessage).ConfigureAwait(false));
 }
Ejemplo n.º 6
0
        /// <summary>
        /// NeuChar 请求
        /// </summary>
        public virtual IResponseMessageBase OnNeuCharRequest(RequestMessageNeuChar requestMessage)
        {
            try
            {
                var    path   = ServerUtility.ContentRootMapPath("~/App_Data/NeuChar");
                var    file   = Path.Combine(path, "NeuCharRoot.config");
                string result = null;

                switch (requestMessage.NeuCharMessageType)
                {
                case NeuCharMessageType.GetConfig:
                {
                    if (File.Exists(file))
                    {
                        using (var fs = FileHelper.GetFileStream(file))
                        {
                            using (var sr = new StreamReader(fs, Encoding.UTF8))
                            {
                                var json = sr.ReadToEnd();
                                result = json;
                            }
                        }
                    }
                    else
                    {
                        result = "{}";        //TODO:初始化一个对象
                    }
                }
                break;

                case NeuCharMessageType.SaveConfig:
                {
                    var configRootJson = requestMessage.ConfigRoot;
                    SenparcTrace.SendCustomLog("收到NeuCharRequest", configRootJson);
                    var configRoot = SerializerHelper.GetObject <ConfigRoot>(configRootJson);       //这里只做序列化校验

                    //TODO:进行验证


                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }

                    var fileBak = Path.Combine(path, "NeuCharRoot.bak.config");
                    //TODO:后期也可以考虑把不同模块分离到不同的文件中

                    File.Delete(fileBak);

                    using (var fs = new FileStream(fileBak, FileMode.CreateNew))
                    {
                        using (var sw = new StreamWriter(fs))
                        {
                            sw.Write(configRootJson);
                            sw.Flush();
                        }
                    }

                    //替换备份文件
                    File.Delete(file);
                    File.Move(fileBak, file);

                    //刷新数据
                    var neuralSystem = NeuralSystem.Instance;
                    neuralSystem.ReloadNode();
                }
                break;

                default:
                    break;
                }


                var successMsg = new
                {
                    success = true,
                    result  = result
                };
                TextResponseMessage = successMsg.ToJson();
            }
            catch (Exception ex)
            {
                var errMsg = new
                {
                    success = false,
                    result  = ex.Message
                };
                TextResponseMessage = errMsg.ToJson();
            }

            return(null);
        }
Ejemplo n.º 7
0
        //<?xml version="1.0" encoding="utf-8"?>
        //<xml>
        //  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
        //  <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
        //  <CreateTime>1357986928</CreateTime>
        //  <MsgType><![CDATA[text]]></MsgType>
        //  <Content><![CDATA[中文]]></Content>
        //  <MsgId>5832509444155992350</MsgId>
        //</xml>

        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null)
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType     msgType;

            try
            {
                msgType = MsgTypeHelper.GetRequestMsgType(doc);
                switch (msgType)
                {
                case RequestMsgType.Text:
                    requestMessage = new RequestMessageText();
                    break;

                case RequestMsgType.Location:
                    requestMessage = new RequestMessageLocation();
                    break;

                case RequestMsgType.Image:
                    requestMessage = new RequestMessageImage();
                    break;

                case RequestMsgType.Voice:
                    requestMessage = new RequestMessageVoice();
                    break;

                case RequestMsgType.Video:
                    requestMessage = new RequestMessageVideo();
                    break;

                case RequestMsgType.Link:
                    requestMessage = new RequestMessageLink();
                    break;

                case RequestMsgType.ShortVideo:
                    requestMessage = new RequestMessageShortVideo();
                    break;

                case RequestMsgType.File:
                    requestMessage = new RequestMessageFile();
                    break;

                case RequestMsgType.NeuChar:
                    requestMessage = new RequestMessageNeuChar();
                    break;

                case RequestMsgType.Event:
                    //判断Event类型
                    switch (doc.Root.Element("Event").Value.ToUpper())
                    {
                    case "ENTER":        //进入会话
                        requestMessage = new RequestMessageEvent_Enter();
                        break;

                    case "LOCATION":        //地理位置
                        requestMessage = new RequestMessageEvent_Location();
                        break;

                    case "SUBSCRIBE":        //订阅(关注)
                        requestMessage = new RequestMessageEvent_Subscribe();
                        break;

                    case "UNSUBSCRIBE":        //取消订阅(关注)
                        requestMessage = new RequestMessageEvent_Unsubscribe();
                        break;

                    case "CLICK":        //菜单点击
                        requestMessage = new RequestMessageEvent_Click();
                        break;

                    case "SCAN":        //二维码扫描
                        requestMessage = new RequestMessageEvent_Scan();
                        break;

                    case "VIEW":        //URL跳转
                        requestMessage = new RequestMessageEvent_View();
                        break;

                    case "MASSSENDJOBFINISH":
                        requestMessage = new RequestMessageEvent_MassSendJobFinish();
                        break;

                    case "TEMPLATESENDJOBFINISH":        //模板信息
                        requestMessage = new RequestMessageEvent_TemplateSendJobFinish();
                        break;

                    case "SCANCODE_PUSH":        //扫码推事件(scancode_push)
                        requestMessage = new RequestMessageEvent_Scancode_Push();
                        break;

                    case "SCANCODE_WAITMSG":        //扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg)
                        requestMessage = new RequestMessageEvent_Scancode_Waitmsg();
                        break;

                    case "PIC_SYSPHOTO":        //弹出系统拍照发图(pic_sysphoto)
                        requestMessage = new RequestMessageEvent_Pic_Sysphoto();
                        break;

                    case "PIC_PHOTO_OR_ALBUM":        //弹出拍照或者相册发图(pic_photo_or_album)
                        requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album();
                        break;

                    case "PIC_WEIXIN":        //弹出微信相册发图器(pic_weixin)
                        requestMessage = new RequestMessageEvent_Pic_Weixin();
                        break;

                    case "LOCATION_SELECT":        //弹出地理位置选择器(location_select)
                        requestMessage = new RequestMessageEvent_Location_Select();
                        break;

                    case "CARD_PASS_CHECK":        //卡券通过审核
                        requestMessage = new RequestMessageEvent_Card_Pass_Check();
                        break;

                    case "CARD_NOT_PASS_CHECK":        //卡券未通过审核
                        requestMessage = new RequestMessageEvent_Card_Not_Pass_Check();
                        break;

                    case "USER_GET_CARD":        //领取卡券
                        requestMessage = new RequestMessageEvent_User_Get_Card();
                        break;

                    case "USER_DEL_CARD":        //删除卡券
                        requestMessage = new RequestMessageEvent_User_Del_Card();
                        break;

                    case "KF_CREATE_SESSION":        //多客服接入会话
                        requestMessage = new RequestMessageEvent_Kf_Create_Session();
                        break;

                    case "KF_CLOSE_SESSION":        //多客服关闭会话
                        requestMessage = new RequestMessageEvent_Kf_Close_Session();
                        break;

                    case "KF_SWITCH_SESSION":        //多客服转接会话
                        requestMessage = new RequestMessageEvent_Kf_Switch_Session();
                        break;

                    case "POI_CHECK_NOTIFY":        //审核结果事件推送
                        requestMessage = new RequestMessageEvent_Poi_Check_Notify();
                        break;

                    case "WIFICONNECTED":        //Wi-Fi连网成功事件
                        requestMessage = new RequestMessageEvent_WifiConnected();
                        break;

                    case "USER_CONSUME_CARD":        //卡券核销
                        requestMessage = new RequestMessageEvent_User_Consume_Card();
                        break;

                    case "USER_ENTER_SESSION_FROM_CARD":        //从卡券进入公众号会话
                        requestMessage = new RequestMessageEvent_User_Enter_Session_From_Card();
                        break;

                    case "USER_VIEW_CARD":        //进入会员卡
                        requestMessage = new RequestMessageEvent_User_View_Card();
                        break;

                    case "MERCHANT_ORDER":        //微小店订单付款通知
                        requestMessage = new RequestMessageEvent_Merchant_Order();
                        break;

                    case "SUBMIT_MEMBERCARD_USER_INFO":        //接收会员信息事件通知
                        requestMessage = new RequestMessageEvent_Submit_Membercard_User_Info();
                        break;

                    case "SHAKEAROUNDUSERSHAKE":        //摇一摇事件通知
                        requestMessage = new RequestMessageEvent_ShakearoundUserShake();
                        break;

                    case "USER_GIFTING_CARD":        //卡券转赠事件推送
                        requestMessage = new RequestMessageEvent_User_Gifting_Card();
                        break;

                    case "USER_PAY_FROM_PAY_CELL":        // 微信买单完成
                        requestMessage = new RequestMessageEvent_User_Pay_From_Pay_Cell();
                        break;

                    case "UPDATE_MEMBER_CARD":        // 会员卡内容更新事件:会员卡积分余额发生变动时
                        requestMessage = new RequestMessageEvent_Update_Member_Card();
                        break;

                    case "CARD_SKU_REMIND":        //卡券库存报警事件:当某个card_id的初始库存数大于200且当前库存小于等于100时
                        requestMessage = new RequestMessageEvent_Card_Sku_Remind();
                        break;

                    case "CARD_PAY_ORDER":        //券点流水详情事件:当商户朋友的券券点发生变动时
                        requestMessage = new RequestMessageEvent_Card_Pay_Order();
                        break;

                    case "APPLY_MERCHANT_AUDIT_INFO":        //创建门店小程序审核事件
                        requestMessage = new RequestMessageEvent_ApplyMerchantAuditInfo();
                        break;

                    case "CREATE_MAP_POI_AUDIT_INFO":        //从腾讯地图中创建门店审核事件
                        requestMessage = new RequestMessageEvent_CreateMapPoiAuditInfo();
                        break;

                    case "ADD_STORE_AUDIT_INFO":        //门店小程序中创建门店审核事件
                        requestMessage = new RequestMessageEvent_AddStoreAuditInfo();
                        break;

                    case "MODIFY_STORE_AUDIT_INFO":        //修改门店图片审核事件
                        requestMessage = new RequestMessageEvent_ModifyStoreAuditInfo();
                        break;

                    case "VIEW_MINIPROGRAM":        //微信点击菜单跳转小程序的事件推送的事件
                        requestMessage = new RequestMessageEvent_View_Miniprogram();
                        break;

                        #region 卡券回调
                    case "GIFTCARD_PAY_DONE":        //券点流水详情事件:当商户朋友的券券点发生变动时
                        requestMessage = new RequestMessageEvent_GiftCard_Pay_Done();
                        break;

                    case "GIFTCARD_SEND_TO_FRIEND":        //券点流水详情事件:当商户朋友的券券点发生变动时
                        requestMessage = new RequestMessageEvent_GiftCard_Send_To_Friend();
                        break;

                    case "GIFTCARD_USER_ACCEPT":        //券点流水详情事件:当商户朋友的券券点发生变动时
                        requestMessage = new RequestMessageEvent_GiftCard_User_Accept();
                        break;
                        #endregion

                        #region 微信认证事件推送
                    case "QUALIFICATION_VERIFY_SUCCESS":        //资质认证成功(此时立即获得接口权限)
                        requestMessage = new RequestMessageEvent_QualificationVerifySuccess();
                        break;

                    case "QUALIFICATION_VERIFY_FAIL":        //资质认证失败
                        requestMessage = new RequestMessageEvent_QualificationVerifyFail();
                        break;

                    case "NAMING_VERIFY_SUCCESS":        //名称认证成功(即命名成功)
                        requestMessage = new RequestMessageEvent_NamingVerifySuccess();
                        break;

                    case "NAMING_VERIFY_FAIL":        //名称认证失败(这时虽然客户端不打勾,但仍有接口权限)
                        requestMessage = new RequestMessageEvent_NamingVerifyFail();
                        break;

                    case "ANNUAL_RENEW":        //年审通知
                        requestMessage = new RequestMessageEvent_AnnualRenew();
                        break;

                    case "VERIFY_EXPIRED":        //认证过期失效通知
                        requestMessage = new RequestMessageEvent_VerifyExpired();
                        break;

                        #endregion

                        #region 小程序审核事件推送
                    case "WEAPP_AUDIT_SUCCESS":         //小程序审核成功
                        requestMessage = new RequestMessageEvent_WeAppAuditSuccess();
                        break;

                    case "WEAPP_AUDIT_FAIL":         //小程序审核失败
                        requestMessage = new RequestMessageEvent_WeAppAuditFail();
                        break;
                        #endregion

                    default:        //其他意外类型(也可以选择抛出异常)
                        requestMessage = new RequestMessageEventBase();
                        break;
                    }
                    break;

                default:
                {
                    requestMessage = new RequestMessageUnknownType()
                    {
                        RequestDocument = doc
                    };

                    #region v14.8.3 之前的方案,直接在这里抛出异常

                    /*
                     * throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                     */

                    #endregion

                    break;
                }
                }
                Senparc.NeuChar.Helpers.EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(requestMessage);
        }
Ejemplo n.º 8
0
 /// <summary>
 /// NeuChar 请求
 /// </summary>
 public virtual async Task <IResponseMessageBase> OnNeuCharRequestAsync(RequestMessageNeuChar requestMessage)
 {
     return(await DefaultAsyncMethod(requestMessage, () => OnNeuCharRequest(requestMessage)).ConfigureAwait(false));
 }
Ejemplo n.º 9
0
        /// <summary>
        /// NeuChar 请求
        /// </summary>
        public virtual IResponseMessageBase OnNeuCharRequest(RequestMessageNeuChar requestMessage)
        {
            try
            {
                var path = ServerUtility.ContentRootMapPath("~/App_Data/NeuChar");
                //SenparcTrace.SendCustomLog("OnNeuCharRequest path", path);

                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                var    file   = Path.Combine(path, "NeuCharRoot.config");
                string result = null;

                var configFileExisted = File.Exists(file);
                if (!configFileExisted)
                {
                    using (var fs = new FileStream(file, FileMode.CreateNew))
                    {
                        using (var sw = new StreamWriter(fs))
                        {
                            sw.WriteLine(NeuralSystem.DEFAULT_CONFIG_FILE_CONENT);
                        }
                        fs.Flush();
                    }
                }

                switch (requestMessage.NeuCharMessageType)
                {
                case NeuCharActionType.GetConfig:
                {
                    if (configFileExisted)        //本次对话会创建,但不在读取,利可读取可能会发生“无法访问已关闭文件”的错误
                    {
                        using (var fs = FileHelper.GetFileStream(file))
                        {
                            using (var sr = new StreamReader(fs, Encoding.UTF8))
                            {
                                var json = sr.ReadToEnd();
                                result = json;
                            }
                        }
                    }
                    else
                    {
                        result = NeuralSystem.DEFAULT_CONFIG_FILE_CONENT;        //TODO:初始化一个对象
                    }
                }
                break;

                case NeuCharActionType.SaveConfig:
                {
                    var configRootJson = requestMessage.ConfigRoot;
                    SenparcTrace.SendCustomLog("收到NeuCharRequest", "字符串长度:" + configRootJson.Length.ToString());
                    var configRoot = SerializerHelper.GetObject <ConfigRoot>(configRootJson);       //这里只做序列化校验

                    //TODO:进行验证


                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                    }

                    var fileTemp = Path.Combine(path, $"NeuCharRoot.temp.{DateTime.Now.ToString("yyyyMMdd-HHmmss")}.config");
                    //TODO:后期也可以考虑把不同模块分离到不同的文件中

                    File.Delete(fileTemp);

                    using (var fs = new FileStream(fileTemp, FileMode.CreateNew))
                    {
                        using (var sw = new StreamWriter(fs))
                        {
                            sw.Write(configRootJson);
                            sw.Flush();
                        }
                    }

                    //历史文件备份,并替换临时文件
                    File.Move(file, file.Replace(".config", $".bak.{DateTime.Now.ToString("yyyyMMdd-HHmmss")}.config"));
                    File.Move(fileTemp, file);

                    //刷新数据
                    var neuralSystem = NeuralSystem.Instance;
                    neuralSystem.ReloadNode();
                }
                break;

                case NeuCharActionType.CheckNeuChar:
                {
                    //TODO:进行有效性检验
                }
                break;

                default:
                    break;
                }


                var successMsg = new
                {
                    success = true,
                    result  = result
                };
                TextResponseMessage = successMsg.ToJson();
            }
            catch (Exception ex)
            {
                var errMsg = new
                {
                    success = false,
                    result  = ex.Message
                };
                TextResponseMessage = errMsg.ToJson();
            }

            return(null);
        }
Ejemplo n.º 10
0
 /// <summary>
 /// NeuChar 请求
 /// </summary>
 public virtual async Task <IResponseMessageBase> OnNeuCharRequestAsync(RequestMessageNeuChar requestMessage)
 {
     return(await DefaultAsyncMethod(requestMessage, () => OnNeuCharRequestAsync(requestMessage).Result));
 }