調用順豐API實現電商專遞下單和獲取面單功能


參考文章: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;
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM