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); }
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); }
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); }
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}"); }
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); }
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); }
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¶ms=\"{\"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¶ms={\"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); }
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()); }
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; } }
/// <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); }
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); }
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); }
/// <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); }
/// <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)); }
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); } }