前言

分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递100做为数据来源接口,这个接口是收费的,不过提供的功能还是非常强大的,有专门的售后维护团队。也有免费的方案,类似于快递鸟,不过数据出现问题就凉凉了

正文

实现思路大概分为三大步:

第一步:提交订阅信息到快递100的接口

第二步:快递100收到请求后会对回调地址进行跟踪,将快递信息推送给回调接口

第三步:回调接口收到Post推送的数据后,进行逻辑处理

注意:回调的地址建议单独部署一个API项目,不要放在主程序下面;或者在提交订阅时要求对回调进行签名验证。

下面附上详细代码:

Subscribe类

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using WoT.Infrastructure.Helper.Xml;
using WoT.Model.Inventory;
using WoT.ViewModel.Dtos.Inventory; namespace WoT.SyscTraceSys
{
/// <summary>
/// 订阅物流轨迹
/// </summary>
public class Subscribe
{
//拿到授权的Key
private static string key = ConfigurationManager.AppSettings["SubscribeKey"]; //请求的url
private static string reqUrl = "http://www.kuaidi100.com/poll"; //回调url
private static string callbackurl = "http://你的域名/api/kd100/callback"; /// <summary>
/// 发送订阅指令
/// </summary>
/// <param name="invoce">发货单</param>
/// <param name="shipperCode">快递公司</param>
/// <returns></returns>
public static KD100Result SendPost(Invoice invoce, string shipperCode = "SF")
{
StringBuilder param = new StringBuilder();
KD100Result kdResult = new KD100Result(); param.Append("<?xml version='1.0' encoding='UTF-8'?>")
.AppendFormat("<orderRequest>")
.AppendFormat("<company>{0}</company>", GetCom(shipperCode))
.AppendFormat("<number>{0}</number>", invoce.LogisticCode)
.AppendFormat("<from></from>")
.AppendFormat("<to></to>")
.AppendFormat("<key>{0}</key>", key)
.AppendFormat("<parameters><callbackurl>{0}</callbackurl><resultv2>1</resultv2></parameters>", callbackurl)
.Append("</orderRequest>"); NameValueCollection postvals = new NameValueCollection();
postvals.Add("schema", "xml");
postvals.Add("param", param.ToString());
try
{
using (WebClient wc = new WebClient())
{
string rlt = System.Text.Encoding.UTF8.GetString(wc.UploadValues(reqUrl, "POST", postvals));
kdResult = XmlExpand.DESerializer<KD100Result>(rlt);
}
}
catch (Exception ex)
{
return new KD100Result() { result = false, returnCode = , message = ex.Message };
}
return kdResult;
} /// <summary>
/// 获取com
/// </summary>
/// <param name="shipperCode"></param>
/// <returns></returns>
private static string GetCom(string shipperCode)
{
string com = "shunfeng";
switch (shipperCode)
{
case "EMS":
com = "ems";
break;
case "SF":
com = "shunfeng";
break;
case "STO":
com = "shentong";
break;
case "YD":
com = "yunda";
break;
case "YTO":
com = "yuantong";
break;
case "YZPY":
com = "youzhengguonei";
break;
case "ZJS":
com = "zhaijisong";
break;
case "ZTO":
com = "zhongtong";
break;
case "DBL":
com = "debangwuliu";
break;
case "JD":
com = "debangwuliu";
break;
default:
break;
}
return com;
}
}
}

Subscribe

GetCom()方法是获取获取快递公司的标示编号,我在数据库中只存了快递简称,所以需要通过这种方式获取,如果是存在数据库的就可以直接从数据库获取了。
DESerializer()方法将xml字符串转化为实体对象,关于实现的详情在前面C#操作Xml树的扩展类一节中有讲到。
ConfigurationManager.AppSettings["SubscribeKey"];是读取配置文件,获取快递100对商户授权的Key,配置代码如下:
在appSettings节点下添加

KD100Result类

    /// <summary>
/// 快递100返回结果
/// </summary>
[Serializable]
[XmlType("orderResponse")]
public class KD100Result
{
/// <summary>
///
/// </summary>
[XmlElement("result")]
public bool result { get; set; } /// <summary>
///
/// </summary>
[XmlElement("returnCode")]
public int returnCode { get; set; } /// <summary>
///
/// </summary>
[XmlElement("message")]
public string message { get; set; }
}

回调接口Action

        /// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("callback")]
