예제 #1
0
        public virtual void Validate(dynamic returnObj, params string[] validationNames)
        {
            if (validationNames.Length == 0)
            {
                var validate = false;
                if (UtilRepository.IsPropertyExist(returnObj, "errcode"))
                {
                    if (int.TryParse(returnObj.errcode, out int errcode))
                    {
                        validate = errcode == 0;
                    }
                }
                if (UtilRepository.IsPropertyExist(returnObj, "return_code"))
                {
                    validate = returnObj.return_code == "SUCCESS";
                }

                if (!validate)
                {
                    throw new BadResultException(returnObj);
                }
            }

            validationNames.ToList().ForEach(i =>
            {
                if (!UtilRepository.IsPropertyExist(returnObj, i))
                {
                    throw new BadResultException(returnObj);
                }
            });
        }
예제 #2
0
 public ServerService()
 {
     _serverRepository   = new ServerRepository();
     _gameModeRepository = new GameModeRepository();
     _matchRepository    = new MatchRepository();
     _utilRepository     = new UtilRepository();
 }
        public static IApplicationBuilder UseLazyWeChat(
            this IApplicationBuilder app,
            Action <WeChatMessager> onMessageReceived)
        {
            Type implementation = UtilRepository.GetImplementation(DEFAULTMESSAGEQUEUE);

            return(app.UseMiddleware <LazyWeChatMiddleware>(onMessageReceived, implementation));
        }
예제 #4
0
 public MatchService()
 {
     _scoreService     = new ScoreService();
     _matchRepository  = new MatchRepository();
     _scoresRepository = new ScoreRepository();
     _playerService    = new PlayerService();
     _mapService       = new MapService();
     _utilRepository   = new UtilRepository();
 }
        private async Task <dynamic> RequestUploadAPI(
            string fullFilePath, string requestAPIUrl, MediaType mediaType, string formName = "file", string additionInfo = "")
        {
            string requestUrl = await ValidateMaterial(fullFilePath, requestAPIUrl, mediaType);

            var returnJson = await _httpRepository.UploadFileAsync(requestUrl, fullFilePath, formName, additionInfo);

            var returnObject = UtilRepository.ParseAPIResult(returnJson);

            return(returnObject);
        }
예제 #6
0
        public virtual async Task <dynamic> UploadKFAvatarAsync(string kf_account, string avatarFilePath)
        {
            var access_token = await _lazyWeChatBasic.GetAccessTokenAsync();

            var requestUrl = string.Format(CONSTANT.UPLOADKFAVATARURL, access_token, kf_account);
            var returnJson = await _httpRepository.UploadFileAsync(requestUrl, avatarFilePath);

            var returnObject = UtilRepository.ParseAPIResult(returnJson);

            return(returnObject);
        }
        public virtual async Task <dynamic> UploadImgMaterialAsync(string fullImgFilePath)
        {
            var accessToken = await GetAccessTokenAsync();

            var url        = string.Format(CONSTANT.UPLOADIMGURL, accessToken);
            var returnJson = await _httpRepository.UploadFileAsync(url, fullImgFilePath);

            var returnObject = UtilRepository.ParseAPIResult(returnJson);

            _httpRepository.Validate(returnObject, "url");
            return(returnObject);
        }
예제 #8
0
        private dynamic Pasre(string content)
        {
            dynamic returnObject = new ExpandoObject();

            if (content.StartsWith("{") && content.EndsWith("}"))
            {
                returnObject = UtilRepository.ParseAPIResult(content);
            }
            else
            {
                returnObject = content.FromXml().ToDynamic();
            }

            return(returnObject);
        }
        public virtual async Task <object> GetTempMaterialAsync(string media_id)
        {
            var access_token = await GetAccessTokenAsync();

            var url = string.Format(CONSTANT.GETTEMPMATERIALURL, access_token, media_id);
            var res = await _httpRepository.GetAsync(url);

            if (res.Contains("video_url"))
            {
                var returnObject = UtilRepository.ParseAPIResult(res);
                return(returnObject);
            }
            else
            {
                byte[] byteArray = Encoding.Default.GetBytes(res);
                return(byteArray);
            }
        }
