Exemple #1
0
        protected override string QueryAccessToken(Uri returnUrl, string authorizationCode) {
            WebUtils webUtils = new WebUtils();
            Dictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("client_id", this.appId);
            parameters.Add("client_secret", this.appSecret);
            parameters.Add("grant_type", "authorization_code");
            parameters.Add("code", "25″);
            parameters.Add("redirect_uri", returnUrl.AbsoluteUri);
            byte[] postData = Encoding.UTF8.GetBytes(WebUtils.BuildQuery(parameters));
            WebRequest tokenRequest = WebRequest.Create(TokenEndpoint);
            tokenRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8″;
            tokenRequest.ContentLength = postData.Length;
            tokenRequest.Method = "POST";
            using (Stream requestStream = tokenRequest.GetRequestStream()) {
                var writer = new StreamWriter(requestStream);
                writer.Write(postData);
                writer.Flush();
            }
            HttpWebResponse tokenResponse = (HttpWebResponse)tokenRequest.GetResponse();
            if (tokenResponse.StatusCode == HttpStatusCode.OK) {
//using (Stream responseStream = tokenResponse.GetResponseStream()) {
// var tokenData = JsonHelper.Deserialize<OAuth2AccessTokenData>(responseStream);
// if (tokenData != null) {
// return tokenData.AccessToken;
// }
//}
                using (var responseStream = new StreamReader(tokenResponse.GetResponseStream())) {
                    var tokenData = JsonConvert.DeserializeObject<OAuth2AccessTokenData>(responseStream.ReadToEnd());
                    if (tokenData != null) {
                        return tokenData.AccessToken;
                    }
                }
            }
            return null;
        }
        public T Execute <T>(IRequest <T> request, string session, string appAuthToken) where T : IResponse
        {
            // 构造请求参数
            ParamDictionary requestParams = buildRequestParams(request, session, appAuthToken);

            // 字典排序
            IDictionary <string, string> sortedParams = new SortedDictionary <string, string>(requestParams);
            ParamDictionary sortedDic = new ParamDictionary(sortedParams);

            // 参数签名
            string charset = string.IsNullOrEmpty(this.charset) ? "utf-8" : this.charset;
            //string signResult = Signature.RSASign(sortedDic, privateKeyPem, charset, this.keyFromFile, this.signType);
            //// 添加签名结果参数
            //sortedDic.Add(SIGN, signResult);

            // 参数拼接
            string signedResult = WebUtils.BuildQuery(sortedDic, charset);
            var    txtParams    = sortedDic;


            // 是否需要上传文件
            string body;
            string requestBody = null;
            string url         = "";                                // this.serverUrl + "?" + CHARSET + "=" + this.charset;

            url = GetFullUrl(this.serverUrl, request.GetApiName()); // + "?" + CHARSET + "=" + this.charset;
            if (request is IUploadRequest <T> )
            {
                IUploadRequest <T>             uRequest   = (IUploadRequest <T>)request;
                IDictionary <string, FileItem> fileParams = SdkUtils.CleanupDictionary(uRequest.GetFileParameters());
                body = webUtils.DoPost(url, txtParams, fileParams, this.charset, out requestBody);
            }
            else
            {
                body = webUtils.DoPost(url, txtParams, this.charset, out requestBody);
            }

            T           rsp    = null;
            IParser <T> parser = null;

            if ("xml".Equals(format))
            {
                parser = new XmlParser <T>();
                rsp    = parser.Parse(body, charset);
            }
            else
            {
                parser = new JsonParser <T>();
                rsp    = parser.Parse(body, charset);
            }

            ResponseParseItem item = parseRespItem(request, body, parser, this.encyptKey, this.encyptType, charset);

            rsp             = parser.Parse(item.realContent, charset);
            rsp.RequestBody = requestBody;

            CheckResponseSign(request, item.respContent, rsp.IsError, parser, this.publicKey, this.charset, signType, this.keyFromFile);

            return(rsp);
        }
        private AopResponse DoGet(AopDictionary parameters, Stream outStream)
        {
            AlipayMobilePublicMultiMediaDownloadResponse result = null;
            string text = serverUrl;

            Console.WriteLine(text);
            if (parameters != null && parameters.Count > 0)
            {
                text = ((!text.Contains("?")) ? (text + "?" + WebUtils.BuildQuery(parameters, charset)) : (text + "&" + WebUtils.BuildQuery(parameters, charset)));
            }
            HttpWebRequest webRequest = webUtils.GetWebRequest(text, "GET");

            webRequest.ContentType = "application/x-www-form-urlencoded;charset=" + charset;
            HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse();

            if (httpWebResponse.StatusCode == HttpStatusCode.OK)
            {
                if (httpWebResponse.ContentType.ToLower().Contains("text/plain"))
                {
                    Encoding encoding         = Encoding.GetEncoding(httpWebResponse.CharacterSet);
                    string   responseAsString = webUtils.GetResponseAsString(httpWebResponse, encoding);
                    IAopParser <AlipayMobilePublicMultiMediaDownloadResponse> aopParser = new AopJsonParser <AlipayMobilePublicMultiMediaDownloadResponse>();
                    result = aopParser.Parse(responseAsString, charset);
                }
                else
                {
                    GetResponseAsStream(outStream, httpWebResponse);
                    result = new AlipayMobilePublicMultiMediaDownloadResponse();
                }
            }
            return(result);
        }
Exemple #4
0
        public ZZXDictionary getSystemParams <T>(IZZXRequest <T> request) where T : ZZXResponse
        {
            string apiVersion = null;

            if (!string.IsNullOrEmpty(request.GetApiVersion()))
            {
                apiVersion = request.GetApiVersion();
            }
            else
            {
                apiVersion = Version;
            }
            ZZXDictionary sysParams = new ZZXDictionary();

            sysParams.Add(METHOD, request.GetApiName());
            sysParams.Add(VERSION, apiVersion);
            sysParams.Add(ChANNELID, _channelId);
            sysParams.Add(SIGNTYPE, _singType);
            sysParams.Add(PARAMS, request.GetParams());
            var d = sysParams.OrderBy(p => p.Key).ToDictionary(p => p.Key, o => o.Value); //签名需要先排序下 中子星文档要求
            // 添加签名参数
            var build = WebUtils.BuildQuery(d, false, _charset);                          //  这个签名没问题

            sysParams.Add(SIGN, RSAUtil.Sign(WebUtils.BuildQuery(d, false, _charset), _privateKey, _charset));
            return(sysParams);
        }
Exemple #5
0
        public T SdkExecute <T>(IAopRequest <T> request) where T : AopResponse
        {
            // 构造请求参数
            AopDictionary requestParams = buildRequestParams(request, null, null);

            // 字典排序
            IDictionary <string, string> sortedParams = new SortedDictionary <String, String>(requestParams);
            AopDictionary sortedAopDic = new AopDictionary(sortedParams);

            // 参数签名
            String charset    = String.IsNullOrEmpty(this.charset) ? "utf-8" : this.charset;
            String signResult = AopUtils.SignAopRequest(sortedAopDic, privateKeyPem, charset, this.keyFromFile, this.signType);

            // 添加签名结果参数
            sortedAopDic.Add(SIGN, signResult);

            // 参数拼接
            String signedResult = WebUtils.BuildQuery(sortedAopDic, charset);

            // 构造结果
            T rsp = (T)Activator.CreateInstance(typeof(T));

            rsp.Body = signedResult;
            return(rsp);
        }
Exemple #6
0
        static void generatorsign()
        {
            //用我的私钥和公钥用来测试接口编写

            string privateKey  = Cfg.Get("privateKey");
            string publicKey   = Cfg.Get("publicKey");
            string myPublicKey = Cfg.Get("myPublicKey");
            string charset     = "UTF-8";

            var dic = new Dictionary <string, object>();

            dic["channelId"] = "3";
            dic["method"]    = "loanApplyResultNotify";
            //dic["params"] = new { loanId = "20170915174747000008" };
            var loanapplyresult = new LoanApplyResult()
            {
                LoanId        = "2019125514515",
                Result        = 1,
                Commissions   = 10000,
                Reason        = "没有拒绝",
                LoanAmount    = 1000000,
                LoanTerm      = 12,
                PaymentOption = 1,
                Orders        = new List <ResultOrder>()
                {
                    new ResultOrder()
                    {
                        SourceOrderId = "12345", LoanAmount = 5000
                    },
                    new ResultOrder()
                    {
                        SourceOrderId = "12346", LoanAmount = 5000
                    }
                }
            };

            var loantttttstring = JsonConvert.SerializeObject(loanapplyresult);

            dic["params"]   = loantttttstring;
            dic["signType"] = "RSA2";
            dic["ver"]      = "1.0";
            //dic["statusCode"] = "900";
            //dic["errMsg"] = "签名校验失败";
            var d    = dic.OrderBy(p => p.Key).ToDictionary(p => p.Key, o => o.Value);
            var text = WebUtils.BuildQuery(d, false, charset);

            //要组装成一个对象?
            JObject jb = new JObject();

            foreach (var key in dic.Keys)
            {
                jb.Add(new JProperty(key, dic[key]));
            }

            var tt = JsonConvert.SerializeObject(jb);
            var s  = RSAUtil.Sign(text, privateKey, charset);

            Console.WriteLine($"签名:{s}");
        }
Exemple #7
0
        public T Execute <T>(IZZXRequest <T> request) where T : ZZXResponse
        {
            if (string.IsNullOrEmpty(_charset))
            {
                _charset = "UTF-8";
            }
            ZZXDictionary sysParams = getSystemParams(request);
            string        body;

            //这里要组装成对象
            JObject jb = new JObject();

            foreach (var key in sysParams.Keys)
            {
                //params 这个要转回问题
                if (key == "params")
                {
                    jb.Add(new JProperty(key, JsonConvert.DeserializeObject(sysParams[key].ToString())));
                }
                else
                {
                    jb.Add(new JProperty(key, sysParams[key]));
                }
            }
            var tt     = JsonConvert.SerializeObject(jb);
            var encode = HttpUtility.UrlEncode(tt);//传递的时候进行url编码

            body = _webUtils.DoPost(_serverUrl, encode, _charset);
            string bizResponse = body;
            T      rsp         = null;

            //再这里转换出来然后验签
            ZZXDictionary dic     = new ZZXDictionary();
            JObject       jObject = JsonConvert.DeserializeObject(bizResponse) as JObject;

            if (jObject != null)
            {
                //去掉 statuscode errmsg  sign 三个键值对 排序组合成待签名字符串
                if (jObject["sign"] != null)
                {
                    var sign = jObject["sign"].ToString();
                    dic.Add("method", jObject["method"].ToString());
                    dic.Add("ver", jObject["ver"].ToString());
                    dic.Add("channelId", jObject["channelId"].ToString());
                    dic.Add("signType", jObject["signType"].ToString());
                    if (jObject["params"] != null)
                    {
                        dic.Add("params", JsonConvert.SerializeObject(jObject["params"]));
                    }
                    var d = dic.OrderBy(p => p.Key).ToDictionary(p => p.Key, o => o.Value);
                    var s = WebUtils.BuildQuery(d, false, _charset);
                    RSAUtil.VerifySign(s, sign, _publicKey, _charset);
                }
            }

            rsp = JsonConvert.DeserializeObject <T>(bizResponse);
            return(rsp);
        }
Exemple #8
0
        private AopResponse DoGet(AopDictionary parameters, Stream outStream)
        {
            AlipayMobilePublicMultiMediaDownloadResponse response = null;

            var url = serverUrl;

            Console.WriteLine(url);
            if (parameters != null && parameters.Count > 0)
            {
                if (url.Contains("?"))
                {
                    url = url + "&" + WebUtils.BuildQuery(parameters, charset);
                }
                else
                {
                    url = url + "?" + WebUtils.BuildQuery(parameters, charset);
                }
            }

            var req = webUtils.GetWebRequest(url, "GET");

            req.ContentType = "application/x-www-form-urlencoded;charset=" + charset;

            var reqTask = req.GetResponseAsync();

            reqTask.Wait();
            var rsp = (HttpWebResponse)reqTask.Result;

            if (rsp.StatusCode == HttpStatusCode.OK)
            {
                if (rsp.ContentType.ToLower().Contains("text/plain"))
                {
                    //临时
                    var contentType = rsp.ContentType;
                    var charset     = contentType.IndexOf("charset=utf-8", StringComparison.OrdinalIgnoreCase) > 0
                        ? "UTF-8"
                        : "GBK";
                    var encoding = Encoding.GetEncoding(charset);
                    var body     = webUtils.GetResponseAsString(rsp, encoding);
                    IAopParser <AlipayMobilePublicMultiMediaDownloadResponse> tp =
                        new AopJsonParser <AlipayMobilePublicMultiMediaDownloadResponse>();
                    response = tp.Parse(body, charset);
                }
                else
                {
                    GetResponseAsStream(outStream, rsp);
                    response = new AlipayMobilePublicMultiMediaDownloadResponse();
                }
            }
            return(response);
        }
Exemple #9
0
        static void signzzxtest()
        {
            string privateKey  = Cfg.Get("privateKey");
            string publicKey   = Cfg.Get("publicKey");
            string myPublicKey = Cfg.Get("myPublicKey");
            string charset     = "UTF-8";

            var dic = new Dictionary <string, object>();

            dic["channelId"] = "3";
            dic["method"]    = "loanApply";
            //dic["params"] = new { loanId = "20170915174747000008" };
            dic["params"]   = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(new { loanId = "20170915174747000008" }));
            dic["signType"] = "RSA2";
            dic["ver"]      = "1.0";
            //dic["statusCode"] = "900";
            //dic["errMsg"] = "签名校验失败";
            //          //var text = "channelId=3&method=loanApply&params=\"{\"loanId\":\"20170915172722000007\"}\"&signType = RSA2 & ver = 1.0";
            var d    = dic.OrderBy(p => p.Key).ToDictionary(p => p.Key, o => o.Value);
            var text = WebUtils.BuildQuery(d, false, charset);

            //要组装成一个对象?
            JObject jb = new JObject();

            foreach (var key in dic.Keys)
            {
                jb.Add(new JProperty(key, dic[key]));
            }

            var tt = JsonConvert.SerializeObject(jb);

            //          var sss = "YtaXroGTrMptqZPQW8/Cz1ZrMGqL8s4V8JBYQr2LHh0j0WC+BP5NSZxVljBxsrBvv9vyH6l8ODX/1mT8AmYbxptbYW7RGJ0Of87CMJFrmTHb9f9nRFs3j7dNUw6PfSRuT1ItqHXAbEoUO8ZSm278yILIkpdTRJO1EjvdFH25ILs=";
            //          //"YtaXroGTrMptqZPQW8/Cz1ZrMGqL8s4V8JBYQr2LHh0j0WC+BP5NSZxVljBxsrBvv9vyH6l8ODX/1mT8AmYbxptbYW7RGJ0Of87CMJFrmTHb9f9nRFs3j7dNUw6PfSRuT1ItqHXAbEoUO8ZSm278yILIkpdTRJO1EjvdFH25ILs="
            //             //oOzbzpanqMkEqib40YcnDaw7eb296ORiEE37Ysz/XpJVeJtvqAsZ5yIseXFMsXRjJZ1yCyknuspZ5qoglIDhHkgPn/S2UBnR1f/JuyCHifxW7tJgu1CpbFdHZ7BFHwGmxb97Jx0pOYKaVKW14bTZgnLKepBStT4SjhFeX7LUPoE=
            ////var s = RSAUtil.Encrypt(text, privateKey, charset);

            //var text = "channelId=3&method=loanApply&params={\"loanId\":\"20170918151253000014\"}&signType=RSA2&ver=1.0";
            var sss = "YtaXroGTrMptqZPQW8/Cz1ZrMGqL8s4V8JBYQr2LHh0j0WC+BP5NSZxVljBxsrBvv9vyH6l8ODX/1mT8AmYbxptbYW7RGJ0Of87CMJFrmTHb9f9nRFs3j7dNUw6PfSRuT1ItqHXAbEoUO8ZSm278yILIkpdTRJO1EjvdFH25ILs=";
            //"oOzbzpanqMkEqib40YcnDaw7eb296ORiEE37Ysz/XpJVeJtvqAsZ5yIseXFMsXRjJZ1yCyknuspZ5qoglIDhHkgPn/S2UBnR1f/JuyCHifxW7tJgu1CpbFdHZ7BFHwGmxb97Jx0pOYKaVKW14bTZgnLKepBStT4SjhFeX7LUPoE="
            var t = RSAUtil.Verify(text, sss, publicKey, charset);

            Console.WriteLine($"对方验签:{t}");


            var res = "{\"statusCode\":200,\"errMsg\":\"success\",\"method\":\"loanApply\",\"ver\":\"1.0\",\"channelId\":\"3\",\"signType\":\"RSA2\",\"sign\":\"LzQ7rhhoCcn3in6J0kArQak+J0zBzFOEtiDaLNAMDpctdQYK9aEUNUlhK5hZJ9ExP+miq1AXr9EMNya1aZxibPh/MdKYnr9vaNHQk7hpUbycE9bxP1cdrFB9VgLOLQyAf8HF0njTGSK/ozCxzqrhqtT1Y+9WcQbRs7h+yLyfoFA=\",\"params\":{\"loanId\":\"20170918144652000012\"}}";

            var des_dic = JsonConvert.DeserializeObject <IDictionary <string, object> >(res);

            Console.WriteLine(des_dic);
        }
        public T SdkExecute <T>(IAopRequest <T> request) where T : AopResponse
        {
            AopDictionary dictionary = buildRequestParams(request, null, null);
            IDictionary <string, string> dictionary2 = new SortedDictionary <string, string>(dictionary);
            AopDictionary aopDictionary = new AopDictionary(dictionary2);
            string        text          = string.IsNullOrEmpty(charset) ? "utf-8" : charset;
            string        value         = AopUtils.SignAopRequest(aopDictionary, privateKeyPem, text, keyFromFile, signType);

            aopDictionary.Add("sign", value);
            string body = WebUtils.BuildQuery(aopDictionary, text);
            T      val  = (T)Activator.CreateInstance(typeof(T));

            val.Body = body;
            return(val);
        }
        private AopResponse DoGet(AopDictionary parameters, Stream outStream)
        {
            AlipayMobilePublicMultiMediaDownloadResponse response = null;

            if (string.IsNullOrEmpty(charset))
            {
                charset = "UTF-8";
            }

            string url = this.serverUrl;

            System.Console.WriteLine(url);
            if (parameters != null && parameters.Count > 0)
            {
                if (url.Contains("?"))
                {
                    url = url + "&" + WebUtils.BuildQuery(parameters, charset);
                }
                else
                {
                    url = url + "?" + WebUtils.BuildQuery(parameters, charset);
                }
            }

            HttpWebRequest req = webUtils.GetWebRequest(url, "GET");

            req.ContentType = "application/x-www-form-urlencoded;charset=" + charset;

            HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();

            if (rsp.StatusCode == HttpStatusCode.OK)
            {
                if (rsp.ContentType.ToLower().Contains("text/plain"))
                {
                    Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
                    string   body     = webUtils.GetResponseAsString(rsp, encoding);
                    IAopParser <AlipayMobilePublicMultiMediaDownloadResponse> tp = new AopJsonParser <AlipayMobilePublicMultiMediaDownloadResponse>();
                    response = tp.Parse(body, charset);
                }
                else
                {
                    GetResponseAsStream(outStream, rsp);
                    response = new AlipayMobilePublicMultiMediaDownloadResponse();
                }
            }
            return(response);
        }
