相关资料

顺丰统一接入平台 :https://freight.sf-express.com/api/api.html#id=28

顺丰在线查询物流信息地址: https://www.sf-express.com/cn/sc/dynamic_function/waybill/#search/bill-number/SF1193907051991

SF1193907051991] 为快递号 -> 修改为自己的即可

一、顺丰api 接口请求核心类

1、顺丰请求工具类 SFUtil

package com.ws.ldy.others.kuaidi.sf.util;import com.alibaba.fastjson.JSON;
import com.ws.ldy.config.error.ErrorException;
import com.ws.ldy.others.kuaidi.sf.entity.SFReturnData;
import com.ws.ldy.others.kuaidi.sf.entity.SFReturnError;
import com.ws.ldy.others.kuaidi.sf.entity.cancel.request.RequestCancel;
import com.ws.ldy.others.kuaidi.sf.entity.cancel.response.ResponseCancel;
import com.ws.ldy.others.kuaidi.sf.entity.send.request.RequestCreate;
import com.ws.ldy.others.kuaidi.sf.entity.send.response.ResponseCreate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;/*** 顺丰快递 Api 接口对接, 官网文档-零担下单: https://freight.sf-express.com/api/api.html#id=30* <P>* 请求头必须添加: "Content-type","application/x-www-form-urlencoded;charset=UTF-8”* </P>* @author wangsong* @mail 1720696548@qq.com* @date 2020/9/9 0009 9:38* @version 1.0.0*/
@SuppressWarnings("all")
@Component
@Slf4j
public class SFUtil {@Autowiredprivate RestTemplate restTemplate;//测试地址private static final String TEST_URL = "https://sfapi.sit.sf-express.com:45273/std/service";private static final String TEST_PARTNER_ID = "fop_test";private static final String TEST_MD5_KEY = "2Z7YPBNG2CKKBV17";//正式地址 finalprivate static final String SF_URL = "https://sfapi.sf-express.com/std/service";private static final String SF_PARTNER_ID = "fop_test";private static final String SF_MD5_KEY = "2Z7YPBNG2CKKBV17";/*** 顺丰寄件下单* @author wangsong* @author requestCreate 下单参数* @date 2020/9/15 0015 15:42* @return ResponseCreate* @version 1.0.0*/public ResponseCreate fopReceLtlCreateOrder(RequestCreate requestCreate) {String mgsData = JSON.toJSONString(requestCreate);//SFReturnData sfReturnData = http("FOP_RECE_LTL_CREATE_ORDER", mgsData);//if (!"A1000".equals(sfReturnData.getApiResultCode())) {//失败log.info(sfReturnData.toString());throw new ErrorException(10099, sfReturnData.getApiErrorMsg());}String apiResultData = sfReturnData.getApiResultData();ResponseCreate responseCreate = JSON.parseObject(apiResultData, ResponseCreate.class);if (!responseCreate.isSuccess()) {//失败log.info(sfReturnData.toString());SFReturnError sfReturnError = JSON.parseObject(apiResultData, SFReturnError.class);throw new ErrorException(10099, sfReturnError.getErrorMessage());}return responseCreate;}/*** 顺丰取消订单* @author wangsong* @author cancel 下单参数* @date 2020/9/15 0015 15:42* @return 取消结果信息* @version 1.0.0*/public ResponseCancel fopReceLtlCancelOrder(RequestCancel cancel) {//String mgsData = JSON.toJSONString(cancel);//SFReturnData sfReturnData = http("FOP_RECE_LTL_CANCEL_ORDER", mgsData);if (!"A1000".equals(sfReturnData.getApiResultCode())) {//失败log.info(sfReturnData.toString());throw new ErrorException(10099, sfReturnData.getApiErrorMsg());}String apiResultData = sfReturnData.getApiResultData();ResponseCancel responseCancel = JSON.parseObject(apiResultData, ResponseCancel.class);if (!responseCancel.getSuccess()) {log.info(sfReturnData.toString());SFReturnError sfReturnError = JSON.parseObject(apiResultData, SFReturnError.class);throw new ErrorException(10099, sfReturnError.getErrorMessage());}return responseCancel;}/*** 下单结果查询* @author wangsong* @author orderId 寄件商家的订单Id(非寄件单号)* @date 2020/9/15 0015 15:42* @return 同下单相同数据* @version 1.0.0*/public ResponseCreate fopReceLtlGetOrderResult(String orderId) {//Map<String,String> param = new HashMap<>();param.put("orderId",orderId);String mgsData = JSON.toJSONString(param);//SFReturnData sfReturnData = http("FOP_RECE_LTL_GET_ORDER_RESULT", mgsData);//if (!"A1000".equals(sfReturnData.getApiResultCode())) {//失败log.info(sfReturnData.toString());throw new ErrorException(10099, sfReturnData.getApiErrorMsg());}String apiResultData = sfReturnData.getApiResultData();ResponseCreate responseCreate = JSON.parseObject(apiResultData, ResponseCreate.class);if (!responseCreate.isSuccess()) {//失败log.info(sfReturnData.toString());SFReturnError sfReturnError = JSON.parseObject(apiResultData, SFReturnError.class);throw new ErrorException(10099, sfReturnError.getErrorMessage());}return responseCreate;}/**** @param serviceCode 请求接口* @param mgsData 请求参数: json 参数*   <P>* //  1* 下快运订单   FOP_RECE_LTL_CREATE_ORDER* //  2*   取消订单    FOP_RECE_LTL_CANCEL_ORDER* //  3    筛单结果查询  FOP_RECE_LTL_SEARCH_ORDER* //  4    路由查询    FOP_RECE_LTL_SEARCH_ROUTER* //  5   路由推送        FOP_PUSH_LTL_ROUTER* //  6  清单费用推送  FOP_PUSH_LTL_FEE* //  7 清单费用查询  FOP_RECE_LTL_QUERY_FEE* //  8*  下单结果查询  FOP_RECE_LTL_GET_ORDER_RESULT* //  9    注册路由        FOP_RECE_LTL_REGISTER_ROUTER*   </P>* @return SFReturnData*/private SFReturnData http(String serviceCode, String mgsData) {String timestamp = System.currentTimeMillis() + "";// 发送快递参数处理MultiValueMap<String, Object> sendBody = new LinkedMultiValueMap<>();sendBody.add("partnerID", TEST_PARTNER_ID);                   // 合作伙伴编码(由顺丰分配)sendBody.add("requestID", UUID.randomUUID().toString());      // 请求唯一号UUIDsendBody.add("serviceCode", serviceCode);                     // 接口服务代码取消订单sendBody.add("timestamp", timestamp);                         // 调用接口时间戳sendBody.add("msgDigest", genDigest(timestamp, mgsData, TEST_MD5_KEY));  // 数字签名sendBody.add("msgData", mgsData);                                        // 业务数据报文//设置请求头参数HttpHeaders headers = new HttpHeaders();headers.add("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");//发送请求HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<>(sendBody, headers);ResponseEntity<String> result = restTemplate.postForEntity(TEST_URL, formEntity, String.class);//SFReturnData sfReturnData = JSON.parseObject(result.getBody(), SFReturnData.class);return sfReturnData;}/*** 业务数据加密* @param timestamp* @param mgsData* @param md5key* @return* @throws Exception*/private String genDigest(String timestamp, String mgsData, String md5key) {//将业务报文+时间戳+秘钥组合成需加密的字符串(注意顺序)String toVerifyText = mgsData + timestamp + md5key;//因业务报文中可能包含加号、空格等特殊字符,需要urlEnCode处理try {toVerifyText = URLEncoder.encode(toVerifyText, "UTF-8");//进行Md5加密MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(toVerifyText.getBytes("UTF-8"));byte[] md = md5.digest();//通过BASE64生成数字签名String msgDigest = new String(new BASE64Encoder().encode(md));return msgDigest;} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {e.printStackTrace();}return null;}
}

