对接顺丰接口
依賴
<!--順豐接口依賴--> <dependency><groupId>club.mrxiao</groupId><artifactId>express-java-sf</artifactId><version>1.0.2</version> </dependency>實現類
公司要求對接順豐接口
現在開發之后感覺其實也沒有那么難
具體源碼我放上來了
另外用的某個大佬寫好的 包
public class SfServiceImpl implements SfService {@Value("${sf.call.url}")//請求路徑 目前先寫死,未來放到nacos配置文件中 // private String sfCallUrl = "https://sfapi-sbox.sf-express.com/std/service";private String sfCallUrl ;@Value("${sf.client.code}")//顧客編碼 // private String sfClientCode ="顧客編碼、合作伙伴id";private String sfClientCode;@Value("${sf.check.word}")//沙箱校驗碼 // private String sfCheckWord = "你在豐橋獲取的校驗碼";private String sfCheckWord; //todo/*** 下訂單接口serviceCode*/private final String EXP_RECE_CREATE_ORDER = "EXP_RECE_CREATE_ORDER";/*** 訂單結果查詢接口serviceCode*/private final String EXP_RECE_SEARCH_ORDER_RESP = "EXP_RECE_SEARCH_ORDER_RESP";/** 訂單取消\確認接口 serviceCode* */private final String EXP_RECE_UPDATE_ORDER = "EXP_RECE_UPDATE_ORDER";private final String API_RESULT_CODE_A1000 = "A1000";private final String ERROR_CODE_S0000 = "S0000";// 重復下單private final String ERROR_CODE_8016 = "8016";private final String LANGUAGE_ZHCN = "zh-cn";private final String One = "1";下單實現
@Overridepublic R createOrder(SfOrderParam sfOrderParam) {try {if (null == sfOrderParam) {return R.error(1000, "順豐豐橋下訂單服務接口入參不能為空");}if (StringUtils.isBlank(sfOrderParam.getOrderId())) {return R.error(1000, "順豐豐橋下訂單服務接口orderId不能為空");}int hashCode = java.util.UUID.randomUUID().toString().hashCode();if (hashCode <0){hashCode=-hashCode;}// 0 代表前面補充0// 10 代表長度為10// d 代表參數為正數型String format = String.format("%010d", hashCode).substring(0,10);String orderId = "Plz" + format;sfOrderParam.setOrderId(orderId);//param.setOrderId(sfOrderParam.getOrderId());Map<String, String> params = new HashMap<String, String>();String timeStamp = String.valueOf(System.currentTimeMillis());String msgData = JSONObject.toJSONString(sfOrderParam);params.put("partnerID", sfClientCode);params.put("requestID", UUID.randomUUID().toString().replace("-", ""));params.put("serviceCode", EXP_RECE_CREATE_ORDER);params.put("timestamp", timeStamp);params.put("msgData", msgData);params.put("msgDigest", CallExpressServiceTools.getMsgDigest(msgData, timeStamp, sfCheckWord));long startTime = System.currentTimeMillis();log.info("調用豐橋下訂單接口服務開始, 入參:{}, sfCallUrl:{}, sfClientCode:{}, sfCheckWord:{}" + (String) params.get("msgData"), sfCallUrl, sfClientCode, sfCheckWord);String result = HttpClientUtil.post(sfCallUrl, params);log.info("調用豐橋下訂單接口服務結束, 返回結果:{}, 接口耗時:{}", result, String.valueOf(System.currentTimeMillis() - startTime));// if (StringUtils.isNotBlank(result)) { // JSONObject jsonObject = JSON.parseObject(result); // String apiResultCode = jsonObject.getString("apiResultCode"); // // if (StringUtils.isNotBlank(apiResultCode) && API_RESULT_CODE_A1000.equals(apiResultCode)) { // JSONObject apiResultData = jsonObject.getJSONObject("apiResultData"); // // if (apiResultData != null) { // String errorCode = apiResultData.getString("errorCode"); // // if (StringUtils.isNotBlank(errorCode) && ERROR_CODE_S0000.equals(errorCode)) { // result = apiResultData.getString("msgData"); // log.info("調用豐橋下訂單接口服務, msgData:{}", result); // } else if (StringUtils.isNotBlank(errorCode) && ERROR_CODE_8016.equals(errorCode)) { // // 重復下單邏輯處理 // result = queryOrder(sfOrderParam.getOrderId()); // } else { // return R.error(1000, apiResultData.getString("errorMsg")); // } // } else { // return R.error(1000, "調用豐橋下訂單接口服務異常"); // } // } else { // return R.error(1000, "調用豐橋下訂單接口服務異常"); // } // }log.info("調用豐橋下訂單接口服務結束, 出參:{}", result);System.out.println(result);return R.ok(JSONObject.parseObject(result)); // return R.ok().put("baseResponse",baseResponse);} catch (Exception e) {log.error("調用豐橋下訂單接口服務連接超時",e);// 連接超時異常return R.error(1000, e.getMessage());}}訂單結果查詢實現
public String queryOrder(String orderId) throws Exception {// 封裝數據Map params = new HashMap();String timeStamp = String.valueOf(System.currentTimeMillis());JSONObject jSONObjectParam = new JSONObject();jSONObjectParam.put("searchType", One);jSONObjectParam.put("language", LANGUAGE_ZHCN);jSONObjectParam.put("orderId", orderId);String msgData = JSONObject.toJSONString(jSONObjectParam);params.put("partnerID", sfClientCode);params.put("requestID", UUID.randomUUID().toString().replace("-", ""));params.put("serviceCode", EXP_RECE_SEARCH_ORDER_RESP);params.put("timestamp", timeStamp);params.put("msgData", msgData);params.put("msgDigest", CallExpressServiceTools.getMsgDigest(msgData, timeStamp, sfCheckWord));long startTime = System.currentTimeMillis();log.info("調用豐橋訂單結果查詢接口開始, 入參:{}, sfCallUrl:{}, sfClientCode:{}, sfCheckWord:{}" + (String) params.get("msgData"), sfCallUrl, sfClientCode, sfCheckWord);String result = "";try {result = HttpClientUtil.post(sfCallUrl, params);} catch (Exception e) {log.error("調用豐橋訂單結果查詢接口異常", e);}log.info("調用豐橋訂單結果查詢接口結束, 出參:{}", result);return result;}訂單確認修改/確認接口實現
@Override public R updateOrder(UpdateOrderRequest request) throws UnsupportedEncodingException {Map<String, String> params = new HashMap<String, String>();String timeStamp = String.valueOf(System.currentTimeMillis());String msgData = JSONObject.toJSONString(request);params.put("partnerID", sfClientCode);params.put("requestID", UUID.randomUUID().toString().replace("-", ""));params.put("serviceCode", EXP_RECE_UPDATE_ORDER);params.put("timestamp", timeStamp);params.put("msgData", msgData);params.put("msgDigest", CallExpressServiceTools.getMsgDigest(msgData, timeStamp, sfCheckWord));log.info("調用豐橋確認修改/確認接口開始, 入參:{}, sfCallUrl:{}, sfClientCode:{}, sfCheckWord:{}" + (String) params.get("msgData"), sfCallUrl, sfClientCode, sfCheckWord);String result = "";try {result = HttpClientUtil.post(sfCallUrl, params);} catch (Exception e) {log.error("調用豐橋確認修改/確認接口異常", e);}return R.ok(result); } public interface SfService {/*** 順豐豐橋下訂單服務接口** @param sfOrderParam* @return*/R createOrder(SfOrderParam sfOrderParam);//查詢訂單服務String queryOrder(String orderId)throws Exception;//取消訂單R updateOrder(UpdateOrderRequest request) throws UnsupportedEncodingException; }controller層
package com.plz.manager.sf.controller;import club.mrxiao.common.error.ExpressErrorException; import club.mrxiao.sf.bean.BaseResponse; import club.mrxiao.sf.bean.BaseResultData; import club.mrxiao.sf.bean.order.*; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.fasterxml.jackson.databind.ObjectMapper; import com.jd.open.api.sdk.domain.address.BaseAreaService.response.get.BaseAreaServiceResponse; import com.jd.open.api.sdk.internal.JSON.JSONMapper; import com.jd.security.spi.tdeclient.SpiTdeClient; import com.plz.manager.dal.dto.PlzCasesQueryDto; import com.plz.manager.dal.dto.QueryProjectDto; import com.plz.manager.dal.entity.PlzCases; import com.plz.manager.dal.entity.SfOrderEntity; import com.plz.manager.service.PlzCasesService; import com.plz.manager.service.SfOrderService; import com.plz.manager.sf.param.*; import com.plz.manager.sf.param.ContactInfo; import com.plz.manager.sf.service.CarrierWaybillRemoteService;import com.plz.manager.sf.service.SfService; import com.plz.manager.util.R; import com.plz.manager.util.StringUtil; import com.plz.manager.util.StringUtils; import lombok.extern.log4j.Log4j2; import org.apache.commons.collections4.CollectionUtils; import org.apache.http.StatusLine; import org.apache.ibatis.annotations.Case; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Reference; import org.springframework.web.bind.annotation.*;import java.io.DataInput; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List;/*** @author guoxinsong* @date 2021-01-21 13:23:01* @description 順豐豐橋回調Controller*/ @RequestMapping("/sf") @RestController @Log4j2 public class SfController {// @Autowired // private CarrierWaybillRemoteService carrierWaybillRemoteService;@Autowiredprivate SfService sfService;@Autowiredprivate SfOrderService sfOrderService;private PlzCasesService plzCasesService;// @Reference // private SfService sfService;private final String RETURN_CODE_FAILURE = "1000";private final String RETURN_MSG_FAILURE = "系統異常";private final String RETURN_CODE_SUCCESS = "0000";private final String RETURN_MSG_SUCCESS = "成功";@RequestMapping("/updateOrder")public R updateOrder(@RequestBody String json) throws IOException {Integer dealType = (Integer) JSONObject.parseObject(json).get("dealType");String orderId = JSONObject.parseObject(json).get("orderId").toString();if (2 == dealType) {//訂單取消,將數據庫中status字段修改為1QueryWrapper<SfOrderEntity> sfOrderEntityQueryWrapper = new QueryWrapper<>();QueryWrapper<SfOrderEntity> order_num = sfOrderEntityQueryWrapper.eq("order_num", orderId);SfOrderEntity one = sfOrderService.getOne(order_num);one.setStatus(1);sfOrderService.updateById(one);}JSONObject jsonObject = JSONObject.parseObject(json);JSONObject object = jsonObject.getJSONArray("waybillNoInfoList").getJSONObject(0);WaybillNoInfo waybillNoInfo = new WaybillNoInfo();Integer waybillType = (Integer) object.get("waybillType");waybillNoInfo.setWaybillType(waybillType);String waybillNo = (String) object.get("waybillNo");waybillNoInfo.setWaybillNo(waybillNo);ArrayList<WaybillNoInfo> waybillNoInfos = new ArrayList<>();waybillNoInfos.add(waybillNoInfo);UpdateOrderRequest build = UpdateOrderRequest.builder().dealType(dealType).orderId(orderId).waybillNoInfoList(waybillNoInfos).build();R r = sfService.updateOrder(build);return R.ok(r);}//下單接口@RequestMapping("/createOrder")public R createOrder(@RequestBody String json) throws IOException {ObjectMapper mapper = new ObjectMapper();SfOrderParam sfOrderParam = mapper.readValue(json, SfOrderParam.class);R r = sfService.createOrder(sfOrderParam);if (!ObjectUtil.isNotNull(r)) {return R.error("下單失敗");}//從返回的json對象中獲取對象并轉成字符串String apiResultData = r.get("apiResultData").toString();//再將字符串轉為對象JSONObject jsonObject = JSONObject.parseObject(apiResultData);//從json對象中獲取msgData對象 并轉成字符串String msgData = jsonObject.get("msgData").toString();//創建統一處理請求類BaseResponse baseResponse = new BaseResponse();baseResponse.setApiResultData(msgData);//從json對象中獲取對象并轉為CreateOrderResponse類CreateOrderResponse createOrderResponse = jsonObject.getObject("msgData", CreateOrderResponse.class);//從訂單響應中獲取訂單號String orderId = createOrderResponse.getOrderId();List<WaybillNoInfo> waybillNoInfoList = createOrderResponse.getWaybillNoInfoList();//獲取運單信息WaybillNoInfo waybillNoInfo = waybillNoInfoList.get(0);//創建寄件信息對象(數據庫入參開始)SfOrderEntity entity = new SfOrderEntity();List<ContactInfo> contactInfoList = sfOrderParam.getContactInfoList();//寄件人ContactInfo contactInfo = contactInfoList.get(0);//收件人ContactInfo contactInfo1 = contactInfoList.get(1);//寄件人信息,地址 姓名 手機號等entity.setSenderAddress(contactInfo.getAddress());entity.setSenderName(contactInfo.getContact());entity.setSenderMobile(contactInfo.getTel());//收件人人信息,地址 姓名 手機號等entity.setAddresseeName(contactInfo1.getContact());entity.setAddresseeAddress(contactInfo1.getAddress());entity.setAddresseeMobile(contactInfo1.getTel());//創建時間entity.setCreateTime(new Date());//訂單號存入數據庫entity.setOrderNum(orderId);//todo 根據caseid查詢所要發送的快遞entity.setCaseId(36);entity.setStatus(0);entity.setWaybillNo(waybillNoInfo.getWaybillNo());boolean save = sfOrderService.save(entity);System.out.println(save);return R.ok(r);}@RequestMapping("/queryOrder/{orderId}")public R queryOrder(@PathVariable String orderId) throws Exception {if (StringUtils.isEmpty(orderId)) {return R.error("訂單號不能為空");}String s = sfService.queryOrder(orderId);return R.ok(s);}/*** 順豐豐橋路由推送接口** @param sfRoutePushParam* @return*/@PostMapping("route/push")public JSONObject routePush(@RequestBody SfRoutePushParam sfRoutePushParam) {log.info("調用順豐豐橋路由推送接口,入參:{}", JSONObject.toJSONString(sfRoutePushParam));JSONObject jsonObject = new JSONObject();if (null == sfRoutePushParam) {jsonObject.put("return_code", RETURN_CODE_FAILURE);jsonObject.put("return_msg", RETURN_MSG_FAILURE);return jsonObject;}SfBodyParam sfBodyParam = sfRoutePushParam.getBody();if (sfBodyParam == null) {jsonObject.put("return_code", RETURN_CODE_FAILURE);jsonObject.put("return_msg", RETURN_MSG_FAILURE);return jsonObject;}List<WaybillRouteParam> WaybillRouteList = sfBodyParam.getWaybillRoute();if (CollectionUtils.isEmpty(WaybillRouteList)) {jsonObject.put("return_code", RETURN_CODE_FAILURE);jsonObject.put("return_msg", RETURN_MSG_FAILURE);return jsonObject;}for (WaybillRouteParam waybillRoute : WaybillRouteList) {SaveSfOrderStatusParam param = new SaveSfOrderStatusParam();param.setAcceptTime(waybillRoute.getAcceptTime());param.setCarrierOrderCode(waybillRoute.getOrderid());param.setRoutingNodeCode(waybillRoute.getOpCode());param.setRoutingNodeDesc(waybillRoute.getAcceptAddress());param.setWaybillNo(waybillRoute.getMailno());try { // carrierWaybillRemoteService.saveRoutingNode(param);} catch (Exception e) {log.info("調用順豐豐橋路由推送接口,保存路由信息異常", e);jsonObject.put("return_code", RETURN_CODE_FAILURE);jsonObject.put("return_msg", RETURN_MSG_FAILURE);return jsonObject;}}jsonObject.put("return_code", RETURN_CODE_SUCCESS);jsonObject.put("return_msg", RETURN_MSG_SUCCESS);return jsonObject;}// /** // * @param sfOrderParam // * @return // */ // @PostMapping("create/order") // public String createOrder(@RequestBody SfOrderParam sfOrderParam) { // RPCResult<String> rPCResult = sfService.createOrder(sfOrderParam); // Object object = rPCResult.getContent().getData(); // String result = ""; // // if (object != null) { // result = (String) object; // } // // return result; // }}因為我把具體要保存的數據 在控制層操作了
目前寫的只能操作json格式數據 需要進行優化
用到了大量的json轉對象、轉string 轉json對象
代碼看起來很多但是 實際上可以優化
下單請求:
 響應:
 
取消訂單請求:
 
響應:
主要是我一開始的思路錯了
返回數據太多 我就沒有頭緒 不知道怎么解決 后面想到了用這種簡單的json轉換的方式來實現業務
 工具包放在這里了
 工具以及相關代碼
 提取碼:1234
希望大家不要吝嗇自己的寶貴意見。
總結
 
                            
                        - 上一篇: 20 个最值得关注的 2019 互联网女
- 下一篇: AHU 数据结构 最短路径 安大地图版本