Exemple #12
0
        public void TraceApiError(string appKey, string apiName, string url, System.Collections.Generic.Dictionary <string, string> parameters, double latency, string errorMessage)
        {
            StringBuilder info = new StringBuilder();

            info.Append(appKey);
            info.Append(Constants.LOG_SPLIT);
            info.Append(apiName);
            info.Append(Constants.LOG_SPLIT);
            info.Append(TopUtils.GetIntranetIp());
            info.Append(Constants.LOG_SPLIT);
            info.Append(System.Environment.OSVersion.VersionString);
            info.Append(Constants.LOG_SPLIT);
            info.Append(latency);
            info.Append(Constants.LOG_SPLIT);
            info.Append(url);
            info.Append(Constants.LOG_SPLIT);
            info.Append(WebUtils.BuildQuery(parameters));
            info.Append(Constants.LOG_SPLIT);
            info.Append(errorMessage);
            this.Error(info.ToString());
        }
Exemple #13
0
        private T DoExecute <T>(ITopRequest <T> request, string session, DateTime timestamp) where T : TopResponse
        {
            long start = DateTime.Now.Ticks;

            TopBatchRequest batchRequest = request as TopBatchRequest;
            List <ITopRequest <TopResponse> > requestList = batchRequest.RequestList;

            if (requestList == null || requestList.Count == 0)
            {
                throw new TopException("40", "client-error:api request list is empty");
            }

            // 本地校验请求参数
            if (batchRequest.PublicParams == null || batchRequest.PublicParams.Count == 0)
            {
                for (int i = 0; i < requestList.Count; i++)
                {
                    try
                    {
                        requestList[i].Validate();
                    }
                    catch (TopException e)
                    {
                        return(CreateErrorResponse <T>(e.ErrorCode, e.ErrorMsg));
                    }
                }
            }

            // 添加协议级请求参数
            TopDictionary parameters = new TopDictionary();

            parameters.Add(Constants.VERSION, "2.0");
            parameters.Add(Constants.APP_KEY, appKey);
            parameters.Add(Constants.TIMESTAMP, timestamp);
            parameters.Add(Constants.FORMAT, format);
            parameters.Add(Constants.SIGN_METHOD, Constants.SIGN_METHOD_HMAC);
            parameters.Add(Constants.PARTNER_ID, GetSdkVersion());
            parameters.Add(Constants.TARGET_APP_KEY, request.GetTargetAppKey());
            parameters.Add(Constants.SESSION, session);
            if (Constants.FORMAT_JSON.Equals(format) && this.useSimplifyJson)
            {
                parameters.Add(Constants.SIMPLIFY, "true");
            }

            // 添加自定义分隔符
            string separator = BATCH_API_DEFAULT_SPLIT;

            if (!string.IsNullOrEmpty(batchApiSeparator))
            {
                batchRequest.AddHeaderParameter(BATCH_API_HEADER_SPLIT, separator = batchApiSeparator);
            }

            // 是否需要压缩响应
            if (this.useGzipEncoding)
            {
                batchRequest.AddHeaderParameter(Constants.ACCEPT_ENCODING, Constants.CONTENT_ENCODING_GZIP);
            }

            try
            {
                // 添加公共请求头
                if (!string.IsNullOrEmpty(batchRequest.PublicMethod))
                {
                    batchRequest.AddPublicParam(Constants.METHOD, batchRequest.PublicMethod);
                }
                else
                {
                    if (IsSameRequest(requestList))
                    {
                        batchRequest.AddPublicParam(Constants.METHOD, requestList[0].GetApiName());
                    }
                }

                // 构建批量请求主体
                StringBuilder requestBody    = new StringBuilder();
                string        publicParamStr = WebUtils.BuildQuery(batchRequest.PublicParams);
                if (!string.IsNullOrEmpty(publicParamStr))
                {
                    requestBody.Append(BATCH_API_PUBLIC_PARAMETER).Append(publicParamStr).Append(separator);
                }

                // 组装每个API的请求参数
                for (int i = 0; i < requestList.Count; i++)
                {
                    ITopRequest <TopResponse> bRequest = requestList[i];
                    bRequest.SetBatchApiOrder(i);
                    IDictionary <string, string> apiParams = bRequest.GetParameters();
                    // 如果单个API的方法和批量API的公共方法不一致,那么需要设置单个API的方法名称
                    if (!string.IsNullOrEmpty(bRequest.GetApiName()) && !bRequest.GetApiName().Equals(batchRequest.PublicMethod))
                    {
                        apiParams.Add(Constants.METHOD, bRequest.GetApiName());
                    }
                    if (!string.IsNullOrEmpty(request.GetBatchApiSession()))
                    {
                        apiParams.Add(Constants.SESSION, bRequest.GetBatchApiSession());
                    }
                    if (!string.IsNullOrEmpty(request.GetTargetAppKey()))
                    {
                        apiParams.Add(Constants.TARGET_APP_KEY, bRequest.GetTargetAppKey());
                    }

                    string apiParamStr = WebUtils.BuildQuery(apiParams);
                    if (string.IsNullOrEmpty(apiParamStr))
                    {
                        apiParamStr = "N";
                    }
                    requestBody.Append(apiParamStr);
                    if (i != requestList.Count - 1)
                    {
                        requestBody.Append(separator);
                    }
                }

                string apiBody = requestBody.ToString();

                // 添加签名参数
                parameters.Add(Constants.SIGN, TopUtils.SignTopRequest(parameters, apiBody, appSecret, Constants.SIGN_METHOD_HMAC));

                // 发起批量请求
                string fullUrl = WebUtils.BuildRequestUrl(this.batchServerUrl, parameters);
                string rsp     = webUtils.DoPost(fullUrl, Encoding.UTF8.GetBytes(apiBody), BATCH_API_CONTENT_TYPE, batchRequest.GetHeaderParameters());

                // 构造响应解释器
                ITopParser <TopResponse> parser = null;
                if (Constants.FORMAT_XML.Equals(format))
                {
                    parser = new TopXmlParser <TopResponse>();
                }
                else
                {
                    if (this.useSimplifyJson)
                    {
                        parser = new TopSimplifyJsonParser <TopResponse>();
                    }
                    else
                    {
                        parser = new TopJsonParser <TopResponse>();
                    }
                }

                // 解释响应结果
                TopBatchResponse batchResponse = new TopBatchResponse();
                batchResponse.Body = rsp;

                string[] responseArray = batchResponse.Body.Split(new string[] { separator }, StringSplitOptions.None);
                // 批量API在走单通道验证时没通过,如前面验证,此时只有一个报错信息
                if (responseArray.Length > 0 && responseArray.Length != requestList.Count)
                {
                    TopResponse tRsp = parser.Parse(responseArray[0], requestList[0].GetType().BaseType.GetGenericArguments()[0]);
                    batchResponse.ErrCode    = tRsp.ErrCode;
                    batchResponse.ErrMsg     = tRsp.ErrMsg;
                    batchResponse.SubErrCode = tRsp.SubErrCode;
                    batchResponse.SubErrMsg  = tRsp.SubErrMsg;
                }
                else
                {
                    for (int i = 0; i < responseArray.Length; i++)
                    {
                        TopResponse tRsp = parser.Parse(responseArray[i], requestList[i].GetType().BaseType.GetGenericArguments()[0]);
                        tRsp.Body = responseArray[i];
                        batchResponse.AddResponse(tRsp);
                    }
                }

                if (batchResponse.IsError)
                {
                    TimeSpan latency = new TimeSpan(DateTime.Now.Ticks - start);
                    TraceApiError(appKey, "BatchApi", batchServerUrl, parameters, latency.TotalMilliseconds, batchResponse.Body);
                }

                return(batchResponse as T);
            }
            catch (Exception e)
            {
                TimeSpan latency = new TimeSpan(DateTime.Now.Ticks - start);
                TraceApiError(appKey, "BatchApi", batchServerUrl, parameters, latency.TotalMilliseconds, e.GetType() + ": " + e.Message);
                throw e;
            }
        }
