根据订单号和手机号查询物流信息
引入顺丰sdk
##代码实现
package com.ezeyc.edpbfqz.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ezeyc.edpalipay.constant.WuliuStatus;
import com.ezeyc.edpbfqz.common.exc.BizException;
import com.ezeyc.edpbfqz.model.BfqzOrder;
import com.ezeyc.edpbfqz.vo.BfqzLogistics;
import com.ezeyc.edpbfqz.vo.Route;
import com.sf.csim.express.service.CallExpressServiceTools;
import com.sf.csim.express.service.HttpClientUtil;
import com.sf.csim.express.service.IServiceCodeStandard;
import com.sf.csim.express.service.code.ExpressServiceCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import java.io.UnsupportedEncodingException;
import java.util.*;
@Slf4j
public class CallExpressNewAPIUtil {
//生产环境的地址 -PRO
private static final String CALL_URL_PROD = "https://sfapi.sf-express.com/std/service";
//返回描述语语言 0:中文 1:英文 2:繁体
private static final String LANGUAGE = "0";
//根据顺丰运单号查询,trackingNumber将被当作顺丰运单号处理
private static final String TRACKINGTYPE = "1";
//trackingType=1,则此值为顺丰运单号
private static final String METHODTYPE = "1";
public static BfqzLogistics getRouteList(BfqzOrder order, String clientCode, String checkWord) {
String WuliuNumber = order.getWuliuNumber();
String userPhone = order.getUserPhone();
log.info("getRouteList ====》》快递查询一开始,快递单号是{}", new Object[]{WuliuNumber});
//查路由
IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_SEARCH_ROUTES;
CallExpressServiceTools tools = CallExpressServiceTools.getInstance();
Map<String, String> params = new HashMap<String, String>();
//封装查询msgData数据
Map<String, Object> map = new HashMap<>();
List<String> list = new ArrayList();
list.add(WuliuNumber);
map.put("language", LANGUAGE);
map.put("trackingType", TRACKINGTYPE);
map.put("methodType", METHODTYPE);
map.put("trackingNumber", list);
map.put("checkPhoneNo", userPhone.substring(userPhone.length() - 4));
String msgData = JSONObject.toJSONString(map);
//创建返回对象
BfqzLogistics bfzLogistics = new BfqzLogistics();
String result = "";
try {
//获取时间
String timeStamp = String.valueOf(System.currentTimeMillis());
params.put("partnerID", clientCode); // 顾客编码 ,对应丰桥上获取的clientCode
params.put("requestID", UUID.randomUUID().toString().replace("-", ""));
params.put("serviceCode", standardService.getCode());// 接口服务码
params.put("timestamp", timeStamp);
params.put("msgData", msgData);
params.put("msgDigest", tools.getMsgDigest(msgData, timeStamp, checkWord));
//执行结果,获取结果
result = HttpClientUtil.post(CALL_URL_PROD, params);
JSONObject responseData = JSONObject.parseObject(result);
if (null == responseData) {
return null;
}
JSONObject apiResultData = responseData.getJSONObject(WuliuStatus.APIRESULTDATA);
if (null == apiResultData) {
return null;
}
if (WuliuStatus.S0000.equals(String.valueOf(apiResultData.get(WuliuStatus.ERRORCODE)))) {
// 获取物流结果
JSONObject jsonObject = JSONObject.parseObject(result).getJSONObject(WuliuStatus.APIRESULTDATA).getJSONObject(WuliuStatus.MSGDATA);
if (null == jsonObject) {
return null;
}
JSONArray responseArray = jsonObject.getJSONArray(WuliuStatus.ROUTERESPS);
if (null == responseData) {
return null;
}
JSONArray routeResps = responseArray.getJSONObject(0).getJSONArray(WuliuStatus.ROUTES);
//将获取物流json转化为list
List<Route> routeList = routeResps.toJavaList(Route.class);
if (CollectionUtils.isEmpty(routeList)) {
return null;
}
List newRoutes = new ArrayList();
int size = routeResps.size();
for (int i = 0; i < routeList.size(); i++) {
newRoutes.add(routeResps.get(size-i-1));
}
String bodyString = String.valueOf(newRoutes);
for (Route route : routeList) {
if (WuliuStatus.SUCCESS.equals(route.getOpCode())) {
String body = route.getRemark();
int start = body.indexOf(WuliuStatus.SHUNFENG_COURIERNAME_STA);
int end = body.indexOf(WuliuStatus.SHUNFENG_COURIERNAME_END);
String courierName = "";
if (-1 != start && -1 != end) {
courierName = body.substring(start + 4, end);
}
log.info("getRouteList ====》》快递员的名字{}", new Object[]{courierName});
int indexOf = body.indexOf(WuliuStatus.SHUNFENG_PHONE);
String courierPhone = "";
if (-1 != indexOf) {
courierPhone = body.substring(indexOf + 3, indexOf + 14);
}
log.info("getRouteList ====》》快递员的电话{}", new Object[]{courierPhone});
bfzLogistics.setWuliuStatus(route.getOpCode());
bfzLogistics.setUserPhone(userPhone);
bfzLogistics.setBody(bodyString);
bfzLogistics.setCourierPhone(courierPhone);
bfzLogistics.setCourierName(courierName);
bfzLogistics.setDetail(order.getDetail());
bfzLogistics.setOrderId(order.getId());
bfzLogistics.setWuliuNumber(order.getWuliuNumber());
bfzLogistics.setWuliuName(order.getWuliuName());
return bfzLogistics;
}
}
Route route = routeList.get(routeList.size() - 1);
if (!WuliuStatus.SUCCESS.equals(route.getOpCode()) && !WuliuStatus.SUCCESS_LOOK.equals(route.getOpCode())) {
String body = route.getRemark();
int start = body.indexOf(WuliuStatus.SHUNFENG_COURIERNAME_STA);
int end = body.indexOf(WuliuStatus.SHUNFENG_COURIERNAME_END);
String courierName = "";
if (-1 != start && -1 != end) {
courierName = body.substring(start + 4, end);
}
int indexOf = body.indexOf(WuliuStatus.SHUNFENG_PHONE);
String courierPhone = "";
if (-1 != indexOf) {
courierPhone = body.substring(indexOf + 3, indexOf + 14);
}
bfzLogistics.setWuliuStatus(route.getOpCode());
bfzLogistics.setUserPhone(order.getUserPhone());
bfzLogistics.setBody(bodyString);
bfzLogistics.setCourierPhone(courierPhone);
bfzLogistics.setCourierName(courierName);
bfzLogistics.setDetail(order.getDetail());
bfzLogistics.setOrderId(order.getId());
bfzLogistics.setWuliuNumber(order.getWuliuNumber());
bfzLogistics.setWuliuName(order.getWuliuName());
return bfzLogistics;
} else {
throw new BizException(String.valueOf(apiResultData.get(WuliuStatus.ERRORMSG)));
}
}
} catch (UnsupportedEncodingException e) {
log.error("物流json解析错误", e.getMessage());
}
return bfzLogistics;
}