天天看點

淘寶API open淘寶調用 二次開發源代碼

--- TaoBaoAPI.cs
 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Xml;
 using System.Collections;
 using System.Net;
 using System.IO;
 using ESCM.Base.SQLOperation;
 using ESCM.Base.EntityDAO;
 using System.Security.Cryptography;

 namespace ESCM.Base
 {
 public static class TaoBaoAPI
 {



 /// <summary>
 /// 執行淘寶API
 /// </summary>
 /// <param name="paraList">參數清單</param>
 /// <param name="keyStr">密鑰</param>
 /// <param name="apiUseType">使用類型</param>
 /// <returns></returns>
 public static TaoBaoApiRequestResuleType execute(SortedList paraList, string keyStr, TaoBaoApiUsageType taoBaoApiUsageType, Decimal userGUID, string xmlFileName)
 {

 Signature.Code = keyStr;
 string sipSign = Signature.DoSignature(paraList);
 string sipDate = "";
 foreach (DictionaryEntry entry in paraList)
 {
 sipDate = sipDate + "&" + entry.Key + "=" + entry.Value;
 }
 //必須将sign 放在 字元串的最後
 sipDate = sipDate.Substring(1, sipDate.Length - 1) + "&sign=" + sipSign;
 Encoding encoding = Encoding.GetEncoding("utf-8");
 byte[] postData = encoding.GetBytes(sipDate);//所有要傳參數拼裝
 try
 {
 //發送
 HttpWebRequest httpWebRequest = null;
 httpWebRequest = (HttpWebRequest)WebRequest.Create("");
 httpWebRequest.Method = "POST";
 httpWebRequest.ContentType = "application/x-www-form-urlencoded";
 httpWebRequest.ContentLength = postData.Length;
 Stream stream = httpWebRequest.GetRequestStream();
 stream.Write(postData, 0, postData.Length);
 stream.Close();
 //接收
 HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
 HttpStatusCode StatusCode = httpWebResponse.StatusCode;
 if (StatusCode == HttpStatusCode.OK)
 {
 StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8);
 string content = reader.ReadToEnd();

 if (content == "")
 {
 return TaoBaoApiRequestResuleType.DataNull;
 }
 else
 {
 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.LoadXml(content);
 if (xmlDoc.DocumentElement.Name == "error_rsp")
 {
 XmlNode node = xmlDoc.SelectSingleNode("error_rsp/msg");
 return TaoBaoApiRequestResuleType.ParaErr;
 }
 else
 {

 switch (taoBaoApiUsageType)
 {
 case TaoBaoApiUsageType.SingleItem:
 {
 try
 {


 return TaoBaoApiRequestResuleType.RequestSucess;
 }
 catch (Exception Ex)
 {
 return TaoBaoApiRequestResuleType.SaveErr;
 }
 }
 case TaoBaoApiUsageType.MutiItem:
 {
 try
 {
 xmlDoc.Save(xmlFileName);

 return TaoBaoApiRequestResuleType.RequestSucess;
 }
 catch (Exception Ex)
 {
 return TaoBaoApiRequestResuleType.SaveErr;
 }
 }
 case TaoBaoApiUsageType.SingleOrder:
 {
 try
 {


 return TaoBaoApiRequestResuleType.RequestSucess;
 }
 catch (Exception Ex)
 {
 return TaoBaoApiRequestResuleType.SaveErr;
 }
 }
 case TaoBaoApiUsageType.MutiOrder:
 {
 try
 {
 xmlDoc.Save(xmlFileName);
 return TaoBaoApiRequestResuleType.RequestSucess;
 }
 catch (Exception Ex)
 {
 return TaoBaoApiRequestResuleType.SaveErr;
 }
 }
 case TaoBaoApiUsageType.SingleCustomer:
 {
 try
 {

 return TaoBaoApiRequestResuleType.RequestSucess;
 }
 catch (Exception Ex)
 {
 return TaoBaoApiRequestResuleType.SaveErr;
 }
 }
 default:
 return TaoBaoApiRequestResuleType.InValideAPI;
 break;

 }
 }
 }

 }
 else
 {
 return TaoBaoApiRequestResuleType.RequestFaile;
 }
 }
 catch (Exception ex)
 {
 return TaoBaoApiRequestResuleType.exceptionErr;
 }
 }


 /// <summary> 
 /// 執行HTTP POST請求。 
 /// </summary> 
 /// <param name="url">請求位址</param> 
 /// <param name="parameters">請求參數</param> 
 /// <returns>HTTP響應</returns> 
 public static string DoPost(IDictionary<string, string> parameters)
 {
 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("");
 req.Method = "POST";
 req.KeepAlive = true;
 req.ContentType = "application/x-www-form-urlencoded";

 byte[] postData = Encoding.UTF8.GetBytes(BuildPostData(parameters));
 Stream reqStream = req.GetRequestStream();
 reqStream.Write(postData, 0, postData.Length);
 reqStream.Close();

 HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
 Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
 return GetResponseAsString(rsp, encoding);
 }

 /// <summary> 
 /// 執行HTTP GET請求。 
 /// </summary> 
 /// <param name="url">請求位址</param> 
 /// <param name="parameters">請求參數</param> 
 /// <returns>HTTP響應</returns> 
 public static string DoGet(string url, IDictionary<string, string> parameters)
 {
 if (parameters != null && parameters.Count > 0)
 {
 if (url.Contains("?"))
 {
 url = url + "&" + BuildPostData(parameters);
 }
 else
 {
 url = url + "?" + BuildPostData(parameters);
 }
 }

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
 req.Method = "GET";
 req.KeepAlive = true;
 req.ContentType = "application/x-www-form-urlencoded";

 HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
 Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
 return GetResponseAsString(rsp, encoding);
 }

 /// <summary> 
 /// 執行帶檔案上傳的HTTP POST請求。 
 /// </summary> 
 /// <param name="url">請求位址</param> 
 /// <param name="textParams">請求文本參數</param> 
 /// <param name="fileParams">請求檔案參數</param> 
 /// <returns>HTTP響應</returns> 
 public static string DoPost(IDictionary<string, string> textParams, IDictionary<string, FileInfo> fileParams)
 {
 string boundary = DateTime.Now.Ticks.ToString("X"); // 随機分隔線 

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("");
 req.Method = "POST";
 req.KeepAlive = true;
 req.ContentType = "multipart/form-data;boundary=" + boundary;

 Stream reqStream = req.GetRequestStream();
 byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
 byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");

 // 組裝文本請求參數 
 string entryTemplate = "Content-Disposition:form-data;name=\"\"\r\nContent-Type:text/plain\r\n\r\n";
 IEnumerator<KeyValuePair<string, string>> textEnum = textParams.GetEnumerator();
 while (textEnum.MoveNext())
 {
 string formItem = string.Format(entryTemplate, textEnum.Current.Key, textEnum.Current.Value);
 byte[] itemBytes = Encoding.UTF8.GetBytes(formItem);
 reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
 reqStream.Write(itemBytes, 0, itemBytes.Length);
 }

 // 組裝檔案請求參數 
 string fileTemplate = "Content-Disposition:form-data;name=\"\";filename=\"\"\r\nContent-Type:\r\n\r\n";
 IEnumerator<KeyValuePair<string, FileInfo>> fileEnum = fileParams.GetEnumerator();
 while (fileEnum.MoveNext())
 {
 string key = fileEnum.Current.Key;
 FileInfo file = fileEnum.Current.Value;
 string fileItem = string.Format(fileTemplate, key, file.FullName, GetMimeType(file.FullName));
 byte[] itemBytes = Encoding.UTF8.GetBytes(fileItem);
 reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
 reqStream.Write(itemBytes, 0, itemBytes.Length);

 using (Stream fileStream = file.OpenRead())
 {
 byte[] buffer = new byte[1024];
 int readBytes = 0;
 while ((readBytes = fileStream.Read(buffer, 0, buffer.Length)) > 0)
 {
 reqStream.Write(buffer, 0, readBytes);
 }
 }
 }

 reqStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
 reqStream.Close();

 HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
 Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
 return GetResponseAsString(rsp, encoding);
 }

 /// <summary> 
 /// 把響應流轉換為文本。 
 /// </summary> 
 /// <param name="rsp">響應流對象</param> 
 /// <param name="encoding">編碼方式</param> 
 /// <returns>響應文本</returns> 
 private static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
 {
 StringBuilder result = new StringBuilder();
 Stream stream = null;
 StreamReader reader = null;

 try
 {
 // 以字元流的方式讀取HTTP響應 
 stream = rsp.GetResponseStream();
 reader = new StreamReader(stream, encoding);

 // 每次讀取不大于512個字元,并寫入字元串 
 char[] buffer = new char[512];
 int readBytes = 0;
 while ((readBytes = reader.Read(buffer, 0, buffer.Length)) > 0)
 {
 result.Append(buffer, 0, readBytes);
 }
 }
 finally
 {
 // 釋放資源 
 if (reader != null) reader.Close();
 if (stream != null) stream.Close();
 if (rsp != null) rsp.Close();
 }

 return result.ToString();
 }

 /// <summary> 
 /// 根據檔案名字尾擷取圖檔型檔案的Mime-Type。 
 /// </summary> 
 /// <param name="filePath">檔案全名</param> 
 /// <returns>圖檔檔案的Mime-Type</returns> 
 private static string GetMimeType(string filePath)
 {
 string mimeType;

 switch (Path.GetExtension(filePath).ToLower())
 {
 case ".bmp": mimeType = "image/bmp"; break;
 case ".gif": mimeType = "image/gif"; break;
 case ".ico": mimeType = "image/x-icon"; break;
 case ".jpeg": mimeType = "image/jpeg"; break;
 case ".jpg": mimeType = "image/jpeg"; break;
 case ".png": mimeType = "image/png"; break;
 default: mimeType = "application/octet-stream"; break;
 }

 return mimeType;
 }

 /// <summary> 
 /// 組裝普通文本請求參數。 
 /// </summary> 
 /// <param name="parameters">Key-Value形式請求參數字典</param> 
 /// <returns>URL編碼後的請求資料</returns> 
 private static string BuildPostData(IDictionary<string, string> parameters)
 {
 StringBuilder postData = new StringBuilder();
 bool hasParam = false;

 IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
 while (dem.MoveNext())
 {
 string name = dem.Current.Key;
 string value = dem.Current.Value;
 // 忽略參數名或參數值為空的參數 
 if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value))
 {
 if (hasParam)
 {
 postData.Append("&");
 }

 postData.Append(name);
 postData.Append("=");
 postData.Append(Uri.EscapeDataString(value));
 hasParam = true;
 }
 }

 return postData.ToString();
 }

 /// <summary> 
 /// 給TOP請求簽名。 
 /// </summary> 
 /// <param name="parameters">所有字元型的TOP請求參數</param> 
 /// <param name="secret">簽名密鑰</param> 
 /// <returns>簽名</returns> 
 public static string SignTopRequest(IDictionary<string, string> parameters, string secret)
 {
 // 第一步:把字典按Key的字母順序排序 
 IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);
 IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();

 // 第二步:把所有參數名和參數值串在一起 
 StringBuilder query = new StringBuilder(secret);
 while (dem.MoveNext())
 {
 string key = dem.Current.Key;
 string value = dem.Current.Value;
 if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value))
 {
 query.Append(key).Append(value);
 }
 }

 // 第三步:使用MD5加密 
 MD5 md5 = MD5.Create();
 byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString()));

 // 第四步:把二進制轉化為大寫的十六進制 
 StringBuilder result = new StringBuilder();
 for (int i = 0; i < bytes.Length; i++)
 {
 string hex = bytes[i].ToString("X");
 if (hex.Length == 1)
 {
 result.Append("0");
 }
 result.Append(hex);
 }

 return result.ToString();
 }

 /// <summary> 
 /// 清除字典中值為空的項。 
 /// </summary> 
 /// <param name="dict">待清除的字典</param> 
 /// <returns>清除後的字典</returns> 
 public static IDictionary<string, string> CleanupDictionary(IDictionary<string, string> dict)
 {
 IDictionary<string, string> newDict = new Dictionary<string, string>();
 IEnumerator<KeyValuePair<string, string>> dem = dict.GetEnumerator();

 while (dem.MoveNext())
 {
 string name = dem.Current.Key;
 string value = dem.Current.Value;
 if (!string.IsNullOrEmpty(value))
 {
 newDict.Add(name, value);
 }
 }

 return newDict;
 } 

 }
 }