Exemple #14
0
        /// <summary>
        /// 单步文件上传 单步文件上传,标准 http multipart 上传,文件大小不得超过8M。浏览器可能会转义某些字符导致请求失败,调试时请使用curl或者代码模拟请求。 请保证自己的机器有足够的出口带宽,否则可能导致上传异常缓慢。
        /// </summary>
        /// <param name="accessToken"></param>
        /// <param name="fileSize">文件大小</param>
        /// <param name="agentId">微应用的agentId</param>
        /// <param name="file">文件</param>
        /// <returns></returns>
        public OapiFileUploadSingleResponse UploadSingle(string accessToken, long fileSize, string agentId, FileItem file)
        {
            OapiFileUploadSingleRequest request = new OapiFileUploadSingleRequest();

            request.FileSize = fileSize;
            request.AgentId  = agentId;
            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/file/upload/single?" + WebUtils.BuildQuery(request.GetParameters()));

            request      = new OapiFileUploadSingleRequest();
            request.File = file;
            OapiFileUploadSingleResponse response = client.Execute(request, accessToken);

            return(response);
        }
Exemple #15
0
        public HttpResponse Post()
        {
            int          retriedCount;
            int          retry = conf.GetHttpConnectRetryCount() + 1;
            HttpResponse resp  = null;

            for (retriedCount = 1; retriedCount <= retry; retriedCount++)
            {
                try
                {
                    HttpWebRequest   con       = null;
                    System.IO.Stream outStream = null;
                    try
                    {
                        con           = GetConnection(conf.GetConnectUrl(), conf.GetHttpConnectionTimeout(), conf.GetHttpReadTimeout());
                        con.KeepAlive = true;

                        SetHeaders(con, conf.GetRequestHeader());
                        con.Method      = "POST";
                        con.ContentType = "application/x-www-form-urlencoded;charset=utf-8";

                        string postParam = WebUtils.BuildQuery(parameters);
                        byte[] bytes     = System.Text.Encoding.UTF8.GetBytes(postParam);

                        outStream = con.GetRequestStream();
                        outStream.Write(bytes, 0, bytes.Length);
                        outStream.Close();

                        HttpWebResponse response     = (HttpWebResponse)con.GetResponse();
                        HttpStatusCode  responseCode = response.StatusCode;

                        if (HttpStatusCode.OK == responseCode)
                        {
                            log.Info("connect successful");

                            StringBuilder       respHeader      = new StringBuilder();
                            WebHeaderCollection responseHeaders = con.Headers;

                            foreach (string key in responseHeaders.AllKeys)
                            {
                                string[] values = responseHeaders.GetValues(key);

                                foreach (string value in values)
                                {
                                    if (key != null)
                                    {
                                        respHeader.Append(key).Append("=").Append(value);
                                    }
                                    else
                                    {
                                        respHeader.Append(value);
                                    }
                                    respHeader.Append(";");
                                }

                                log.Info("Response: " + respHeader.ToString());
                            }
                            resp = new HttpResponse(con);
                            return(resp);
                        }
                        else if (HttpStatusCode.BadRequest == responseCode)
                        {   //参数校验出错
                            log.Info("Request param is invalid,errmsg is:" + con.Headers.Get(StreamConstants.ERR_MSG_HEADER));
                            throw new TopCometSysErrorException("Server response err msg:" + con.Headers.Get(StreamConstants.ERR_MSG_HEADER));
                        }
                        else if (HttpStatusCode.Forbidden == responseCode)
                        {//服务端在发布,需要休眠一段时间
                            log.Info("Server is deploying,sleep " + retriedCount * conf.GetHttpConnectRetryInterval() + " seconds");
                            if (retriedCount == conf.GetHttpConnectRetryCount())
                            {
                                log.Info("May be server occure some error,please contact top tech support");
                                throw new TopCometSysErrorException("May be server occure some error,please contact top tech support");
                            }
                            try
                            {
                                Thread.Sleep(retriedCount * conf.GetHttpConnectRetryInterval() * 1000);
                            }
                            catch (Exception e)
                            {
                                //ignore;
                            }
                            continue;
                        }
                    }
                    catch (Exception e)
                    {
                        log.Error(e.Message);
                    }
                    finally
                    {
                        try
                        {
                            if (outStream != null)
                            {
                                outStream.Close();
                            }
                        }
                        catch (Exception ignore)
                        {
                        }
                    }
                }
                catch (Exception ioe)
                {
                    // connection timeout or read timeout
                    if (retriedCount == conf.GetHttpConnectRetryCount())
                    {
                        throw new TopCometSysErrorException(ioe.Message);
                    }
                }
                try
                {
                    log.Info("Sleeping " + conf.GetHttpConnectRetryInterval() + " seconds until the next retry.");
                    Thread.Sleep(retriedCount * conf.GetHttpConnectRetryInterval() * 1000);
                }
                catch (Exception ignore)
                {
                    //nothing to do
                }
            }
            return(resp);
        }