예제 #10
0
 public BadResultException(dynamic obj)
 {
     if (UtilRepository.IsPropertyExist(obj, "errcode") &&
         UtilRepository.IsPropertyExist(obj, "errmsg"))
     {
         if (!int.TryParse(obj.errcode.ToString(), out _errcode))
         {
             _message = $"invlid errcode:{obj.errcode}";
         }
         else
         {
             _message = $"wechat API return unsuccessful result:errcode('{_errcode}'),errmsg('{obj.errmsg}')";
         }
     }
     else
     {
         _message = $"invalid error message format:{JsonConvert.SerializeObject(obj)}";
     }
 }
예제 #11
0
        public virtual async Task <string> GenerateWXConfigScriptAsync(
            string requestUrl,
            bool debug,
            params string[] jsApiList)
        {
            if (jsApiList == null || jsApiList.Length == 0)
            {
                throw new ArgumentNullException(nameof(jsApiList));
            }

            string script = @"
                            wx.config({{
                                  debug: {0},
                                  appId: '{1}',
                                  timestamp: {2},
                                  nonceStr: '{3}',
                                  signature: '{4}',
                                  jsApiList: [
                                    {5}
                                  ]
                              }});
                            ";

            StringBuilder api = new StringBuilder();

            jsApiList.ToList().ForEach(i => api.Append($"'{i}',"));
            var apiList = api.ToString();

            var appId     = _options.Value.AppID;
            var noncestr  = _options.Value.NonceStr;
            var timestamp = _options.Value.Timestamp;
            var jsTicket  = await GetJSTicketAsync();

            var signature = UtilRepository.GenerateSignature(noncestr, timestamp, requestUrl, jsTicket, out string outString);

            _logger.LogInformation($"noncestr:{noncestr},timestamp:{timestamp},requestUrl:{requestUrl},jsTicket:{jsTicket},signature:{signature},outString:{outString}");

            script = string.Format(script, debug.ToString().ToLower(), appId, timestamp, noncestr, signature, apiList.Substring(0, apiList.Length - 1));
            return(script);
        }
예제 #12
0
        public virtual async Task <string> PostAsync(string url, string requestContent)
        {
            dynamic resultObject = new ExpandoObject();

            resultObject.requestID      = UtilRepository.GenerateRandomCode();
            resultObject.method         = "POST";
            resultObject.url            = url;
            resultObject.requestContent = requestContent;
            resultObject.createdAt      = DateTime.Now.ToString();
            string json = "";

            using (var client = _clientFactory.CreateClient())
            {
                using (HttpContent httpContent = new StringContent(requestContent))
                {
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                    var response = await client.PostAsync(url, httpContent);

                    if (response.IsSuccessStatusCode)
                    {
                        var content = await response.Content.ReadAsStringAsync();

                        resultObject.result        = "success";
                        resultObject.resultContent = content;
                        json = JsonConvert.SerializeObject(resultObject);
                        _logger.LogInformation(json);
                        return(content);
                    }
                    else
                    {
                        resultObject.result        = "fail";
                        resultObject.resultContent = "BadHttpResponseException";
                        json = JsonConvert.SerializeObject(resultObject);
                        _logger.LogInformation(json);
                        throw new BadHttpResponseException(url, response.StatusCode);
                    }
                }
            }
        }
예제 #13
0
        public virtual async Task <object> GetMaterialAsync(string media_id)
        {
            dynamic requestObject = new ExpandoObject();

            requestObject.media_id = media_id;

            var access_token = await _lazyWeChatBasic.GetAccessTokenAsync();

            var    url  = string.Format(CONSTANT.GETMATERIALURL, access_token, media_id);
            var    json = JsonConvert.SerializeObject(requestObject);
            string res  = await _httpRepository.PostAsync(url, json);

            if (res.Contains("down_url") || res.Contains("news_item"))
            {
                var returnObject = UtilRepository.ParseAPIResult(res);
                return(returnObject);
            }
            else
            {
                byte[] byteArray = Encoding.Default.GetBytes(res);
                return(byteArray);
            }
        }
