zoukankan      html  css  js  c++  java
  • 调用顺丰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 + "		" + reader.ValueType + "		" + 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;
                }
            }
  • 相关阅读:
    Js事件触发列表与解说(转)
    HTTP 头部解释,HTTP 头部详细分析,最全HTTP头部信息
    【转】php 数组 编码转换
    Cookie 的规范介绍
    PHP底层的运行机制与原理
    PHP为什么会被认为是草根语言?
    asp.net中读取带有加号(+)的Cookie,会自动把加号替换为空格
    git克隆某个分支到本地指定的目录中
    yq(json,yaml)格式转换工具安装和使用
    k8s中configmap的作用及使用方式
  • 原文地址:https://www.cnblogs.com/hudean/p/11063087.html
Copyright © 2011-2022 走看看