using AlibabaSDK.Setting; using CommonUtil; using CommonUtil.Web; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Security.Cryptography; using System.Text; using CommonUtil; using System.Web; namespace AlibabaSDK.Api { public class AliabaClient { /// /// 执行TOP公开API请求 /// /// /// /// /// /// public static T Execute(IAlibabaApiRequest request, string sessionKey) where T : AlibabaApiResponse { T t = null; try { // request.Validate(); string Method = request.GetApiName(); string PostUrl = AlibabaApiSet.G1OfficialUrl; string appKey = AlibabaApiSet.AppKey; string secretKey = AlibabaApiSet.SecretKey; long timeStamp = ExtendUtil.EncodeUnixMillisecond(DateTime.Now); //系统级参数 string baseUrl = $"{Method}/{appKey}"; PostUrl += $"{baseUrl}"; //获取应用级参数 Dictionary paramers = request.GetParameters(); paramers.Add("access_token", sessionKey); //计算sign string sign = GetSign(baseUrl, paramers); //paramers.Add("_aop_timestamp", timeStamp.ToString()); paramers.Add("_aop_signature", sign); string paramStr = string.Empty; foreach (var pa in paramers) { paramStr += paramStr.IsNullOrEmpty() ? $"?" : "&"; Type ty = pa.Value.GetType(); if ("string,long,int,douber,decimal".Contains(ty.Name.ToLower())) { paramStr += $"{ pa.Key}={ pa.Value}"; } else { paramStr += $"{ pa.Key}={ JSONUtil.ObjectToJson(pa.Value).ToUrlEncode()}"; } } IDictionary postDic = JSONUtil.JsonToObject>(JsonConvert.SerializeObject(paramers)); //Post请求数据 PostUrl += paramStr; //string responseStr = new WebUtil().DoPost(PostUrl, text, null); string responseStr = Post(PostUrl); if (responseStr.IsNullOrEmpty()) { return null; } t = JsonConvert.DeserializeObject(responseStr); t.Body = responseStr; } catch (Exception exe) { LogUtil.Error(exe.ToString(), "1688sdk错误"); t = request.ErrorObj() as T; if (t != null) { t.ErrorMsg = exe.Message; t.ErrorCode = "-32606"; } t.Body = ""; } return t; } //urlPath: 基础url部分,格式为protocol/apiVersion/namespace/apiName/appKey,如 json/1/system/currentTime/1;如果为客户端授权时此参数置为空串"" //paramDic: 请求参数,即queryString + request body 中的所有参数 private static string GetSign(string urlPath, Dictionary paramDic) { if (urlPath.StartsWith("/")) { urlPath = urlPath.Substring(1, urlPath.Length - 1); } byte[] signatureKey = Encoding.UTF8.GetBytes(AlibabaApiSet.SignKey);//此处用自己的签名密钥 List list = new List(); foreach (KeyValuePair kv in paramDic) { Type ty = kv.Value.GetType(); if ("string,long,int,douber,decimal".Contains(ty.Name.ToLower())) { list.Add(kv.Key + kv.Value.ToString()); } else { list.Add(kv.Key + JSONUtil.ObjectToJson(kv.Value)); } } list.Sort(); string tmp = urlPath; foreach (string kvstr in list) { tmp = tmp + kvstr; } //HMAC-SHA1 HMACSHA1 hmacsha1 = new HMACSHA1(signatureKey); byte[] hashBytes = hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(tmp)); byte[] hash = hmacsha1.Hash; //TO HEX return BitConverter.ToString(hashBytes).Replace("-", "").ToUpper(); } public static string Post(string Url) { string strURL = Url; //创建一个HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL); //Post请求方式 request.Method = "POST"; //内容类型 // request.ContentType = "application/x-www-form-urlencoded"; //设置参数,并进行URL编码 // string paraUrlCoded = jsonParas;//System.Web.HttpUtility.UrlEncode(jsonParas); byte[] payload; //将Json字符串转化为字节 // payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded); //设置请求的ContentLength // request.ContentLength = payload.Length; //发送请求,获得请求流 Stream writer; try { writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象 } catch (Exception) { writer = null; Console.Write("连接服务器失败!"); } //将请求参数写入流 // writer.Write(null, 0, 0); writer.Close();//关闭请求流 // String strValue = "";//strValue为http响应所返回的字符流 HttpWebResponse response; try { //获得响应流 response = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { response = ex.Response as HttpWebResponse; } Stream s = response.GetResponseStream(); // Stream postData = Request.InputStream; StreamReader sRead = new StreamReader(s); string postContent = sRead.ReadToEnd(); sRead.Close(); Console.ForegroundColor = ConsoleColor.Cyan; // Console.WriteLine($"服务端返回信息:{postContent},时间:{DateTime.Now.ToString()}"); return postContent;//返回Json数据 } } }