예제 #14
0
        public virtual async Task <string> GetAsync(string url)
        {
            dynamic resultObject = new ExpandoObject();

            resultObject.requestID = UtilRepository.GenerateRandomCode();
            resultObject.method    = "GET";
            resultObject.url       = url;
            resultObject.createdAt = DateTime.Now.ToString();
            string json = "";

            using (var client = _clientFactory.CreateClient())
            {
                var response = await client.GetAsync(url);

                resultObject.statusCode = response.StatusCode;

                if (response.IsSuccessStatusCode)
                {
                    var content = await response.Content.ReadAsStringAsync();

                    resultObject.result        = "success";
                    resultObject.resultContent = content;
                    json = JsonConvert.SerializeObject(resultObject);
                    _logger.LogInformation(json);
                    return(content);
                }
                else
                {
                    resultObject.result        = "fail";
                    resultObject.resultContent = "BadHttpResponseException";
                    json = JsonConvert.SerializeObject(resultObject);
                    _logger.LogInformation(json);
                    throw new BadHttpResponseException(url, response.StatusCode);
                }
            }
        }
예제 #15
0
        public async Task InvokeAsync(HttpContext context)
        {
            var request = context.Request;

            if (request.Path.Value.Contains(_options.Value.LazyWechatListener))
            {
                bool validation = Validate(out string signature, out string timestamp, out string nonce, out string echostr);

                var info = "signature:{0},timestamp:{1},nonce:{2},echostr:{3} received from wechat at {4}";
                _logger.LogInformation(info, signature, timestamp, nonce, echostr, DateTime.Now);

                var weChatMessager = new WeChatMessager
                {
                    signature  = signature,
                    timestamp  = timestamp,
                    nonce      = nonce,
                    echostr    = echostr,
                    validation = validation,
                    type       = _options.Value.Type,
                    method     = context.Request.Method
                };

                #region 以stream的方式获取微信post到监听程序的数据:数据类型为XML
                var inputContent = "";
                using (StreamReader stream = new StreamReader(request.Body, Encoding.UTF8))
                {
                    inputContent = await stream.ReadToEndAsync();
                }
                #endregion

                info = "inputXml:'{0}' received from wechat at {1}";
                _logger.LogInformation(info, inputContent, DateTime.Now);

                var encrypted = false;

                if (!string.IsNullOrEmpty(inputContent))
                {
                    dynamic messageBody = new ExpandoObject();
                    messageBody           = ParseMessage(inputContent, out MessageFormat format);
                    weChatMessager.format = format;

                    if (UtilRepository.IsPropertyExist(messageBody, "Encrypt"))
                    {
                        string decryptedMessage = Cryptography.AES_decrypt(messageBody.Encrypt, _options.Value.EncodingAESKey);
                        messageBody = ParseMessage(decryptedMessage, out _);
                        encrypted   = true;
                    }

                    weChatMessager.messageBody = messageBody;

                    if (UtilRepository.IsPropertyExist(messageBody, "FromUserName"))
                    {
                        _onMessageReceived?.Invoke(weChatMessager);
                    }

                    var json = JsonConvert.SerializeObject(weChatMessager);
                    _ = _messageQueue.Push(json);

                    info = "json format of message:'{0}' has been pushed into queue at {1}";
                    _logger.LogInformation(info, json, DateTime.Now);
                }

                var message = weChatMessager.message;

                if (encrypted && message.ToLower() != "success")
                {
                    var encryptMessage    = Cryptography.AES_encrypt(weChatMessager.message, _options.Value.EncodingAESKey, _options.Value.AppID);
                    var signatureResponse = generateSignature(timestamp, nonce, encryptMessage);
                    message = string.Format(MessageTemplateFactory.CreateInstance(weChatMessager.format == MessageFormat.Xml ? MessageType.Encrypt : MessageType.EncryptJson), encryptMessage, signatureResponse, timestamp, nonce);
                }

                info = "sent message:'{0}' has been logged at {1}";
                _logger.LogInformation(info, message, DateTime.Now);

                await context.Response.WriteAsync(message);
            }
            else
            {
                await _next(context);
            }

            bool Validate(out string signature, out string timestamp, out string nonce, out string echostr)
            {
                #region 微信在向监听程序发送数据的时候会同时发送signature,timestamp,nonce以及echostr供用户判断该请求是否来自微信端
                signature = string.IsNullOrEmpty(request.Query["signature"]) ? "" : request.Query["signature"].ToString();

                timestamp = string.IsNullOrEmpty(request.Query["timestamp"]) ? "" : request.Query["timestamp"].ToString();

                nonce = string.IsNullOrEmpty(request.Query["nonce"]) ? "" : request.Query["nonce"].ToString();

                echostr = string.IsNullOrEmpty(request.Query["echostr"]) ? "" : request.Query["echostr"].ToString();

                #endregion

                List <string> lstSort = new List <string> {
                    _options.Value.Token, timestamp, nonce
                };
                lstSort.Sort();
                var sha1 = string.Join(string.Empty, lstSort).SHA1();

                var validation = (sha1.ToUpper() == signature.ToUpper());
                return(validation);
            }

            string generateSignature(string timestamp, string nonce, string encryptMessage)
            {
                ArrayList AL = new ArrayList();

                AL.Add(_options.Value.Token);
                AL.Add(timestamp);
                AL.Add(nonce);
                AL.Add(encryptMessage);
                AL.Sort(new DictionarySort());
                string raw = "";

                for (int i = 0; i < AL.Count; ++i)
                {
                    raw += AL[i];
                }

                SHA1          sha;
                ASCIIEncoding enc;
                string        hash = "";

                sha = new SHA1CryptoServiceProvider();
                enc = new ASCIIEncoding();
                byte[] dataToHash = enc.GetBytes(raw);
                byte[] dataHashed = sha.ComputeHash(dataToHash);
                hash = BitConverter.ToString(dataHashed).Replace("-", "");
                hash = hash.ToLower();

                return(hash);
            }

            dynamic ParseMessage(string inputContent, out MessageFormat format)
            {
                inputContent = inputContent.Trim().Replace("\n", "");
                dynamic messageBody = new ExpandoObject();

                if (inputContent.StartsWith("<") && inputContent.EndsWith(">"))
                {
                    messageBody = UtilRepository.ParseAPIResult(JsonConvert.SerializeObject(inputContent.FromXml()));
                    format      = MessageFormat.Xml;
                }
                else if (inputContent.StartsWith("{") && inputContent.EndsWith("}"))
                {
                    messageBody = UtilRepository.ParseAPIResult(inputContent);
                    format      = MessageFormat.Json;
                }
                else
                {
                    throw new ArgumentException(nameof(inputContent));
                }
                return(messageBody);
            }
        }
