参考文章:https://www.cnblogs.com/zhangxiaoyong/p/8317229.html

顺丰需求文档:

链接:https://pan.baidu.com/s/16EEaphJu2MI9gEvR30pDwQ
提取码:ogry

我用的web API实现功能的

电商专递下单功能

  1. 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>";
  2.  
  3. /// <summary>
  4. /// 下单操作方法webService
  5. /// </summary>
  6. /// <param name="model"></param>
  7. /// <returns></returns>
  8. public static string GetWebService(OrderService model)
  9. {
  10. //得到下单XML请求体
  11. var xml = xmlstr; //Getxml(model);
  12. //生成密匙
  13. //var pass = Convert.ToBase64String(MD5(xml+Checkword));
  14. string verifyCode = digest(xml + Checkword);//这是进一步封装好的
  15. //下单请求 http post模式
  16. // var str = GethttpBack(Posturl, "xml=" + xml + "&verifyCode=" + pass);
  17. //下单请求web service模式
  18. var str1 = SfKtsServiceAsync(xml, verifyCode).Result;
  19. return str1;
  20. }
  21.  
  22. /// <summary>
  23. /// 文档加密verifyCode的生成
  24. /// </summary>
  25. /// <param name="toVerifyText"></param>
  26. /// <returns></returns>
  27. static string digest(string toVerifyText)
  28. {
  29. // verifyCode的生成规则为:先把xml与checkword前后连接。把连接后的字符串做MD5编码。
  30. //把MD5编码后的数据进行Base64编码,此时编码后的字符串即为verifyCode。
  31. // MD5
  32. byte[] md5 = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(toVerifyText));
  33. // Base64
  34. string base64 = Convert.ToBase64String(md5);
  35. return base64;
  36. }
  37.  
  38. /// <summary>
  39. /// 调用顺丰接口
  40. /// </summary>
  41. /// <param name="xml"></param>
  42. /// <param name="verifyCode"></param>
  43. /// <returns></returns>
  44. public static async Task<string> SfKtsServiceAsync(string xml, string verifyCode)
  45. {
  46. var client = new SfKtsServiceClient();
  47. string result = await client.sfKtsServiceAsync(xml, verifyCode);
  48. //从XML文件中反序列化为对象
  49. SfOrderResponse sfresponse;
  50. if (Convert.ToString(GetNodeValue(result, "Head")) == "ERR")
  51. {
  52. result = XElement.Parse(result).Value;
  53. ERROrderResponse ErrResonpse = new ERROrderResponse() { code = GetXmlNodeValue(result, "ERROR", "code") };
  54. }
  55. else
  56. {
  57. sfresponse = new SfOrderResponse()
  58. {
  59. //获取xml中orderid、mailno、destcode等节点值
  60. orderid = GetXmlNodeValue(result, "OrderResponse", "orderid"),
  61. mailno = GetXmlNodeValue(result, "OrderResponse", "mailno"),
  62. agent_mailno = GetXmlNodeValue(result, "OrderResponse", "agent_mailno"),
  63. direction_code = GetXmlNodeValue(result, "OrderResponse", "direction_code")
  64. };
  65. UsersInfoDal dal = new UsersInfoDal(); //如果不需要插入到数据库中可以注释掉
  66. await dal.Add(sfresponse);//插入到数据库中
  67. //测试面单获取
  68. //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";
  69. //var s = SfExpress.GetUrltoHtml(Url, "UTF8");
  70. }
  71. return result;
  72. }

需要定义一个返回结果类   SfOrderResponse

  1. /// <summary>
  2. /// 因为下单成功会返回订单号和运单号 以及筛单结果,所以我们先定义一个返回的响应报文模型容器
  3. /// </summary>
  4. public class SfOrderResponse
  5. {
  6. /// <summary>
  7. /// 订单号
  8. /// </summary>
  9. public string orderid { get; set; }
  10.  
  11. /// <summary>
  12. /// 运单号
  13. /// </summary>
  14.  
  15. public string mailno { get; set; }
  16.  
  17. /// <summary>
  18. /// 筛单结果 1 人工确认 2 可收派 3 不可以收派
  19. /// </summary>
  20. // public string filter_result { get; set; }
  21. /// <summary>
  22. /// 流向代码
  23. /// </summary>
  24. public string direction_code { get; set; }
  25. /// <summary>
  26. /// 代理运单号(仅限10:挂号件才会有) 不是必填项
  27. /// </summary>
  28. public string agent_mailno { get; set; }
  29. }
  30. /// <summary>
  31. /// 失败响应
  32. /// </summary>
  33. public class ERROrderResponse
  34. {
  35. /// <summary>
  36. /// 错误代码
  37. /// </summary>
  38. public string code { get; set; }
  39. }

