多个电子面单接口平台分析和对接
电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务。通过热感应显示文字,打印速度比传统针式打印速度提升4~6倍。电子面单以接口形式嵌入到自己的系统、网站上,可以在自己的平台操作打印电子面单。
| 对比项目 | 传统面单 | 电子面单 |
|---|---|---|
| 出错率 | 高 | 低 |
| 打印速度(张/分钟) | 4~6 | 30~40 |
| 噪音 | 高 | 低 |
| 录单成本 | 2~3 | 0 |
| 机器成本(元/台) | 800~1200 | 900~1000 |
| 面单信息 | 字迹不清晰 | 标准化打印 |
| 是否需要回填单号 | 是 | 无需回填,系统生成运单号直接回填 |
一.电子面单接口类型及定义
1. 快递电子面单接口:快递公司自己开发的电子面单服务,商家使用必须快递公司上门做系统对接,使用一家快递则需要对接一次。
2.菜鸟电子面单接口:可一次对接15家快递公司,无需和每一家快递公司做对接。支持快递有四通一达、EMS、宅急送、德邦、优速、天天、快捷、全峰等15家常用快递公司,其中不包括顺丰。
3.快递鸟电子面单接口:可一次对接15家快递公司,无需和每一家快递公司做对接。支持快递有四通一达、顺丰、EMS、宅急送、德邦、优速等15家快递公司,对顺丰有电子面单服务需求的可以选择顺丰自有的电子面单或者是快递鸟电子面单。
二.开通使用流程
1.快递电子面单
a. 和多家快递公司申请账号
b.分别进行接口对接
c.电子面单服务用户向快递网点申请开通及确认合作细节
2.菜鸟电子面单
a.向菜鸟提交对接申请
b.和菜鸟进行接口对接
c.电子面单服务用户向菜鸟申请账号
d.电子面单服务用户向快递网点申请开通及确认合作细节
3.快递鸟电子面单
a. 进入http://www.kdniao.com/reg申请账号,获取专属的ID和KEY
b.和快递鸟进行接口对接
c.电子面单服务用户向快递网点申请开通及确认合作细节
接口类型较多,以下先附上快递鸟电子面单接口调用方式,希望对大家有所帮助。后面将逐个对菜鸟电子面单、顺丰电子面单等接口调用方式做整理说明。
三.电子面单对接案例—快递鸟
1.接口描述
接口支持的消息接收方式:HTTPPOST
请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"
API地址:http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx
2.请求系统级参数
| 参数名称 | 类型 | 说明 | 必须要求 |
|---|---|---|---|
| RequestData | String | 请求内容需进行URL(utf-8)编码。请求内容JSON格式,须和DataType一致。 | R |
| EBusinessID | String | 商户ID,请在我的服务页面查看。 | R |
| RequestType | String | 请求指令类型:1007 | R |
| DataSign | String | 数据内容签名:把(请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码,最后进行URL(utf-8)编码。详细过程请查看Demo。 | R |
| DataType | String | 请求、返回数据类型:只支持JSON格式 | O |
备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)。
3.接口参数
请求内容字段定义
| 参数名称 | 类型 | 说明 | 是否必须 | |
|---|---|---|---|---|
| CallBack | String | 用户自定义回调信息 | O | |
| MemberID | String | 会员标识 | O | |
| CustomerName | String | 电子面单客户账号(与快递网点申请) | O | |
| CustomerPwd | String | 电子面单密码 | O | |
| SendSite | String | 收件网点标识 | O | |
| ShipperCode | String | 快递公司编码 | R | |
| LogisticCode | String | 快递单号 | O | |
| OrderCode | String | 订单编号 | R | |
| MonthCode | String | 月结编码 | C | |
| PayType | Int | 邮费支付方式:1-现付,2-到付,3-月结,4-第三方支付 | R | |
| ExpType | String | 快递类型:1-标准快件 | R | |
| IsNotice | Int | 是否通知快递员上门揽件:0-不通知;1-通知;不填则默认为1 | O | |
| Cost | Double | 寄件费(运费) | O | |
| OtherCost | Double | 其他费用 | O | |
| Receiver | Company | String | 收件人公司 | O |
| Name | String | 收件人 | R | |
| Tel | String | 电话与手机,必填一个 | R | |
| Mobile | String | |||
| PostCode | String | 收件人邮编 | O | |
| ProvinceName | String | 收件省(如广东省,不要缺少“省”) | R | |
| CityName | String | 收件市(如深圳市,不要缺少“市”) | R | |
| ExpAreaName | String | 收件区(如福田区,不要缺少“区”或“县”) | O | |
| Address | String | 收件人详细地址 | R | |
| Sender | Company | String | 发件人公司 | O |
| Name | String | 发件人 | R | |
| Tel | String | 电话与手机,必填一个 | R | |
| Mobile | String | |||
| PostCode | String | 发件人邮编 | O | |
| ProvinceName | String | 发件省(如广东省,不要缺少“省”) | R | |
| CityName | String | 发件市(如深圳市,不要缺少“市”) | R | |
| ExpAreaName | String | 发件区(如福田区,不要缺少“区”或“县”) | O | |
| Address | String | 发件人详细地址 | R | |
| StartDate | String | 上门取货时间段:"yyyy-MM-dd HH:mm:ss"格式化,本文中所有时间格式相同 | O | |
| EndDate | String | O | ||
| Weight | Double | 物品总重量kg | O | |
| Quantity | Int | 件数/包裹数 | O | |
| Volume | Double | 物品总体积m3 | O | |
| Remark | String | 备注 | O | |
| AddServices | ||||
| AddService | Name | String | 增值服务名称 | O |
| Value | String | 增值服务值 | O | |
| CustomerID | String | 客户标识(选填) | O | |
| Commoditys | ||||
| Commodity | GoodsName | String | 商品名称 | R |
| GoodsCode | String | 商品编码 | O | |
| Goodsquantity | Int | 商品数量 | O | |
| GoodsPrice | Double | 商品价格 | O | |
| GoodsWeight | Double | 商品重量kg | O | |
| GoodsDesc | String | 商品描述 | O | |
| GoodsVol | Double | 商品体积m3 | O | |
| IsReturnPrintTemplate | String | 返回电子面单模板:0-不需要;1-需要 | O | |
返回参数定义
| 参数名称 | 类型 | 说明 | 必须要求 | |
|---|---|---|---|---|
| EBusinessID | String | 用户ID | R | |
| Order | OrderCode | String | 订单编号 | R |
| ShipperCode | String | 快递公司编码 | R | |
| LogisticCode | String | 快递单号 | R | |
| MarkDestination | String | 大头笔 | O | |
| OriginCode | String | 始发地区域编码 | O | |
| OriginName | String | 始发地/始发网点 | O | |
| DestinatioCode | String | 目的地区域编码 | O | |
| DestinatioName | String | 目的地/到达网点 | O | |
| SortingCode | String | 分拣编码 | O | |
| PackageCode | String | 集包编码 | O | |
| Success | Bool | 成功与否 | R | |
| ResultCode | String | 错误编码 | R | |
| Reason | String | 失败原因 | O | |
| UniquerRequestNumber | String | 唯一标识 | R | |
| PrintTemplate | String | 面单打印模板 | O | |
| EstimatedDeliveryTime | String | 订单预计到货时间yyyy-mm-dd | O | |
| Callback | String | 用户自定义回调信息 | O | |
4..NET对接源码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
namespace KdGoldAPI
{
/**
*
* 快递鸟电子面单接口
*
* @see: http://www.kdniao.com/MiandanAPI.aspx
* @copyright: 深圳市快金数据技术服务有限公司
*
* ID和Key请到官网申请:http://www.kdniao.com/ServiceApply.aspx
*/
public class KdApiEOrderDemo
{
//电商ID
private string EBusinessID = "请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
//电商加密私钥,快递鸟提供,注意保管,不要泄漏
private string AppKey = "请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
//请求url, 正式环境地址:http://api.kdniao.cc/api/Eorderservice
private string ReqURL = "http://testapi.kdniao.cc:8081/api/EOrderService";
/// <summary>
/// Json方式 电子面单
/// </summary>
/// <returns></returns>
public string orderTracesSubByJson()
{
string requestData = "{"OrderCode": "012657700312"," +
""ShipperCode":"YTO"," +
""PayType":1," +
""ExpType":1," +
""Cost":1.0," +
""OtherCost":1.0," +
""Sender":" +
"{" +
""Company":"LV","Name":"Taylor","Mobile":"15018442396","ProvinceName":"上海","CityName":"上海","ExpAreaName":"青浦区","Address":"明珠路73号"}," +
""Receiver":" +
"{" +
""Company":"GCCUI","Name":"Yann","Mobile":"15018442396","ProvinceName":"北京","CityName":"北京","ExpAreaName":"朝阳区","Address":"三里屯街道雅秀大厦"}," +
""Commodity":" +
"[{" +
""GoodsName":"鞋子","Goodsquantity":1,"GoodsWeight":1.0}]," +
""AddService":" +
"[{" +
""Name":"COD","Value":"1020"}]," +
""Weight":1.0," +
""Quantity":1," +
""Volume":0.0," +
""Remark":"小心轻放"," +
""IsReturnPrintTemplate":1}";
Dictionary<string, string> param = new Dictionary<string, string>();
param.Add("RequestData", HttpUtility.UrlEncode(requestData, Encoding.UTF8));
param.Add("EBusinessID", EBusinessID);
param.Add("RequestType", "1007");
string dataSign = encrypt(requestData, AppKey, "UTF-8");
param.Add("DataSign", HttpUtility.UrlEncode(dataSign, Encoding.UTF8));
param.Add("DataType", "2");
string result = sendPost(ReqURL, param);
//根据公司业务处理返回的信息......
return result;
}
/// <summary>
/// Post方式提交数据,返回网页的源代码
/// </summary>
/// <param name="url">发送请求的 URL</param>
/// <param name="param">请求的参数集合</param>
/// <returns>远程资源的响应结果</returns>
private string sendPost(string url, Dictionary<string, string> param)
{
string result = "";
StringBuilder postData = new StringBuilder();
if (param != null && param.Count > 0)
{
foreach (var p in param)
{
if (postData.Length > 0)
{
postData.Append("&");
}
postData.Append(p.Key);
postData.Append("=");
postData.Append(p.Value);
}
}
byte[] byteData = Encoding.GetEncoding("UTF-8").GetBytes(postData.ToString());
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = "application/x-www-form-urlencoded";
request.Referer = url;
request.Accept = "*/*";
request.Timeout = 30 * 1000;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
request.Method = "POST";
request.ContentLength = byteData.Length;
Stream stream = request.GetRequestStream();
stream.Write(byteData, 0, byteData.Length);
stream.Flush();
stream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream backStream = response.GetResponseStream();
StreamReader sr = new StreamReader(backStream, Encoding.GetEncoding("UTF-8"));
result = sr.ReadToEnd();
sr.Close();
backStream.Close();
response.Close();
request.Abort();
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
///<summary>
///电商Sign签名
///</summary>
///<param name="content">内容</param>
///<param name="keyValue">Appkey</param>
///<param name="charset">URL编码 </param>
///<returns>DataSign签名</returns>
private string encrypt(String content, String keyValue, String charset)
{
if (keyValue != null)
{
return base64(MD5(content + keyValue, charset), charset);
}
return base64(MD5(content, charset), charset);
}
///<summary>
/// 字符串MD5加密
///</summary>
///<param name="str">要加密的字符串</param>
///<param name="charset">编码方式</param>
///<returns>密文</returns>
private string MD5(string str, string charset)
{
byte[] buffer = System.Text.Encoding.GetEncoding(charset).GetBytes(str);
try
{
System.Security.Cryptography.MD5CryptoServiceProvider check;
check = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] somme = check.ComputeHash(buffer);
string ret = "";
foreach (byte a in somme)
{
if (a < 16)
ret += "0" + a.ToString("X");
else
ret += a.ToString("X");
}
return ret.ToLower();
}
catch
{
throw;
}
}
/// <summary>
/// base64编码
/// </summary>
/// <param name="str">内容</param>
/// <param name="charset">编码方式</param>
/// <returns></returns>
private string base64(String str, String charset)
{
return Convert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str));
}
}
}- 上一篇: 18.PHP数字与字符串比较的误区
- 下一篇: php的几个字符串对比函数