Exemple #16
0
        public T pageExecute <T>(IAopRequest <T> request, string accessToken, string appAuthToken, string reqMethod) where T : AopResponse
        {
            if (string.IsNullOrEmpty(this.charset))
            {
                this.charset = "utf-8";
            }

            string apiVersion = null;

            if (!string.IsNullOrEmpty(request.GetApiVersion()))
            {
                apiVersion = request.GetApiVersion();
            }
            else
            {
                apiVersion = Version;
            }

            AopDictionary txtParams = new AopDictionary(request.GetParameters());

            // 序列化BizModel
            txtParams = SerializeBizModel(txtParams, request);

            // 添加协议级请求参数
            txtParams.Add(AlipayConstants.METHOD, request.GetApiName());
            txtParams.Add(AlipayConstants.VERSION, apiVersion);
            txtParams.Add(AlipayConstants.ALIPAY_SDK, SDK_VERSION);
            txtParams.Add(AlipayConstants.APP_ID, appId);
            txtParams.Add(AlipayConstants.FORMAT, format);
            txtParams.Add(AlipayConstants.TIMESTAMP, DateTime.Now);
            txtParams.Add(AlipayConstants.ACCESS_TOKEN, accessToken);
            txtParams.Add(AlipayConstants.APP_AUTH_TOKEN, appAuthToken);
            txtParams.Add(AlipayConstants.SIGN_TYPE, signType);
            txtParams.Add(AlipayConstants.TERMINAL_TYPE, request.GetTerminalType());
            txtParams.Add(AlipayConstants.TERMINAL_INFO, request.GetTerminalInfo());
            txtParams.Add(AlipayConstants.PROD_CODE, request.GetProdCode());
            txtParams.Add(AlipayConstants.NOTIFY_URL, request.GetNotifyUrl());
            txtParams.Add(AlipayConstants.CHARSET, this.charset);
            txtParams.Add(AlipayConstants.RETURN_URL, request.GetReturnUrl());
            if (certEnvironment != null)
            {
                txtParams.Add(AlipayConstants.ALIPAY_ROOT_CERT_SN, certEnvironment.RootCertSN);
                txtParams.Add(AlipayConstants.APP_CERT_SN, certEnvironment.AppCertSN);
            }
            //字典排序
            IDictionary <string, string> sortedTxtParams = new SortedDictionary <string, string>(txtParams, StringComparer.Ordinal);

            txtParams = new AopDictionary(sortedTxtParams);

            // 排序返回字典类型添加签名参数
            txtParams.Add(AlipayConstants.SIGN, AopUtils.SignAopRequest(sortedTxtParams, privateKeyPem, this.charset, this.keyFromFile, this.signType));

            // 是否需要上传文件
            string body;

            if (request is IAopUploadRequest <T> )
            {
                IAopUploadRequest <T>          uRequest   = (IAopUploadRequest <T>)request;
                IDictionary <string, FileItem> fileParams = AopUtils.CleanupDictionary(uRequest.GetFileParameters());
                body = webUtils.DoPost(this.serverUrl + "?" + AlipayConstants.CHARSET + "=" + this.charset, txtParams, fileParams, this.charset);
            }
            else
            {
                if (reqMethod.Equals("GET"))
                {
                    //拼接get请求的url
                    string tmpUrl = serverUrl;
                    if (txtParams != null && txtParams.Count > 0)
                    {
                        if (tmpUrl.Contains("?"))
                        {
                            tmpUrl = tmpUrl + "&" + WebUtils.BuildQuery(txtParams, charset);
                        }
                        else
                        {
                            tmpUrl = tmpUrl + "?" + WebUtils.BuildQuery(txtParams, charset);
                        }
                    }
                    body = tmpUrl;
                }
                else
                {
                    //输出post表单
                    body = BuildHtmlRequest(txtParams, reqMethod, reqMethod);
                }
            }

            T rsp = null;
            IAopParser <T> parser = null;

            if ("xml".Equals(format))
            {
                parser = new AopXmlParser <T>();
                rsp    = parser.Parse(body, charset);
            }
            else
            {
                parser = new AopJsonParser <T>();
                rsp    = parser.Parse(body, charset);
            }

            return(rsp);
        }