面单获取

  1. #region 面单获取HTTPwebRequest ML28082997131401_14 21190111_115140" mailno="SF6042002242203
  2. //string Url = "http://oms.uat.trackmeeasy.com/ruserver/api/getLabelUrl.action";
  3. // 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";
  4. /// <summary>
  5. /// 根据URL地址获取网页信息
  6. /// </summary>
  7. /// <param name="Url">地址</param>
  8. /// <param name="type">编码格式</param>
  9. /// <returns></returns>
  10. public static string GetUrltoHtml(string Url, string type)
  11. {
  12. string result = "";
  13. try
  14. {
  15. //对统一资源标识符(URL)发出请求这是abstract
  16. System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);
  17. // 获取响应实例
  18. System.Net.WebResponse wResp = wReq.GetResponse();
  19. //提供字节序列的一般视图
  20. System.IO.Stream respStream = wResp.GetResponseStream();
  21. // Dim reader As StreamReader = New StreamReader(respStream)
  22. using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream))//, Encoding.GetEncoding(type
  23. {
  24. result=reader.ReadToEnd();//返回的是json格式的result
  25. JsonTos(result);//把json格式转成实体模型
  26. return result;
  27. }
  28. }
  29. catch (System.Exception ex)
  30. {
  31. //errorMsg = ex.Message;
  32. }
  33. return result;
  34. }
  35. ///<summary>
  36. ///采用https协议访问网络
  37. ///</summary>
  38. ///<param name="URL">url地址</param>
  39. ///<param name="strPostdata">发送的数据</param>
  40. ///<returns></returns>
  41. public static string OpenReadWithHttps(string URL, string strPostdata, string strEncoding)
  42. {
  43. Encoding encoding = Encoding.Default;
  44. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
  45. request.Method = "post";
  46. request.Accept = "text/html, application/xhtml+xml, */*";
  47. request.ContentType = "application/x-www-form-urlencoded";
  48. byte[] buffer = encoding.GetBytes(strPostdata);
  49. request.ContentLength = buffer.Length;
  50. request.GetRequestStream().Write(buffer, , buffer.Length);
  51. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  52. using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding(strEncoding)))
  53. {
  54. return reader.ReadToEnd();
  55. }
  56. }
  57. /// <summary>
  58. /// 把JSON格式的字符串转换成实体对象
  59. /// </summary>
  60. public static string JsonTos(string jsonText)
  61. {
  62. //JsonSerializer js = new JsonSerializer();
  63. //JsonReader reader = new JsonTextReader(new StringReader(jsonText));
  64. //while (reader.Read())
  65. //{
  66. // Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value);
  67. //}
  68. jsonText = jsonText.Replace("[", "");
  69. jsonText = jsonText.Replace("]", "");
  70. JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
  71. string Success = jo["success"].ToString();
  72. string Mailno = jo["array"]["mailno"].ToString();
  73. string Orderid = jo["array"]["orderid"].ToString();
  74. string Url = jo["url"].ToString();//PDF文件
  75. string ConfigId = jo["array"]["configId"].ToString();
  76. string Version = jo["version"].ToString();
  77. //创建一个实体对象
  78. //expressSheet es = new expressSheet()
  79. //{
  80. // mailno=Mailno,
  81. // orderid= Orderid
  82. //};
  83. //保存文件到本地
  84. GetFileFromNetUrl(Url);
  85. return Url;
  86. }
  87. /// <summary>
  88. /// 下载文件并保存文件到本地
  89. /// </summary>
  90. /// <param name="url"></param>
  91. private static void GetFileFromNetUrl(string url)
  92. {
  93. try
  94. {
  95. System.Net.WebRequest req = System.Net.WebRequest.Create(url);
  96. req.Method = "GET";
  97. //获得用户名密码的Base64编码 添加Authorization到HTTP头 不需要的账号密码的可以注释下面两行代码
  98. //string code = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "userName", "passWord")));
  99. // req.Headers.Add("Authorization", "Basic " + code);
  100. byte[] fileBytes;
  101. using (WebResponse webRes = req.GetResponse())
  102. {
  103. int length = (int)webRes.ContentLength;
  104. HttpWebResponse response = webRes as HttpWebResponse;
  105. Stream stream = response.GetResponseStream();
  106.  
  107. //读取到内存
  108. MemoryStream stmMemory = new MemoryStream();
  109. byte[] buffer = new byte[length];
  110. int i;
  111. //将字节逐个放入到Byte中
  112. while ((i = stream.Read(buffer, , buffer.Length)) > )
  113. {
  114. stmMemory.Write(buffer, , i);
  115. }
  116. fileBytes = stmMemory.ToArray();//文件流Byte,需要文件流可直接return,不需要下面的保存代码
  117. stmMemory.Close();
  118.  
  119. MemoryStream m = new MemoryStream(fileBytes);
  120. string file = string.Format("F:\\666666666666.pdf");//可根据文件类型自定义后缀
  121. FileStream fs = new FileStream(file, FileMode.OpenOrCreate);
  122. m.WriteTo(fs);
  123. m.Close();
  124. fs.Close();
  125. }
  126. }
  127. catch (System.Exception ex)
  128. {
  129. throw ex;
  130. }
  131. }
  132. #endregion

