java 对接顺丰快递进行寄件操作 (使用RestTemplate 请求)
生活随笔
收集整理的這篇文章主要介紹了
java 对接顺丰快递进行寄件操作 (使用RestTemplate 请求)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
相關資料
順豐統一接入平臺 :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 请求)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux网卡启停,Linux程序启停脚
- 下一篇: VM技术(一)NES模拟器VM综述