Exemple #17
0
        /// <summary>
        /// 上传文件块 文件分块上传中间环节,传输文件块,除最后一块外每块的大小不得小于100KB,最大不超过超过8M,使用标准 http multipart 上传。 注意: 浏览器可能会转义某些字符导致请求失败,调试时请使用curl或者代码模拟请求。 请保证自己的机器有足够的出口带宽,否则可能导致上传异常缓慢。
        /// </summary>
        /// <param name="accessToken"></param>
        /// <param name="agentId">微应用的agentId</param>
        /// <param name="chunkSequence">文件块号,从1开始计数</param>
        /// <param name="uploadId">上传事务id,需要utf-8 urlEncode</param>
        /// <param name="file">文件</param>
        /// <returns></returns>
        public OapiFileUploadChunkResponse UploadChunk(string accessToken, string agentId, long chunkSequence, string uploadId, FileItem file)
        {
            OapiFileUploadChunkRequest request = new OapiFileUploadChunkRequest();

            request.AgentId       = agentId;
            request.ChunkSequence = chunkSequence;
            request.UploadId      = uploadId;
            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/file/upload/chunk?" + WebUtils.BuildQuery(request.GetParameters()));

            request      = new OapiFileUploadChunkRequest();
            request.File = file;
            OapiFileUploadChunkResponse response = client.Execute(request, accessToken);

            return(response);
        }
