參考文章:https://www.cnblogs.com/zhangxiaoyong/p/8317229.html
順豐需求文檔:
鏈接:https://pan.baidu.com/s/16EEaphJu2MI9gEvR30pDwQ
提取碼:ogry
我用的web API實現功能的
電商專遞下單功能
static string xmlstr = "<Request service='OrderService' lang='zh-CN'><Head>erptest</Head><Body><Order orderid='M689082997131401_14' platform_order_id='ML28082997131401' platform_code='JUNXIN' erp_code='0000' express_type='9' j_company='JIELISI' j_contact='JIELISI' j_tel='12344' j_mobile='1234' j_province='GUANGDONG' j_city='FOSHAN' j_address=' GUANGDONG ,CHIAN' d_company='Brazil' d_contact='Leonel' d_tel='12345678' d_mobile='12345678' d_province='Minas Gerais' d_city='Sao Geraldo ' d_address='hubei ' parcel_quantity='1' pay_method='1' declared_value='1.00' declared_value_currency='USD' j_country='CN' j_post_code='528000' d_country='BR' d_post_code='36530000' cargo_total_weight='0.030' operate_flag='1' isBat='1'><Cargo name='Rubber Chin Fixing Band' count='1' unit='PCE' weight='0.030' amount='1.00' cargo_desc='ST-T475-BL' currency='USD' cname='橡膠' hscode='3926909090'/></Order></Body></Request>"; /// <summary> /// 下單操作方法webService /// </summary> /// <param name="model"></param> /// <returns></returns> public static string GetWebService(OrderService model) { //得到下單XML請求體 var xml = xmlstr; //Getxml(model); //生成密匙 //var pass = Convert.ToBase64String(MD5(xml+Checkword)); string verifyCode = digest(xml + Checkword);//這是進一步封裝好的 //下單請求 http post模式 // var str = GethttpBack(Posturl, "xml=" + xml + "&verifyCode=" + pass); //下單請求web service模式 var str1 = SfKtsServiceAsync(xml, verifyCode).Result; return str1; } /// <summary> /// 文檔加密verifyCode的生成 /// </summary> /// <param name="toVerifyText"></param> /// <returns></returns> static string digest(string toVerifyText) { // verifyCode的生成規則為:先把xml與checkword前后連接。把連接后的字符串做MD5編碼。 //把MD5編碼后的數據進行Base64編碼,此時編碼后的字符串即為verifyCode。 // MD5 byte[] md5 = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(toVerifyText)); // Base64 string base64 = Convert.ToBase64String(md5); return base64; } /// <summary> /// 調用順豐接口 /// </summary> /// <param name="xml"></param> /// <param name="verifyCode"></param> /// <returns></returns> public static async Task<string> SfKtsServiceAsync(string xml, string verifyCode) { var client = new SfKtsServiceClient(); string result = await client.sfKtsServiceAsync(xml, verifyCode); //從XML文件中反序列化為對象 SfOrderResponse sfresponse; if (Convert.ToString(GetNodeValue(result, "Head")) == "ERR") { result = XElement.Parse(result).Value; ERROrderResponse ErrResonpse = new ERROrderResponse() { code = GetXmlNodeValue(result, "ERROR", "code") }; } else { sfresponse = new SfOrderResponse() { //獲取xml中orderid、mailno、destcode等節點值 orderid = GetXmlNodeValue(result, "OrderResponse", "orderid"), mailno = GetXmlNodeValue(result, "OrderResponse", "mailno"), agent_mailno = GetXmlNodeValue(result, "OrderResponse", "agent_mailno"), direction_code = GetXmlNodeValue(result, "OrderResponse", "direction_code") }; UsersInfoDal dal = new UsersInfoDal(); //如果不需要插入到數據庫中可以注釋掉 await dal.Add(sfresponse);//插入到數據庫中 //測試面單獲取 //string Url = "http://oms.uat.trackmeeasy.com/ruserver/api/getLabelUrl.action?mailno=" + sfresponse.mailno + "&orderid=" + sfresponse.orderid+ "&onepdf=false&jianhuodan=false&username=test&signature=BaZxxmrv6hJMwIt26m0wuw%3D%3D"; //var s = SfExpress.GetUrltoHtml(Url, "UTF8"); } return result; }
需要定義一個返回結果類 SfOrderResponse
/// <summary> /// 因為下單成功會返回訂單號和運單號 以及篩單結果,所以我們先定義一個返回的響應報文模型容器 /// </summary> public class SfOrderResponse { /// <summary> /// 訂單號 /// </summary> public string orderid { get; set; } /// <summary> /// 運單號 /// </summary> public string mailno { get; set; } /// <summary> /// 篩單結果 1 人工確認 2 可收派 3 不可以收派 /// </summary> // public string filter_result { get; set; } /// <summary> /// 流向代碼 /// </summary> public string direction_code { get; set; } /// <summary> /// 代理運單號(僅限10:掛號件才會有) 不是必填項 /// </summary> public string agent_mailno { get; set; } } /// <summary> /// 失敗響應 /// </summary> public class ERROrderResponse { /// <summary> /// 錯誤代碼 /// </summary> public string code { get; set; } }
面單獲取
#region 面單獲取HTTPwebRequest ML28082997131401_14 21190111_115140" mailno="SF6042002242203 //string Url = "http://oms.uat.trackmeeasy.com/ruserver/api/getLabelUrl.action"; // string Url = "http://oms.uat.trackmeeasy.com/ruserver/api/getLabelUrl.action?mailno=SF6042002242203&orderid=21190111_115140&onepdf=false&jianhuodan=false&username=test&signature=BaZxxmrv6hJMwIt26m0wuw%3D%3D"; /// <summary> /// 根據URL地址獲取網頁信息 /// </summary> /// <param name="Url">地址</param> /// <param name="type">編碼格式</param> /// <returns></returns> public static string GetUrltoHtml(string Url, string type) { string result = ""; try { //對統一資源標識符(URL)發出請求這是abstract System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url); // 獲取響應實例 System.Net.WebResponse wResp = wReq.GetResponse(); //提供字節序列的一般視圖 System.IO.Stream respStream = wResp.GetResponseStream(); // Dim reader As StreamReader = New StreamReader(respStream) using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream))//, Encoding.GetEncoding(type { result=reader.ReadToEnd();//返回的是json格式的result JsonTos(result);//把json格式轉成實體模型 return result; } } catch (System.Exception ex) { //errorMsg = ex.Message; } return result; } ///<summary> ///采用https協議訪問網絡 ///</summary> ///<param name="URL">url地址</param> ///<param name="strPostdata">發送的數據</param> ///<returns></returns> public static string OpenReadWithHttps(string URL, string strPostdata, string strEncoding) { Encoding encoding = Encoding.Default; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); request.Method = "post"; request.Accept = "text/html, application/xhtml+xml, */*"; request.ContentType = "application/x-www-form-urlencoded"; byte[] buffer = encoding.GetBytes(strPostdata); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding(strEncoding))) { return reader.ReadToEnd(); } } /// <summary> /// 把JSON格式的字符串轉換成實體對象 /// </summary> public static string JsonTos(string jsonText) { //JsonSerializer js = new JsonSerializer(); //JsonReader reader = new JsonTextReader(new StringReader(jsonText)); //while (reader.Read()) //{ // Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value); //} jsonText = jsonText.Replace("[", ""); jsonText = jsonText.Replace("]", ""); JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText); string Success = jo["success"].ToString(); string Mailno = jo["array"]["mailno"].ToString(); string Orderid = jo["array"]["orderid"].ToString(); string Url = jo["url"].ToString();//PDF文件 string ConfigId = jo["array"]["configId"].ToString(); string Version = jo["version"].ToString(); //創建一個實體對象 //expressSheet es = new expressSheet() //{ // mailno=Mailno, // orderid= Orderid //}; //保存文件到本地 GetFileFromNetUrl(Url); return Url; } /// <summary> /// 下載文件並保存文件到本地 /// </summary> /// <param name="url"></param> private static void GetFileFromNetUrl(string url) { try { System.Net.WebRequest req = System.Net.WebRequest.Create(url); req.Method = "GET"; //獲得用戶名密碼的Base64編碼 添加Authorization到HTTP頭 不需要的賬號密碼的可以注釋下面兩行代碼 //string code = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "userName", "passWord"))); // req.Headers.Add("Authorization", "Basic " + code); byte[] fileBytes; using (WebResponse webRes = req.GetResponse()) { int length = (int)webRes.ContentLength; HttpWebResponse response = webRes as HttpWebResponse; Stream stream = response.GetResponseStream(); //讀取到內存 MemoryStream stmMemory = new MemoryStream(); byte[] buffer = new byte[length]; int i; //將字節逐個放入到Byte中 while ((i = stream.Read(buffer, 0, buffer.Length)) > 0) { stmMemory.Write(buffer, 0, i); } fileBytes = stmMemory.ToArray();//文件流Byte,需要文件流可直接return,不需要下面的保存代碼 stmMemory.Close(); MemoryStream m = new MemoryStream(fileBytes); string file = string.Format("F:\\666666666666.pdf");//可根據文件類型自定義后綴 FileStream fs = new FileStream(file, FileMode.OpenOrCreate); m.WriteTo(fs); m.Close(); fs.Close(); } } catch (System.Exception ex) { throw ex; } } #endregion
獲取XML節點信息的方法
/// <summary> /// 讀取XML資源中的指定節點內容 /// </summary> /// <param name="source">XML資源</param> /// <param name="nodeName">節點名稱</param> /// <returns>節點內容</returns> public static object GetNodeValue(string source, string nodeName) { if (source == null || nodeName == null || source == "" || nodeName == "" || source.Length < nodeName.Length * 2) return null; var start = source.IndexOf("<" + nodeName + ">") + nodeName.Length + 2; var end = source.IndexOf("</" + nodeName + ">"); if (start == -1 || end == -1) return null; if (start >= end) return null; return source.Substring(start, end - start); } /// <summary> /// 獲取xml任意節點中某個屬性值 /// </summary> /// <param name="strXml">xml</param> /// <param name="strNodeName">節點名稱</param> /// <param name="strValueName">屬性名稱</param> /// <returns></returns> public static string GetXmlNodeValue(string strXml, string strNodeName, string strValueName) { try { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(strXml); var xNode = xmlDoc.SelectSingleNode("//" + strNodeName + ""); var strValue = xNode.Attributes[strValueName].Value; return strValue; } catch (Exception ex) { return ex.Message; } }