顺丰接口查询快递

根据订单号和手机号查询物流信息

引入顺丰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;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值