Exemple #18
0
        /// <summary>
        /// 发送钉盘文件给指定用户 将文件发送给指定用户,用户将收到以微应用名义发送的一条文件消息。 注意:浏览器可能会转义某些字符导致请求失败,调试时请使用curl或者代码模拟请求。
        /// </summary>
        /// <param name="accessToken"></param>
        /// <param name="agentId">文件发送者微应用的agentId</param>
        /// <param name="userId">文件接收人的userid</param>
        /// <param name="mediaId">调用钉盘上传文件接口得到的mediaid,需要utf-8 urlEncode</param>
        /// <param name="fileName">文件名(需包含扩展名),需要utf-8 urlEncode</param>
        /// <returns></returns>
        public OapiCspaceAddToSingleChatResponse AddToSingleChat(string accessToken, string agentId, string userId, string mediaId, string fileName)
        {
            OapiCspaceAddToSingleChatRequest request = new OapiCspaceAddToSingleChatRequest();

            request.AgentId  = agentId;
            request.Userid   = userId;
            request.MediaId  = mediaId;
            request.FileName = fileName;

            IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/cspace/add_to_single_chat?" + WebUtils.BuildQuery(request.GetParameters()));

            OapiCspaceAddToSingleChatResponse response = client.Execute(request, accessToken);

            return(response);
        }
        public T pageExecute <T>(IAopRequest <T> request, string accessToken, string reqMethod) where T : AopResponse
        {
            if (string.IsNullOrEmpty(this.charset))
            {
                this.charset = "utf-8";
            }

            string apiVersion = null;

            if (!string.IsNullOrEmpty(request.GetApiVersion()))
            {
                apiVersion = request.GetApiVersion();
            }
            else
            {
                apiVersion = Version;
            }

            AopDictionary txtParams = new AopDictionary(request.GetParameters());

            // 序列化BizModel
            txtParams = SerializeBizModel(txtParams, request);

            System.Text.StringBuilder xmlData = new System.Text.StringBuilder();


            // 添加协议级请求参数
            //AopDictionary txtParams = new AopDictionary(request.GetParameters());
            txtParams.Add(METHOD, request.GetApiName());
            txtParams.Add(VERSION, apiVersion);
            txtParams.Add(APP_ID, appId);
            txtParams.Add(FORMAT, format);
            txtParams.Add(TIMESTAMP, DateTime.Now);
            txtParams.Add(ACCESS_TOKEN, accessToken);
            txtParams.Add(SIGN_TYPE, signType);
            txtParams.Add(TERMINAL_TYPE, request.GetTerminalType());
            txtParams.Add(TERMINAL_INFO, request.GetTerminalInfo());
            txtParams.Add(PROD_CODE, request.GetProdCode());
            txtParams.Add(NOTIFY_URL, request.GetNotifyUrl());
            txtParams.Add(CHARSET, this.charset);
            //txtParams.Add(RETURN_URL, this.return_url);
            txtParams.Add(RETURN_URL, request.GetReturnUrl());
            //字典排序
            IDictionary <string, string> sortedTxtParams = new SortedDictionary <string, string>(txtParams);

            txtParams = new AopDictionary(sortedTxtParams);
            // 排序返回字典类型添加签名参数
            txtParams.Add(SIGN, AopUtils.SignAopRequest(sortedTxtParams, privateKeyPem, this.charset, this.keyFromFile, this.signType));

            // 是否需要上传文件
            string body;

            if (request is IAopUploadRequest <T> )
            {
                IAopUploadRequest <T>          uRequest   = (IAopUploadRequest <T>)request;
                IDictionary <string, FileItem> fileParams = AopUtils.CleanupDictionary(uRequest.GetFileParameters());
                body = webUtils.DoPost(this.serverUrl + "?" + CHARSET + "=" + this.charset, txtParams, fileParams, this.charset);
            }
            else
            {
                if (reqMethod.Equals("GET"))
                {
                    //直接调用DoGet方法请求
                    //body=webUtils .DoGet (this.serverUrl ,txtParams ,this.charset);
                    //拼接get请求的url
                    string tmpUrl = serverUrl;
                    if (txtParams != null && txtParams.Count > 0)
                    {
                        if (tmpUrl.Contains("?"))
                        {
                            tmpUrl = tmpUrl + "&" + WebUtils.BuildQuery(txtParams, charset);
                        }
                        else
                        {
                            tmpUrl = tmpUrl + "?" + WebUtils.BuildQuery(txtParams, charset);
                        }
                    }
                    body = tmpUrl;
                }
                else
                {
                    //直接调用DoPost方法请求
                    // body = webUtils.DoPost(this.serverUrl, txtParams, this.charset);
                    //输出post表单
                    body = BuildHtmlRequest(txtParams, reqMethod, reqMethod);
                }
            }

            T rsp = null;
            IAopParser <T> parser = null;

            if ("xml".Equals(format))
            {
                parser = new AopXmlParser <T>();
                rsp    = parser.Parse(body, charset);
            }
            else
            {
                parser = new AopJsonParser <T>();
                rsp    = parser.Parse(body, charset);
            }

            //验签
            // CheckResponseSign(request, rsp, parser, this.alipayPublicKey, this.charset);
            return(rsp);
        }
        public T pageExecute <T>(IAopRequest <T> request, string accessToken, string reqMethod) where T : AopResponse
        {
            if (string.IsNullOrEmpty(charset))
            {
                charset = "utf-8";
            }
            string text = null;

            text = (string.IsNullOrEmpty(request.GetApiVersion()) ? Version : request.GetApiVersion());
            AopDictionary requestParams = new AopDictionary(request.GetParameters());

            requestParams = SerializeBizModel(requestParams, request);
            StringBuilder stringBuilder = new StringBuilder();

            requestParams.Add("method", request.GetApiName());
            requestParams.Add("version", text);
            requestParams.Add("app_id", appId);
            requestParams.Add("format", format);
            requestParams.Add("timestamp", DateTime.Now);
            requestParams.Add("auth_token", accessToken);
            requestParams.Add("sign_type", signType);
            requestParams.Add("terminal_type", request.GetTerminalType());
            requestParams.Add("terminal_info", request.GetTerminalInfo());
            requestParams.Add("prod_code", request.GetProdCode());
            requestParams.Add("notify_url", request.GetNotifyUrl());
            requestParams.Add("charset", charset);
            requestParams.Add("return_url", request.GetReturnUrl());
            IDictionary <string, string> dictionary = new SortedDictionary <string, string>(requestParams);

            requestParams = new AopDictionary(dictionary);
            requestParams.Add("sign", AopUtils.SignAopRequest(dictionary, privateKeyPem, charset, keyFromFile, signType));
            string body;

            if (request is IAopUploadRequest <T> )
            {
                IAopUploadRequest <T>          aopUploadRequest = (IAopUploadRequest <T>)request;
                IDictionary <string, FileItem> fileParams       = AopUtils.CleanupDictionary(aopUploadRequest.GetFileParameters());
                body = webUtils.DoPost(serverUrl + "?charset=" + charset, requestParams, fileParams, charset);
            }
            else if (reqMethod.Equals("GET"))
            {
                string text2 = serverUrl;
                if (requestParams != null && requestParams.Count > 0)
                {
                    text2 = ((!text2.Contains("?")) ? (text2 + "?" + WebUtils.BuildQuery(requestParams, charset)) : (text2 + "&" + WebUtils.BuildQuery(requestParams, charset)));
                }
                body = text2;
            }
            else
            {
                body = BuildHtmlRequest(requestParams, reqMethod, reqMethod);
            }
            T val = null;
            IAopParser <T> aopParser = null;

            if ("xml".Equals(format))
            {
                aopParser = new AopXmlParser <T>();
                return(aopParser.Parse(body, charset));
            }
            aopParser = new AopJsonParser <T>();
            return(aopParser.Parse(body, charset));
        }