获取XML节点信息的方法

  1. /// <summary>
  2. /// 读取XML资源中的指定节点内容
  3. /// </summary>
  4. /// <param name="source">XML资源</param>
  5. /// <param name="nodeName">节点名称</param>
  6. /// <returns>节点内容</returns>
  7. public static object GetNodeValue(string source, string nodeName)
  8. {
  9. if (source == null || nodeName == null || source == "" || nodeName == "" ||
  10. source.Length < nodeName.Length * ) return null;
  11.  
  12. var start = source.IndexOf("<" + nodeName + ">") + nodeName.Length + ;
  13. var end = source.IndexOf("</" + nodeName + ">");
  14. if (start == - || end == -)
  15. return null;
  16. if (start >= end)
  17. return null;
  18. return source.Substring(start, end - start);
  19. }
  20. /// <summary>
  21. /// 获取xml任意节点中某个属性值
  22. /// </summary>
  23. /// <param name="strXml">xml</param>
  24. /// <param name="strNodeName">节点名称</param>
  25. /// <param name="strValueName">属性名称</param>
  26. /// <returns></returns>
  27. public static string GetXmlNodeValue(string strXml, string strNodeName, string strValueName)
  28. {
  29. try
  30. {
  31. var xmlDoc = new XmlDocument();
  32. xmlDoc.LoadXml(strXml);
  33. var xNode = xmlDoc.SelectSingleNode("//" + strNodeName + "");
  34. var strValue = xNode.Attributes[strValueName].Value;
  35. return strValue;
  36. }
  37. catch (Exception ex)
  38. {
  39. return ex.Message;
  40. }
  41. }

