--- 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;
}
}
}