Exemple #21
0
        public async Task <string> SendNotify(string orderid, bool isSystem = true, bool isAsyn = true)
        {
            SettleOrder o = DbContext._.Db.From <SettleOrder>().Where(p => p.Order_id == orderid).First();

            if (o == null || o.Order_id != orderid)
            {
                return("订单不存在");
            }
            if (o.Status != 1)
            {
                return("订单状态还未成功");
            }
            if (o.Notify_status == 1)
            {
                return("订单异步通知已成功");
            }
            if (o.Notify_url.Length < 7)
            {
                return("订单通知地址不误");
            }
            SortedDictionary <string, string> para = new SortedDictionary <string, string>();

            para.Add("mchid", WebConfig.MchId);
            para.Add("orderid", o.Order_id);
            para.Add("serialid", o.Plat_order_id);
            para.Add("amount", o.Pay_amount.ToString());
            para.Add("attach", o.Attach);
            para.Add("msg", o.Returnmsg);
            para.Add("status", o.Status.ToString());

            string sign = string.Format("{0}&key={1}", OnlineSettle.GetParamSrc(para), WebConfig.MchKey);

            sign = Dos.Common.EncryptHelper.MD5EncryptWeChat(sign, "utf-8");

            para.Add("sign", sign);

            string msg = "异步通知发送中...";

            if (isAsyn)
            {
                msg =
                    Task.Run(() =>
                {
                    string r;
                    try
                    {
                        r = WebUtils.Post(o.Notify_url, WebUtils.BuildQuery(para, "utf-8"));
                    }
                    catch (Exception ee)
                    {
                        r = ee.ToString();
                    }

                    if (o.Notify_status != 1)
                    {
                        o.Attach(EntityState.Modified);
                        if (r == "ok")
                        {
                            o.Notify_status = 1;
                        }
                        else
                        {
                            o.Notify_status = 2;
                        }
                        if (o.Notify_times == null)
                        {
                            o.Notify_times = 0;
                        }

                        o.Notify_times    = o.Notify_times + 1;
                        o.Notify_lasttime = DateTime.Now.ToTimeStamp();
                        if (isSystem)
                        {
                            if (o.Notify_status != 1)
                            {
                                switch (o.Notify_times)
                                {
                                case 1: Publish(WebConfig.MchId, o.Order_id, 60); break;        //1分钟后再次通知

                                case 2: Publish(WebConfig.MchId, o.Order_id, 300); break;       //5分钟后再次通知

                                case 3: Publish(WebConfig.MchId, o.Order_id, 900); break;       //15分钟后再次通知

                                case 4: Publish(WebConfig.MchId, o.Order_id, 7200); break;      //2小时后再次通知

                                case 5: Publish(WebConfig.MchId, o.Order_id, 21600); break;     //6小时后再次通知

                                default: break;
                                }
                            }
                        }
                        DbContext._.Db.Save(o);
                    }
                    return(r);
                }).Result;
                return(msg);
            }
            else
            {
                string r;
                try
                {
                    r = WebUtils.Post(o.Notify_url, WebUtils.BuildQuery(para, "utf-8"));
                }
                catch (Exception ee)
                {
                    r = ee.ToString();
                }

                if (o.Notify_status != 1)
                {
                    o.Attach(EntityState.Modified);
                    if (r == "ok")
                    {
                        o.Notify_status = 1;
                    }
                    else
                    {
                        o.Notify_status = 2;
                    }
                    if (o.Notify_times == null)
                    {
                        o.Notify_times = 0;
                    }

                    o.Notify_times    = o.Notify_times + 1;
                    o.Notify_lasttime = DateTime.Now.ToTimeStamp();
                    if (isSystem)
                    {
                        if (o.Notify_status != 1)
                        {
                            switch (o.Notify_times)
                            {
                            case 1: Publish(WebConfig.MchId, o.Order_id, 60); break;       //1分钟后再次通知

                            case 2: Publish(WebConfig.MchId, o.Order_id, 300); break;      //5分钟后再次通知

                            case 3: Publish(WebConfig.MchId, o.Order_id, 900); break;      //15分钟后再次通知

                            case 4: Publish(WebConfig.MchId, o.Order_id, 7200); break;     //2小时后再次通知

                            case 5: Publish(WebConfig.MchId, o.Order_id, 21600); break;    //6小时后再次通知

                            default: break;
                            }
                        }
                    }
                    DbContext._.Db.Save(o);
                }
                return(r);
            }
        }