using System; using System.Collections.Generic; using System.Text; using System.Web; using System.Web.Security; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Security.Cryptography;
namespace TaoBaoInterface { public class Service { public static string TaobaoUrl = "http://110.75.50.103/user/WareHouseReceiveMessage.do";
/*** * 测试DSA公钥 */ static String strPublicKey = "MIIBtjCCASsGByqGSM44BAEwggEeAoGBAKRQ3ELATnIGJbRJE9+84RER2ULkU7eS" + "zrvX7RF1El0zlv65yI4Qgt9LeU464F6tV42aogHvh5lIe5HoKv0hKM+Am5BgSOSz" + "5f1+SD3NXOaiQfTcSZCOtZhbcZlPDx7OYraISenxHmEAUZoli0n9IscmsCprIJI0" + "/o1A9cnyQWoRAhUApBkCOX0pRTaE6P5s0VjgWW43hnkCgYAOG949Z9DcaRPuyCq0" + "fN7/5IVgIPsqA0vCY0ZWe+PULdfvKg+fLERt2LMYJlksD/KUb4FLgdKtBqI1ggbZ" + "Jdc8lbvgIFzV1XnYkcMJIVobSIAZDVA+2F/uVhj17EiOGWw1Oa+cRP8rDFNkUh2V" + "XNDqncfQr5zA1W/dQg4wu2zb2gOBhAACgYBCvUMmkn8wAliTXcFDn0/ZvO/2J9iO" + "l8FxsyhQu9iiF1OCvmTkT5Rwb3z61hixxi5JO4+aqZszlm8wMkxqOS8IaDYIWQl6" + "/rLV2+9YENEhmIuC3ngce3gZIsayzdxDnzxUqTww8MEV+t3SmWxgLHbTpvXhyFG6" + "DjzLcWRlT6RNtA==";
/*** 测试DSA私钥 */ static String strPrivateKey = "MIIBSgIBADCCASsGByqGSM44BAEwggEeAoGBAKRQ3ELATnIGJbRJE9+84RER2ULk" + "U7eSzrvX7RF1El0zlv65yI4Qgt9LeU464F6tV42aogHvh5lIe5HoKv0hKM+Am5Bg" + "SOSz5f1+SD3NXOaiQfTcSZCOtZhbcZlPDx7OYraISenxHmEAUZoli0n9IscmsCpr" + "IJI0/o1A9cnyQWoRAhUApBkCOX0pRTaE6P5s0VjgWW43hnkCgYAOG949Z9DcaRPu" + "yCq0fN7/5IVgIPsqA0vCY0ZWe+PULdfvKg+fLERt2LMYJlksD/KUb4FLgdKtBqI1" + "ggbZJdc8lbvgIFzV1XnYkcMJIVobSIAZDVA+2F/uVhj17EiOGWw1Oa+cRP8rDFNk" + "Uh2VXNDqncfQr5zA1W/dQg4wu2zb2gQWAhRGDs9OGMdl9f4Sx/fzUSszlYCm1g=="; /// <summary> /// /// </summary> /// <param name="url">请求的url地地址</param> /// <param name="xml">请求的xml内容</param> /// <returns></returns> public static string SendAPI(string url,string xml) { /*** * 测试DSA公钥 */ #region 对xml做DSA密钥签名 #endregion string formatString = "logistics_interface={0}&data_digest={1}&type=v1.0"; string postData = string.Format(formatString, HttpUtility.UrlEncode(xml, Encoding.GetEncoding("GBK")), HttpUtility.UrlEncode(DSAEnCryptoService(xml), Encoding.GetEncoding("GBK"))); ASCIIEncoding encoding = new ASCIIEncoding(); byte[] data = encoding.GetBytes(postData); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "Post"; request.ContentType = "application/x-www-form-urlencoded; charset=GBK"; request.ContentLength = data.Length;
//发送数据 Stream newStream = request.GetRequestStream(); newStream.Write(data, 0, data.Length); newStream.Close();
HttpWebResponse responseSorce = (HttpWebResponse)request.GetResponse();
Stream stream = responseSorce.GetResponseStream(); StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("GBK")); string content = reader.ReadToEnd(); content = Filert(content); stream.Close(); return content; }
public static string DecodeReponse(string content) {
int start = content.IndexOf("<?xml"); int end = content.LastIndexOf("</Response>"); int length = end - start + "</Response>".Length; string res = content.Substring(start, length); return res; }
#region Dirty work private static string Filert(string responseHtml) { // --------------------------------- // Wait for the closing </html> tag // --------------------------------- Regex eof = new Regex("</html>", RegexOptions.IgnoreCase);
string finalHtml = responseHtml.ToString(); Regex re = null;
// The title has an , RegexOptions.IgnoreCase); finalHtml = re.Replace(finalHtml, new MatchEvaluator(TitleMatch));
// Replace language="javascript" with script type="text/javascript" re = new Regex("(?<=script\\s*)(language=\"javascript\")", RegexOptions.IgnoreCase); finalHtml = re.Replace(finalHtml, new MatchEvaluator(JavaScriptMatch));
// If there are still any language="javascript" are left, delete them finalHtml = Regex.Replace(finalHtml, "language=\"javascript\"", string.Empty, RegexOptions.IgnoreCase);
// Clean up images. Some images have a border property which is deprecated in XHTML re = new Regex("<img.*(border=\".*?\").*?>", RegexOptions.IgnoreCase); finalHtml = re.Replace(finalHtml, new MatchEvaluator(ImageBorderMatch));
// Wrap the __VIEWSTATE tag in a div to pass validation re = new Regex("(<input.*?__VIEWSTATE.*?/>)", RegexOptions.IgnoreCase); finalHtml = re.Replace(finalHtml, new MatchEvaluator(ViewStateMatch));
// If __doPostBack is registered, replace the whole function if (finalHtml.IndexOf("__doPostBack") > -1) { try { int pos1 = finalHtml.IndexOf("var theform;"); int pos2 = finalHtml.IndexOf("theform.__EVENTTARGET", pos1); string methodText = finalHtml.Substring(pos1, pos2 - pos1); string formID = Regex.Match(methodText, "document.forms\\[\"(.*?)\"\\];", RegexOptions.IgnoreCase).Groups[1].Value.Replace(":", "_");
finalHtml = finalHtml.Replace(methodText, @"var theform = document.getElementById ('" + formID + "');\r\n\t\t"); } catch { } }
// Remove the "name" attribute from <form> tags because they are invalid re = new Regex("<form\\s+(name=.*?\\s)", RegexOptions.IgnoreCase); finalHtml = re.Replace(finalHtml, new MatchEvaluator(FormNameMatch)); //return finalHtml;
// Write the formatted HTML back byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml); return System.Text.Encoding.Default.GetString(data); }
//--------------------------------------------------------------------------- private static string TitleMatch(Match m) { return m.ToString().Replace(m.Groups[1].Value, string.Empty); }
//--------------------------------------------------------------------------- private static string JavaScriptMatch(Match m) { return m.ToString().Replace(m.Groups[1].Value, "type=\"text/javascript\""); }
//--------------------------------------------------------------------------- private static string ImageBorderMatch(Match m) { return m.ToString().Replace(m.Groups[1].Value, string.Empty); }
//--------------------------------------------------------------------------- private static string ViewStateMatch(Match m) { return string.Concat("<div>", m.Groups[1].Value, "</div>"); }
//--------------------------------------------------------------------------- private static string FormNameMatch(Match m) { return m.ToString().Replace(m.Groups[1].Value, string.Empty); } #endregion
/// <summary> /// 用私钥加密数据 /// </summary> /// <param name="str"></param> /// <returns>返回的是签名数据</returns> public static string DSAEnCryptoService(string str) { DSACryptoServiceProvider dsac = new DSACryptoServiceProvider(); byte[] privateBytes = null; byte[] bytes = Encoding.Default.GetBytes(str); //xml数据
privateBytes = Convert.FromBase64String(strPrivateKey);
AsnKeyParser keyParser = new AsnKeyParser(privateBytes);
dsac.ImportParameters(keyParser.ParseDSAPrivateKey());
byte[] sign = dsac.SignData(bytes);
string yy = ""; foreach (byte bt in sign) {
yy += bt.ToString() + ", "; } string dd = yy;
string strsign = Convert.ToBase64String(sign); return strsign;
}
/// <summary> /// 用公钥解密数据 /// </summary> /// <param name="str"></param> /// <returns>返回的是签名数据</returns> public static bool DSACryptoService(string str, string signstr) { try { byte[] bytes = Encoding.Default.GetBytes(str); //xml数据(URL解码以后的) byte[] signbytes = Convert.FromBase64String(signstr); //签名后的数据 DSACryptoServiceProvider dsac2 = new DSACryptoServiceProvider(); byte[] publicBytes = null; publicBytes = Convert.FromBase64String(strPublicKey); AsnKeyParser keyParser1 = new AsnKeyParser(publicBytes); dsac2.ImportParameters(keyParser1.ParseDSAPublicKey()); bool ver = dsac2.VerifyData(bytes, signbytes); if (ver) { return true; } else { return false; } } catch (Exception e) { string strlog = str + "| " + signstr + "| " + e.ToString(); return false; } } } }
|
请发表评论