예제 #16
0
        string HttpUploadFile(string url, string path, string formName = "file", string additionInfo = "")
        {
            dynamic resultObject = new ExpandoObject();

            resultObject.requestID      = UtilRepository.GenerateRandomCode();
            resultObject.method         = "POST";
            resultObject.url            = url;
            resultObject.requestContent = path;
            resultObject.createdAt      = DateTime.Now.ToString();

            string content = "";

            try
            {
                #region Upload
                HttpWebRequest  request         = WebRequest.Create(url) as HttpWebRequest;
                CookieContainer cookieContainer = new CookieContainer();
                request.CookieContainer   = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method            = "POST";
                string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
                request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
                byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
                byte[] endBoundaryBytes  = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");

                int    pos      = path.LastIndexOf("\\");
                string fileName = path.Substring(pos + 1);

                StringBuilder sbHeader        = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"" + formName + "\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
                byte[]        postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());

                FileStream fs   = new FileStream(path, FileMode.Open, FileAccess.Read);
                byte[]     bArr = new byte[fs.Length];
                fs.Read(bArr, 0, bArr.Length);
                fs.Close();

                Stream postStream = request.GetRequestStream();
                postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                postStream.Write(bArr, 0, bArr.Length);
                byte[] bSplit = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
                postStream.Write(bSplit, 0, bSplit.Length);

                if (!string.IsNullOrEmpty(additionInfo))
                {
                    byte[] additionBytes = Encoding.UTF8.GetBytes("Content-Disposition: form-data; name=\"description\";\r\n\r\n");
                    postStream.Write(additionBytes, 0, additionBytes.Length);
                    byte[] additionContentBytes = Encoding.UTF8.GetBytes(additionInfo);
                    postStream.Write(additionContentBytes, 0, additionContentBytes.Length);
                    postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
                }

                postStream.Close();

                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream          instream = response.GetResponseStream();
                StreamReader    sr       = new StreamReader(instream, Encoding.UTF8);
                content = sr.ReadToEnd();
                #endregion

                resultObject.result        = "success";
                resultObject.resultContent = content;
                string json = JsonConvert.SerializeObject(resultObject);
                _logger.LogInformation(json);
            }
            catch (Exception ex)
            {
                resultObject.result        = "fail";
                resultObject.resultContent = ex.Message;
                string json = JsonConvert.SerializeObject(resultObject);
                _logger.LogInformation(json);
                throw ex;
            }

            return(content);
        }