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

对接顺丰快递是通过丰桥api实现的,首先需要到顺丰开放平台注册一个账号。

网址如下,大家自行注册:顺丰开放平台

java 顺丰面单模板 顺丰快递模块_接口服务

注册成功以后点击控制台选择开发者对接

java 顺丰面单模板 顺丰快递模块_接口服务_02

java 顺丰面单模板 顺丰快递模块_接口服务_03

第一次进来是需要创建一个自己的应用的具体的细节可以参考一下文档,我这边就不在进行讲解了:顺丰开放平台

因为我这边用到的是查物流状态和预计派送信息所以就只签约了这些。其它的对接起来都是差不多的,只是传入的参数和返回的值不一样,你们只需要根据要求传参和接收对应返回值即可。我这边就直接上代码咯。

java 顺丰面单模板 顺丰快递模块_接口服务_04

 

 一、下载SDK

目前官方提供SDK只有jar包,不知道是不是因为我还没有找到,官方的SDK文档如下:顺丰开放平台

java 顺丰面单模板 顺丰快递模块_接口服务_05

将下载好的项目里面的jar导入到自己的项目里面。如果是boot项目大家可以把jar发布到自己的本地仓库里面 

二、顺丰配置类

/**
 * @author lihao
 * @create 2023-03-01 13:29
 * @desc 顺丰快递 丰桥接口配置类
 **/
@Data
public class ShunFenConfig {

    public static String CLIENT_CODE = "";  //此处替换为您在丰桥平台获取的顾客编码
    public static String CHECK_WORD = "";//生产校验码
    public static String CHECK_WORD_BOX = "";//沙箱校验码



    //沙箱环境的地址 -PRO
    public static String CALL_URL_BOX = "https://sfapi-sbox.sf-express.com/std/service";
    //生产环境的地址 -PRO
    public static String CALL_URL_PROD = "https://sfapi.sf-express.com/std/service";

}

三、核心业务代码

/**
* 查询顺丰路由信息
* @param id 顺丰快递单号
* @param phone 收件人手机号后四位
* @return
* @throws UnsupportedEncodingException
*/
private JSONObject sfRoutes(String id,String phone) throws UnsupportedEncodingException{
        //IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_ORDER; //下订单
        //	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_SEARCH_ORDER_RESP; //查订单
        //  IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_UPDATE_ORDER;//订单取消
        // 	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_FILTER_ORDER_BSP;//订单筛选
        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_SEARCH_ROUTES;//查路由
        //	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_GET_SUB_MAILNO;//子单号
        //	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_QUERY_SFWAYBILL;//查运费
        //	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_REGISTER_ROUTE;//注册路由
        //	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CREATE_REVERSE_ORDER;//退货下单
        //	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_CANCEL_REVERSE_ORDER;//退货消单
        //	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_WANTED_INTERCEPT;//截单转寄
        // 	IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_QUERY_DELIVERTM;//时效标准及价格查询
        //  IServiceCodeStandard standardService = ExpressServiceCodeEnum.COM_RECE_CLOUD_PRINT_WAYBILLS;//面单打印
        //  IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_UPLOAD_ROUTE;//路由上传
        //   IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_SEARCH_PROMITM;//预计派送时间查询
        //  IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_EXCE_CHECK_PICKUP_TIME;//揽件服务时间查询
        //  IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_VALIDATE_WAYBILLNO;//运单号合法性校验

        CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
        // set common header
        Map<String, String> params = new HashMap<String, String>();
        String timeStamp = String.valueOf(System.currentTimeMillis());
        String msgData ="{\"trackingType\":1,\"trackingNumber\":[\""+id+"\"],\"checkPhoneNo\":\""+phone+"\"}";//无月结卡号通过运单和手机后4位即可
        params.put("partnerID", ShunFenConfig.CLIENT_CODE);  // 顾客编码 ,对应丰桥上获取的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,ShunFenConfig.CHECK_WORD));

        long startTime = System.currentTimeMillis();

        log.debug("====调用实际请求:" + params);
        String result = HttpClientUtil.post(ShunFenConfig.CALL_URL_PROD, params);

        log.debug("====调用丰桥的接口服务代码:" + (standardService.getCode()) + " 接口耗时:"+ (System.currentTimeMillis()-startTime)+"====");
        log.debug("===调用地址 ==="+ShunFenConfig.CALL_URL_PROD);
        log.debug("===顾客编码 ==="+ShunFenConfig.CLIENT_CODE);
        log.debug("===返回结果:" +result);
        JSONObject apiResultData =JSONObject.parseObject(JSONObject.parseObject(result).getString("apiResultData"));
        if(!apiResultData.getBoolean("success")){
            throw new CommonException(apiResultData.getString("errorMsg"));
        }
        JSONObject resultMsgData = JSONObject.parseObject(apiResultData.getString("msgData"));
        JSONArray routeResps = JSONArray.parseArray(resultMsgData.getString("routeResps"));
        JSONObject routeRespsObj = routeResps.getJSONObject(0);
        return routeRespsObj;
    }
/**
* 查询顺丰快递预计派送时间
* @param id 顺丰快递单号
* @param phone 手机后四位
* @return
*/
private String arrivalTime(String id,String phone) throws UnsupportedEncodingException {
        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_SEARCH_PROMITM;//预计派送时间查询
        CallExpressServiceTools tools=CallExpressServiceTools.getInstance();
        // set common header
        Map<String, String> params = new HashMap<String, String>();
        String timeStamp = String.valueOf(System.currentTimeMillis());
        String msgData ="{\"searchNo\":\""+id+"\",\"checkType\":1,\"checkNos\":[\""+phone+"\"]}";//无月结卡号通过运单和手机号
        params.put("partnerID", ShunFenConfig.CLIENT_CODE);  // 顾客编码 ,对应丰桥上获取的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,ShunFenConfig.CHECK_WORD));

        long startTime = System.currentTimeMillis();

        log.debug("====调用实际请求:" + params);
        String result = HttpClientUtil.post(ShunFenConfig.CALL_URL_PROD, params);

        log.debug("====调用丰桥的接口服务代码:" + (standardService.getCode()) + " 接口耗时:"+ (System.currentTimeMillis()-startTime)+"====");
        log.debug("===调用地址 ==="+ShunFenConfig.CALL_URL_PROD);
        log.debug("===顾客编码 ==="+ShunFenConfig.CLIENT_CODE);
        log.debug("===返回结果:" +result);
        JSONObject apiResultData =JSONObject.parseObject(JSONObject.parseObject(result).getString("apiResultData"));
        if(!apiResultData.getBoolean("success")){
            log.debug(apiResultData.getString("errorMsg"));
            return "";
        }
        JSONObject resultMsgData = JSONObject.parseObject(apiResultData.getString("msgData"));
        String promiseTm = resultMsgData.getString("promiseTm");
        return promiseTm;
    }