2、提供接口 SFService

/*** 顺丰快递* @author wangsong* @mail 1720696548@qq.com* @date 2020/9/15 0015 17:22* @version 1.0.0*/
public interface SFService {public String sendSF(RequestCreate en, String productName);public String cancelSF(String orderId);public ResponseCreate getOrderSF(String orderId);}

3、接口实现 SFServiceImpl

package com.ws.ldy.others.kuaidi.sf.service.impl;import com.ws.ldy.others.kuaidi.sf.entity.cancel.request.RequestCancel;
import com.ws.ldy.others.kuaidi.sf.entity.cancel.response.ResponseCancel;
import com.ws.ldy.others.kuaidi.sf.entity.send.request.CargoList;
import com.ws.ldy.others.kuaidi.sf.entity.send.request.RequestCreate;
import com.ws.ldy.others.kuaidi.sf.entity.send.response.ResponseCreate;
import com.ws.ldy.others.kuaidi.sf.service.SFService;
import com.ws.ldy.others.kuaidi.sf.util.SFUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** 顺丰* @author wangsong* @mail 1720696548@qq.com* @date 2020/9/15 0015 17:24 * @version 1.0.0*/
@Service
public class SFServiceImpl implements SFService {@Autowiredprivate SFUtil sfUtil;/*** 顺丰下单 /返回单号* @author wangsong* @mail 1720696548@qq.com* @date 2020/9/15 0015 19:36* @version 1.0.0*/@Overridepublic String sendSF(RequestCreate en, String productName) {// 付款方式(邮费): 1.寄方付 2.收方付 3.第三方付(默认收件方付)en.setPayMethod("2");// 货物明细CargoList cargoList = new CargoList();cargoList.setName(productName);en.setCargoList(cargoList);ResponseCreate responseCreate = sfUtil.fopReceLtlCreateOrder(en);return responseCreate == null ? null : responseCreate.getObj().getWaybillNo();}/*** 顺丰取消订单* @author wangsong* @mail 1720696548@qq.com* @date 2020/9/15 0015 19:36* @version 1.0.0*/@Overridepublic String cancelSF(String orderId) {RequestCancel requestCancel = new RequestCancel();requestCancel.setOrderid(orderId);  //客户订单号requestCancel.setCancelType("1");  //传1取消后,orderId可重复利用ResponseCancel responseCancel = sfUtil.fopReceLtlCancelOrder(requestCancel);return responseCancel == null ? null : responseCancel.getObj();}/*** 顺丰查询订单* @author wangsong* @mail 1720696548@qq.com* @date 2020/9/15 0015 19:36* @version 1.0.0*/@Overridepublic ResponseCreate getOrderSF(String orderId) {ResponseCreate responseCreate = sfUtil.fopReceLtlGetOrderResult(orderId);return responseCreate;}
}

4、提供测试接口

