故事发生的背景: 公司快递业务这一块之前接入的是快递100,由于快递100的推送的实时性没有达到公司的要求,而且公司全都用的顺丰快递,所以直接接入了顺丰快递的api。demo文章最后下载(新增了json格式请求)
首先, 申请接入流程不多说,这个是申请地址 ,先看一下我在平台申请的五个api(第一个是默认就有的,也是必须有的,下面四个是自己添加的),如下图:

我说明一下第一个下单接口和第五个路由推送接口,其他的照葫芦画瓢就搞定了,代码我会放在文章最后给需要的人下载。
重要提示: 下顺丰订单,肯定存在输入信息有误取消订单的情况。所以下顺丰订单传入的orderId,不要是你项目中的唯一的订单标识符,例如orderNo啊什么的,否则取消顺丰订单后,再次下单传入同一个orderId时,会下单失败的,提示:该订单已取消。
准备阶段: 顺丰这边给了一个jar包–>SF-CSIM-EXPRESS-SDK-V1.6.jar,主要用于加密和网络请求,其实打开看看,里面没啥技术含量的,加密和请求都可以自己写,没必要导包。想图省事的话直接拷贝出来放到自己项目就行了,注意我圈的三个文件,我就直接导入到项目中修改了一下就开始用了。

下单接口

在开始测试前有个重点:这一点对于测试路由推送很重要,如下图

把路由推送快递信息到的地址先配置一下。因为测试环境下,在我们下单成功后10分钟内(也有15分钟左右推送的)平台会给我们推送两条测试信息。 后面我会说明回调地址中的代码如何写。继续回到下单接口,下面我就直接上代码了,这个最直观。