调用顺丰API实现电商专递下单和获取面单功能的更多相关文章

  1. EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题

    下订单减库存的方式 现在,连农村的大姐都会用手机上淘宝购物了,相信电商对大家已经非常熟悉了,如果熟悉电商开发的同学,就知道在买家下单购买商品的时候,是需要扣减库存的,当然有2种扣减库存的方式, 一种是 ...

  2. 电商 APP 下单页(俗称车2) 业务流程概要设计

    购物车是电商APP的一个关键功能点,一般购物车包含 3-4 个页面,分别是: 1.购物车的商品列表页 2.商品下单页 3.订单付款页面 4.订单付款成功页面 由于现有购物车逻辑相对混乱,这里重新整理一 ...

  3. 双十一临近,怎样让买家流畅地秒杀? ——腾讯WeTest独家开放电商产品压测服务

    WeTest 导读 十一月临近,一年一度的电商大戏"双十一"又将隆重出场,目前各大商家已经开始各类优惠券的发放,各类大促的商品表单也已经提前流出,即将流入各个用户的购物车中. 作为 ...

  4. Java电商支付系统实战(一)- 简介

    现如今,支付成为热点 对于电商业务,这都是不可或缺的 核心功能剖析 下单->支付 nginx 将用户请求反向代理到我们编写的电商系统 = 下单 之后,点击支付跳转到支付系统,最后对接 通过跳转将 ...

  5. SpringCloud Alibaba实战(2:电商系统业务分析)

    选用了很常见的电商业务来进行SpringCloud Alibaba的实战. 当然,因为仅仅是为了学习SpringCloud Alibaba,所以对业务进行了大幅度简化,这里只取一个精简版的用户下单业务 ...

  6. 电商平台如何接入快递鸟电子面单API?

    快递鸟是全球物流接口服务商,为电商 ERP.电商平台.仓储.清关公司提供物流跟踪.电子面单.智选物流.物流金融.在线下单等服务,解决电商的物流管理模块和金融模块.现就对快递鸟电子面单API做基本描述, ...

  7. Java生鲜电商平台-统一格式返回的API架构设计与实战

    Java生鲜电商平台-统一格式返回的API架构设计与实战 说明:随着互联网各岗位精细化分工的普及,出现了很多的系统架构设计,比如常见的前后端分离架构,后端提供接口给前端,前端根据接口的数据进行渲染,大 ...

  8. Java生鲜电商平台-API请求性能调优与性能监控

    Java生鲜电商平台-API请求性能调优与性能监控 背景 在做性能分析时,API的执行时间是一个显著的指标,这里使用SpringBoot AOP的方式,通过对接口添加简单注解的方式来打印API的执行时 ...

  9. Java生鲜电商平台-API接口设计之token、timestamp、sign 具体架构与实现(APP/小程序,传输安全)

    Java生鲜电商平台-API接口设计之token.timestamp.sign 具体设计与实现 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃 ...

随机推荐

  1. pom.xml中properties作用

    可以在properties下声明相应的版本信息,然后在dependency下引用的时候用${spring-version}就可以引入该版本jar包了 <properties> <sp ...

  2. js根据数据条数与每页多少条数据计算页数,js前端计算页数

    /**  *根据数据条数与每页多少条数据计算页数   * totalnum 数据条数  * limit 每页多少条  */ function pageCount (totalnum,limit){   ...

  3. Swift_IOS之提示框UIAlertController

    import UIKit class ViewController: UIViewController ,UIActionSheetDelegate{ @IBAction func btn1(_ se ...

  4. 123457123456#0#-----com.twoapp.ErTongHuaHua01--前拼后广--儿童绘画填色游戏jiemei

    com.twoapp.ErTongHuaHua01----儿童绘画填色游戏jiemei

  5. migrate设置

    migrate配置 进入项目manage所在的目录中执行如下命令,否则会报错:no such table: django_session 进入cmd 输入盘符比如:E: 切换目录 cd E:\prog ...

  6. Python3之类和实例继承和多态

    在OPP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类,父类或超类 例如,我们已经编写了一个名为A ...

  7. iOS开发设计模式

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...

  8. 生成对抗网络GAN详解与代码

    1.GAN的基本原理其实非常简单,这里以生成图片为例进行说明.假设我们有两个网络,G(Generator)和D(Discriminator).正如它的名字所暗示的那样,它们的功能分别是: G是一个生成 ...

  9. nice-validator表单验证插件

    nice-validator表单验证插件的简单使用 前言 前端表单校验是过滤无效数据.假数据.有毒数据的第一步,是数据安全的第一道关卡,虽然我们不能100%相信客户端提交的数据(真正的校验还得在服务端 ...

  10. Flutter 弹出键盘屏幕溢出问题

    在使用输入框获取焦点,弹出键盘的时候,会导致屏幕溢出, 解决办法: resizeToAvoidBottomPadding: false, //输入框抵住键盘 return Scaffold( appB ...