   @ApiOperation("发货测试")@RequestMapping(value = "/sendTest", method = RequestMethod.GET)public R<String> findTable(String orderId) {//RequestCreate en = new RequestCreate();en.setOrderid(orderId); // 订单Iden.setSendContact("王松");            // 寄件方联系人en.setSendMobile("17628689969");     // 寄件方电话en.setSendProvince("四川省");         // 寄件方所在省级行政区名称,必须是标准的省级行政区名称,如:北京、广东省、广西壮族自治区等;en.setSendCity("成都市");             // 寄件方所在地级行政区名称,必须是标准的城市称谓,   如:北京市、深圳市、大理白族自治州等;en.setSendCounty("青羊区");           // 寄件人所在县/区级行政区名称必须是标准的县/区称谓,   如:福田区,南涧彝族自治县、准格尔旗等。en.setSendAddress("新洲十一街万基商务大厦10楼。");    // 寄件人详细地址(请勿包含省市区),        如:新洲十一街万基商务大厦10楼。//en.setDeliveryContact("王松");     // 到件方联系人en.setDeliveryMobile("17628689969");en.setDeliveryProvince("四川省");  // 到件方所在省级行政区名称,必须是标准的省级行政区名称 如:北京、广东省、广西壮族自治区等;en.setDeliveryCity("成都市");      // 到件方所在地级行政区名称,必须是标准的城市称谓en.setDeliveryCounty("武侯区");    // 到件方所在县/区级行政区名称,必须是标准的县/区称谓, 如:福田区,南涧彝族自治县、准格尔旗等en.setDeliveryAddress("新洲十一街万基商务大厦11楼");// 到件方详细地址(请勿包含省市区),   如:新洲十一街万基商务大厦10楼。//return R.success(sfService.sendSF(en, "测试商品"));}

二、实体类封装

1、返回

1.1、正确统一返回 SFReturnError

package com.ws.ldy.others.kuaidi.sf.entity;import com.ws.ldy.others.base.model.Convert;
import lombok.Data;
import lombok.ToString;/*** 统一返回正确获取对应数据时错误* @author wangsong* @mail  1720696548@qq.com`在这里插入代码片`* @date  2020/9/15 0015 20:29* @version 1.0.0*/
@Data
@ToString
public class SFReturnError extends Convert {private String errorCode;private String errorMessage;private Boolean success;
}

1.2、错误统一返回 SFReturnData

package com.ws.ldy.others.kuaidi.sf.entity;import com.ws.ldy.others.base.model.Convert;
import lombok.Data;
import lombok.ToString;/*** 顺丰请求的-统一返回数据格式*/
@Data
@ToString
public class SFReturnData extends Convert {private String apiErrorMsg;private String apiResponseID;private String apiResultCode;private String apiResultData;}

2、寄件请求

2.1、请求必填参数 RequestCreate

/*** Copyright 2020 bejson.com*/
package com.ws.ldy.others.kuaidi.sf.entity.send.request;import com.ws.ldy.others.base.model.Convert;
import lombok.Data;
import lombok.ToString;/*** 顺丰寄件必填参数的请求参数(当前系统使用参数)* @author wangsong* @date 2020/9/15 0015 16:05* @return* @version 1.0.0*/
@Data
@ToString
public class RequestCreate extends Convert {private String orderid;           // 订单Id// 寄件方private String sendContact;       // 寄件方联系人private String sendMobile;        // 寄件方电话private String sendProvince;      // 寄件方所在省级行政区名称,必须是标准的省级行政区名称,如:北京、广东省、广西壮族自治区等;private String sendCity;          // 寄件方所在地级行政区名称,必须是标准的城市称谓,   如:北京市、深圳市、大理白族自治州等;private String sendCounty;        // 寄件人所在县/区级行政区名称必须是标准的县/区称谓,   如:福田区,南涧彝族自治县、准格尔旗等。private String sendAddress;       // 寄件人详细地址(请勿包含省市区),        如:新洲十一街万基商务大厦10楼。// 到件方private String deliveryContact;   // 到件方联系人private String deliveryMobile;    // 到件方电话private String deliveryProvince;  // 到件方所在省级行政区名称,必须是标准的省级行政区名称 如:北京、广东省、广西壮族自治区等;private String deliveryCity;      // 到件方所在地级行政区名称,必须是标准的城市称谓private String deliveryCounty;    // 到件方所在县/区级行政区名称,必须是标准的县/区称谓, 如:福田区,南涧彝族自治县、准格尔旗等private String deliveryAddress;   // 到件方详细地址(请勿包含省市区),   如:新洲十一街万基商务大厦10楼。//private String payMethod;         // 付款方式(邮费): 1.寄方付   2.收方付     3.第三方付private CargoList cargoList;      // 货物明细,-非必填 参见Cargoprivate String remark;            // 下单备注private String pickUpMode;         // 取件方式 1. 客户自送 2 上门接货。默认为2上门接货。private String expectedPickUpTime;  //  希望上门取件时间。 格式:yyyy-MM-dd HH:mm:ss}

2.2、请求必填- 子参数 CargoList

/*** 货物信息* @author wangsong* @mail  1720696548@qq.com* @date  2020/9/15 0015 20:13* @version 1.0.0*/
@Data
@ToString
public class CargoList {private String name;private int count;private String unit;private int length;private int width;private double amount;private String currency;private String sourcearea;private String productrecordno;private String goodPrepardNo;private String taxNo;private String hsCode;private double volume;private int boxno;private int installcargotype;private int height;private int weight;
}

2.3、响应参数 ResponseCreate

/*** 顺丰快递统一响应成功 SFReturnData 下的 apiResultData 内数据* @author wangsong* @mail  1720696548@qq.com* @date  2020/9/15 0015 20:15* @version 1.0.0*/
@Data
@ToString
public class ResponseCreate extends Convert {private Obj obj;private boolean success;
}

2.4、响应子参数 Obj

@Data
@ToString
public class Obj extends Convert {private String destCode;private String filterResult;private String orderId;private RlsInfo rlsInfo;private String waybillNo;  //顺丰订单号}

2.5、响应子参数 RlsDetail

@Data
@ToString
public class RlsDetail extends Convert {private String abFlag;private String cargoTypeCode;private String codingMapping;private String codingMappingOut;private String deliveryMode;private String destCityCode;private String destDeptCode;private String destDeptCodeMapping;private String destRouteLabel;private String destTeamCode;private String destTeamCodeMapping;private String destTransferCode;private String destinationStationCode;private String errMsg;private String expressTypeCode;private String fopIcon;private String goodsNumber;private String limitTypeCode;private String newIcon;private String printFlag;private String printIcon;private String proCode;private String proName;private String routeArray;private String sendAreaCode;private String sourceCityCode;private String sourceDeptCode;private String sourceTeamCode;private String sourceTransferCode;private String sxCompany;private String twoDimensionCode;private String waybillNo;private String xbFlag;
}

2.6、响应子参数 RlsInfo

@Data
@ToString
public class RlsInfo extends Convert {private RlsDetail rlsDetail;}

3、取消寄件

3.1、请求 RequestCancel

@Data
@ToString
public class RequestCancel extends Convert {private String orderid;             // 客户订单号private String cancelType;          // 传1取消后,orderId可重复利用}

3.2、响应 ResponseCancel

/*** 顺丰快递统一响应成功 SFReturnData 下的 apiResultData 内数据* @author wangsong* @date 2020/9/15 0015 16:05* @return* @version 1.0.0*/
@Data
@ToString
public class ResponseCancel extends Convert {private String errorCode;      // 错误代码private String errorMessage;   // 错误描述private Boolean success;       // 是否成功private String obj;            // 返回数据 //orderId String(64)  R   客户订单号}
  • 个人开源项目(通用后台管理系统)–> https://gitee.com/wslxm/spring-boot-plus2 , 喜欢的可以看看

  • 本文到此结束,如果觉得有用,动动小手点赞或关注一下呗,将不定时持续更新更多的内容…,感谢大家的观看!

java 对接顺丰快递进行寄件操作 (使用RestTemplate 请求)相关推荐

  1. 顺丰快递商家寄件发货接口API类型和接入流程方案【快递100接口Demo】

    顺丰快递对于商家和个人的隐私保护较为严格,对于操作频次高的用户会进行多次验证码确认信息和服务安全.如果需要大量地邮寄顺丰快递以及查询顺丰的快递物流轨迹信息,必须对接顺丰官方的寄件和查询API接口.企业 ...

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

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

  3. 国际快递的寄件流程是什么,寄国际快递常见的问题有哪些

    现在很多异国他乡的朋友都会用国际快递,使用国际快递时,需要按照寄件流程进行,物流公司也会按照要求将包裹完好无损地送到目的地. 很多朋友第一次使用国际快递总是很担心,不知道国际快递的时效,不知道哪些物品 ...

  4. java对接顺丰(丰桥)官方接口查询物流附小程序物流模板

    java对接顺丰接口查询物流 前提 丰桥是没有客服的,旁边的客服和群都是摆设,"同性交友会"罢了 准备 注册丰桥账号,申请开发者权限,这个的话是秒过,然后去申请接口 申请之后,如果 ...

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

    故事发生的背景: 公司快递业务这一块之前接入的是快递100,由于快递100的推送的实时性没有达到公司的要求,而且公司全都用的顺丰快递,所以直接接入了顺丰快递的api.demo文章最后下载(新增了jso ...

  6. 快递100下单未知错误?快递100寄件/同城配送接口FAQ

    寄件类 账号注册后商家寄件接口显示下单失败,是否可以调试? 1.商家寄件接口无接口费用,充值费用为运费,在无充值情况下无法调用接口,最低充值为100元: 2.商家寄件接口下单后为预扣费用,取消订单会返 ...

  7. JAVA接入顺丰快递

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

  8. java对接顺丰(丰桥)查询物流接口

    我这边只对接了顺丰的查询路由的接口.因为我公司下单是通过顺丰公司下单的.就是他们的快递员下单.我们的人员贴着快递单号.没有订单号.查询的时候也是通过物流单去查询的.本来准备用快递鸟去查询.但是快递鸟查 ...

  9. JAVA快递寄件下单api接口一次性接入顺丰,中通,圆通,申通,韵达,京东,德邦,百世,天天

    为了让各位更快地接入顺丰,中通,圆通,申通,韵达,京东,德邦,百世,天天等主流快递公司,大家可以把源码复制到你的项目上,将源码里的参数改成自己的账户参数就能直接使用了. ​ 此篇java demo方便 ...

最新文章

  1. MIT与FAIR提出「mixup」,利用数据和标签的随机线性插值提高神经网络的健壮性
  2. 13.挂载点、文件系统、磁盘的命名、分区的命名
  3. ios app上架App Store需要多少费用?
  4. ML之xgboost:利用xgboost算法(sklearn+7CrVa)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
  5. 对计算机描述错误的是什么意思,下列对计算机特点的描述中错误的是:________。...
  6. 数组和链表的区别以及应用场景
  7. freenas安装使用和弃坑
  8. CORS(跨域资源共享)
  9. JAVA入门级教学之(你是否理解HelloWorld的这段经典的代码的注释)
  10. LeetCode--057--插入区间(java)
  11. 一次跳槽经历(阿里/美团/头条/网易/有赞...)
  12. vue .native 方法未定义_技术分享谈谈Vue的响应式原理
  13. 【NLP】哈工大车万翔教授 -- 自然语言处理NLPer的核心竞争力是什么?19页ppt
  14. matlab点类型,Matlab中的类(Class)
  15. Photoshop抠图(磁性套索工具及几个常用案例)
  16. kata-container初探
  17. [深入研究4G/5G/6G专题-57]: L3信令控制-6-什么是无线承载DRB Profile
  18. 无版权?免费?无水印?高清大图?视频?
  19. 程序员要为了生活而工作,不要为了工作而生活。
  20. 微软采用 Visual Studio 2005 Team System 进行集成软件开发 ---技术案例研究

热门文章

  1. Javascript学习笔记(13_2) --js事件案例(小人快跑)
  2. Yii框架中setFlash和getFlash函数的用法
  3. Android——猜数字小游戏
  4. UCK Network 以用户至上、体验为王为核心, 打造完善的综合体验平台
  5. 如何避免动态字体Font Texture过大
  6. linux 计费服务器,腾讯云服务器的实例计费问题
  7. 根据电机控制应用需求选择合适的 MOSFET 驱动器(Microchip应用笔记)
  8. 堪比Wallpaper Engine的lively动态壁纸桌面软件
  9. 吴恩达深度学习coursework1
  10. 适合win7的python版本_windows支持哪个版本的python