/*** 获取下单请求体* @param expressOrder 快递信息实体类* @return*/
public static String getOrderServiceRequestXml(ExpressOrder expressOrder) {StringBuilder strBuilder = new StringBuilder();strBuilder.append("<?xml version='1.0' encoding='UTF-8'?>");strBuilder.append("<Request service='OrderService' lang='zh-CN'>");strBuilder.append("<Head>" + CLIENT_CODE + "</Head>");strBuilder.append("<Body>");strBuilder.append("<Order").append(" ");strBuilder.append("orderid='" + expressOrder.getOrderId() + "'").append(" ");//  1 代表顺丰标快 -- 详情查看平台 快件产品类别表,注意:标快支持子母单,速配不支持strBuilder.append("express_type='1'").append(" ");// 寄件方信息strBuilder.append("j_province='" + expressOrder.getjProvince() + "'").append(" ");strBuilder.append("j_city='" + expressOrder.getjCity() + "'").append(" ");strBuilder.append("j_county='" + expressOrder.getjCounty() + "'").append(" ");strBuilder.append("j_company='" + expressOrder.getjCompany() + "'").append(" ");strBuilder.append("j_contact='" + expressOrder.getjContact() + "'").append(" ");strBuilder.append("j_tel='" + expressOrder.getjTel() + "'").append(" ");strBuilder.append("j_address='" + expressOrder.getjAddress() + "'").append(" ");// 收件方信息strBuilder.append("d_province='" + expressOrder.getdProvince() + "'").append(" ");strBuilder.append("d_city='" + expressOrder.getdCity() + "'").append(" ");strBuilder.append("d_county='" + expressOrder.getdCounty() + "'").append(" ");strBuilder.append("d_company='" + expressOrder.getdCompany() + "'").append(" ");strBuilder.append("d_tel='" + expressOrder.getdTel() + "'").append(" ");strBuilder.append("d_contact='" + expressOrder.getdContact() + "'").append(" ");strBuilder.append("d_address='" + expressOrder.getdAddress() + "'").append(" ");if (!TextUtils.isEmpty(expressOrder.getRemark())) {strBuilder.append("remark='" + expressOrder.getRemark() + "'").append(" ");}// 货物信息// 这个参数是设置包裹数量n,n大于1是子母件,一个母单号,其他子单号,需要打印n张快递单strBuilder.append("parcel_quantity='1'").append(" ");strBuilder.append("pay_method='1'").append(" ");strBuilder.append("custid ='" + CallExpressServiceTools.CUST_ID + "'").append(" ");strBuilder.append("customs_batchs=''").append(" ");strBuilder.append("cargo='医药'").append(">");strBuilder.append("</Order>");strBuilder.append("</Body>");strBuilder.append("</Request>");return strBuilder.toString();}

写个测试方法:

@Test
public void testShunfengOrderService() {ExpressOrder expressOrder = new ExpressOrder();expressOrder.setOrderId("20190121181653954019");expressOrder.setjProvince("广东省");expressOrder.setjCity("深圳市");expressOrder.setjCounty("南山区");expressOrder.setjCompany("金草中医");expressOrder.setjContact("李大宝");expressOrder.setjTel("18777276920");expressOrder.setjAddress("龙珠四路金谷创业园c座611");expressOrder.setdProvince("广东省");expressOrder.setdCity("广州市");expressOrder.setdCounty("海珠区");expressOrder.setdCompany("个人");expressOrder.setdContact("滕大宝");expressOrder.setdTel("18938905541");expressOrder.setdAddress("宝芝林大厦701室");String requestXml = RequestXmlUtil.getOrderServiceRequestXml(expressOrder);System.out.println("请求报文:" + requestXml);String respXml= CallExpressServiceTools.callSfExpressServiceByCSIM(requestXml);System.out.println("响应报文:" + respXml);
}

测试方法运行后,一种方法可以打印响应报文,结合平台说明看是否成功。另一种方式是通过平台的我的沙盒查看,我建议第二钟方法,因为第二种可以看到更多信息,而且更直观。如下图:

路由推送

推送配置方面,我选择的form方式,

路由推送关键的部分是接收到推送的响应,必须为post。代码如下:

@RequestMapping(value="shunfeng/callback", method = RequestMethod.POST)
public @ResponseBody String shunFengCallback(String content) {LOGGER.info("顺丰路由推送响应参数 shunfeng/callback  content:{}", content);// 这里可以对接收到的content解析后进行操作ShunFengResponse response = XmlHelper.xmlToBeanForSF(content);return "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +"<Response service=\"RoutePushService\">" +"<Head>OK</Head>" +"</Response>";
}

补充: 关于顺丰订单下成功以后打印面单的问题。下单成功后可以让顺丰那边上门取件由顺丰打印面单就可以了。也可以自己设计打印,比如我们公司需要用自己的包装盒,所以我们是自己打印面单的,我们使用二联的格式,布局时html画出来的,所需内容是自己下单填写的信息和下单成功后返回的信息。顺丰那边提供打印机和打印纸。
新增: demo中新增了json格式请求,已写好测试用例,直接运行即可。

ok,文章到这里就结束了,有不对的地方和有疑问的道友们欢迎指正和评论,积分不够或者链接失效的话可以先在评论区留下邮箱。
代码下载地址

java接入顺丰快递api(有可运行demo)(包括下单、路由查询、路由推送、查询订单状态、取消订单)相关推荐

  1. JAVA接入顺丰快递

    丰桥地址 下载到项目中后放到lib文件夹下,引入: <dependency><groupId>sf.sdk</groupId><artifactId>s ...

  2. java cs 顺丰运单_JAVA接入顺丰快递

    下载到项目中后放到lib文件夹下,引入: sf.sdk sf 1.0 system ${project.basedir}/src/main/resources/lib/SF-CSIM-EXPRESS- ...

  3. java 对接顺丰快递进行寄件操作 (使用RestTemplate 请求)

    相关资料 顺丰统一接入平台 :https://freight.sf-express.com/api/api.html#id=28 顺丰在线查询物流信息地址: https://www.sf-expres ...

  4. 顺丰java_JAVA接入顺丰快递

    下载到项目中后放到lib文件夹下,引入: sf.sdk sf 1.0 system ${project.basedir}/src/main/resources/lib/SF-CSIM-EXPRESS- ...

  5. 顺丰快递代码表java_JAVA接入顺丰快递

    下载到项目中后放到lib文件夹下,引入: sf.sdk sf 1.0 system ${project.basedir}/src/main/resources/lib/SF-CSIM-EXPRESS- ...

  6. JAVA对接顺丰快递(丰桥API)

    我们公司是做电商平台的,之前有接到过需求是对接顺丰快递,主要是用于查询物流信息以及预计派送时间.我这边经过查询相关资料整理出了以下代码. 对接顺丰快递是通过丰桥api实现的,首先需要到顺丰开放平台注册 ...

  7. JavaWeb企业级项目中接入顺丰官方API实现物流实时查询(亲测有效)

    由于现在顺丰与快递100闹掰了,所以使用快递一百已经查不到顺丰的物流信息了,包括快递鸟等,现在想要在项目中实现顺丰快递的物流查询只能用顺丰官方API来查询,然而这个官方的API并没有快递一百那些接口那 ...

  8. JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能

    最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑. 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token. 获取微信模板列表. 使用模板进行消息推送 ...

  9. MobPush 推送查询API

    设备详情接口 接口地址:http://api.push.mob.com/device-v3/getById/+registrationId 接口示例:http://api.push.mob.com/d ...

最新文章

  1. 内存溢出和内存泄漏的定义,产生原因以及解决方法(面试经验总结)
  2. C# 如何在ComboBox输入文字改变时,触发事件?
  3. Shell---判断(if)和分支(case)
  4. 170. Leetcode 135. 分发糖果 (贪心算法-两个维度权衡题目)
  5. 运行 vue 报node错
  6. c语言中fflushstdin作用,C语言fflush(stdin)函数是什么意思,在什么情况下用它
  7. 以太坊 node data write error_Node之 创建服务器与客户端
  8. 405 Method Not Allowed
  9. 算法完成了如何开发服务端API?
  10. c语言常用图形函数库,easyx安装过程及c语言常用图形库函数全解.ppt
  11. JVM垃圾回收机制 (垃圾判断,垃圾回收算法,垃圾回收器,五种引用)【jvm】
  12. java 优势和劣势
  13. 解决光纤猫恢复出厂功能后的上网问题
  14. 梧桐冷 暮秋雨落夜三更
  15. “华为杯”第十七届中国研究生 数学建模竞赛-【华为杯】B题:降低汽油精制过程中的辛烷值损失模型(附优秀论文)
  16. html java实训心得,学习中关于HTML的总结与一些心得
  17. Oracle所有错误类型
  18. js对json、xml字符串格式化(美化增强可读性)
  19. Fluent Terminal
  20. 游戏编程模式-空间分区

热门文章

  1. elasticsearch安装和使用
  2. 大学生创业之火如何再次燎原
  3. Xcode中的隐藏宝藏:模拟器里如何快速预览动态字体显示效果
  4. Maven手动导入依赖
  5. 计算机图形学三维建模及灯光作业(派大星)
  6. 灵活部署的数据中心Pod已初见端倪
  7. eovs实训报告总结心得_实训心得10篇完美版
  8. loj #6247. 九个太阳
  9. h5(移动端) 监听软键盘弹起、收起
  10. 星露谷物语联机服务器位置已满,星露谷物语联机版