public void callback()
{
StringBuilder sb = new StringBuilder();
DateTime now = DateTime.Now;
pushResponse push = new pushResponse()
{
Result = false,
ReturnCode = ,
Message = "没有拉取到相关数据"
}; HttpContext context = HttpContext.Current;
if (!context.Request.RequestType.ToUpper().Equals("POST"))
{
context.Response.Write(string.Format("<?xml version='1.0' encoding='UTF-8'?><pushResponse><result>{0}</result><returnCode>{1}</returnCode><message>{2}</message></pushResponse>", false, , "请使用POST提交"));
context.Response.End();
return;
} try
{
sb.Clear();
var stream = context.Request.InputStream;
string param = ReadStream(stream); if (string.IsNullOrEmpty(param))
{
context.Response.Write(string.Format("<?xml version='1.0' encoding='UTF-8'?><pushResponse><result>{0}</result><returnCode>{1}</returnCode><message>{2}ee</message></pushResponse>", push.Result, push.ReturnCode, push.Message));
context.Response.End();
return;
} Dictionary<string, string> dic = new Dictionary<string, string>(); string[] sp1 = param.Split('&');
foreach (string s in sp1)
{
int splIdx = s.IndexOf('=');
string key = s.Substring(, splIdx);
string value = s.Substring(splIdx + ); dic.Add(key.Trim(), value.Trim());
}
string cbxml = HttpUtility.UrlDecode(dic["param"], Encoding.UTF8); using (ILogisticsTraceService _Service = CoreServiceFactory.Used.Build<ILogisticsTraceService>())
{
push = _Service.PushLogisticsTrace(cbxml);
} sb.Append("<?xml version='1.0' encoding='UTF-8'?>")
.AppendFormat("<pushResponse><result>{0}</result>", push.Result)
.AppendFormat("<returnCode>{0}</returnCode>", push.ReturnCode)
.AppendFormat("<message>{0}</message>", push.Message)
.Append("</pushResponse>"); stream.Close();
context.Response.Write(sb.ToString());
context.Response.End();
}
catch (Exception)
{
context.Response.Write(string.Format("<?xml version='1.0' encoding='UTF-8'?><pushResponse><result>{0}</result><returnCode>{1}</returnCode><message>{2}</message></pushResponse>", false, , "服务器处理错误"));
} }

callback

有需要源码的朋友可以扫描下方二维码加入QQ群,我会把源码分享在QQ群里

PS:欢迎扫描下方二维码,加入QQ群

 
作者:Jacky
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

在Asp.Net MVC中利用快递100接口实现订阅物流轨迹功能的更多相关文章

  1. Asp.net Mvc中利用ValidationAttribute实现xss过滤

    在网站开发中,需要注意的一个问题就是防范XSS攻击,Asp.net mvc中已经自动为我们提供了这个功能.用户提交数据时时,在生成Action参数的过程中asp.net会对用户提交的数据进行验证,一旦 ...

  2. php利用快递100接口获取物流信息

    PHP使用CURL调用快递100接口查询运单信息 类代码如下: <?php/** * 快递100接口调用类 * @author 齐云海 * date: 2019/05/29 */ class E ...

  3. ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理

    话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...

  4. ASP.NET MVC 中的IResolver<T> 接口

    在ASP.NET MVC 的源码一些实体对象(比如 ControllerBuilder,ControllerFactory, Filters, ViewEngines 等)不再直接通过关键字new来创 ...

  5. 在ASP.NET MVC中利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的'好'东西记 ...

  6. 在MVC中利用uploadify插件实现上传文件的功能

    趁着近段的空闲时间,开发任务不是很重,就一直想把以前在仓促时间里所写的多文件上传功能改一下,在网上找了很多例子,觉得uploadify还可以,就想用它来试试.实现自己想要的功能.根据官网的开发文档,同 ...

  7. Asp.net MVC WebApi项目的自动接口文档及测试功能打开方法

    https://blog.csdn.net/foren_whb/article/details/78866133

  8. ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS

    ASP.NET MVC:利用ASP.NET MVC4的IBundleTransform集成LESS 背景 LESS确实不错,只是每次写完LESS都要手工编译一下有点麻烦(VS插件一直没有安装好),昨天 ...

  9. 【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

随机推荐

  1. java的nio例子

    package main; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.Inet ...

  2. JS Async Callback

    AsyncCallback 意义: 异步操作完成时调用的方法 语法1: 构造异步回调对象 AsyncCallback 异步回调对象名asyncCallback = new AsyncCallback( ...

  3. 使用 IntelliTrace 调试应用程序

    IntelliTrace 如何能够大幅改善您的日常开发活动,并提升您快速轻松诊断问题的能力,而不必重新启动应用程序和使用传统的“中断-单步执行-检查”技术进行调试.介绍了组织如何能够通过在测试过程中收 ...

  4. html-day04

    html-day04 1.html属性的弊端 1.完成相同的功能需要不同的属性支持 2.可维护性不高2.CSS 1.什么是CSS Cascading Style Sheet 层叠样式表.级联样式表.样 ...

  5. ASP项目部署IIS7.5中遇到的问题

    我们大家都熟悉了tomcat服务器的部署,如果是一个ASP项目如何部署呢.这也是我在客户现场遇到的问题.ASP项目一般是用的系统组件IIS来部署项目.下面我讲一下自己在部署过程中遇到的问题. 如果在网 ...

  6. cyclone IV中DDR的一个疑惑

    的生成的DDR2 IP中DDR的时钟竟然是双向的,而在arria10中生成的DDR4则是输出,而DDR2的datasheet上也指出ck和ck#是输入,不知为什么? inout mem_clk , i ...

  7. 【慕课网实战】Spark Streaming实时流处理项目实战笔记五之铭文升级版

    铭文一级: 单节点单broker的部署及使用 $KAFKA_HOME/config/server.propertiesbroker.id=0listenershost.namelog.dirszook ...

  8. WordPaster-HDwik5.0整合教程

    示例下载:http://yunpan.cn/Q9ufQGuFMK34r 1.上传WordPaster文件夹 2.上传upload.php文件,这个文件负责接收控件上传的图片,并保存到uploads文件 ...

  9. 富文本粘贴word文档内容图片处理

    公司做的项目要用到文本上传功能. 网上找了很久,大部分都有一些不成熟的问题,终于让我找到了一个成熟的项目. 下面就来看看: 1.打开工程: 对于文档的上传我们需要知道这个项目是否符合我们的初衷. 运行 ...

  10. (多重背包)hdu--2191--悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...