java查询顺丰路由(物流详情)信息

(参考了 https://www.cnblogs.com/lihao1017/p/17361972.html 这篇文章)

最终返回的参数如图:
在这里插入图片描述
写一下自己的笔记~

1.先在“顺丰开放平台”注册账号并进行实名认证

顺丰开放平台:https://open.sf-express.com/
不会的还可以跟着教程去操作,非常详细
在这里插入图片描述
认证成功后可以得到 顾客编码、沙箱验证码、生产校验码:
在这里插入图片描述

2.去业务中心创建开发者应用并测试以及上线

在这里插入图片描述
创建自己的应用,然后点进去关联API
选择自己需要的API 这里我只需要查询物流的信息,于是只需要关联“路由查询接口”
在这里插入图片描述
然后点后面的“测试”,注意不要自己去点到那个测试页面进行测试,一定是从这里点进去!
在这里插入图片描述

测试的那个校验码就是你的沙箱校验码,请求参数就用它默认的参数不用改
参数就用它默认的参数,不用改

测试好了之后也要记得回到上面那个地方还要测试一遍,记得也是从后面那个测试按钮点进去,后面这一遍测试的校验码是生产校验码了
最后还要回到这个地方,点击“上线”,这样你的接口就可以用了
【!!!注意,如果没有点击上线的话,接口会报没有权限!】
上线之后是这样的:
在这里插入图片描述
至此,这里就配置好了,接下来准备自己的项目部分

3.下载SDK,然后将jar包导进自己的项目里

SDK下载地址:https://open.sf-express.com/developSupport/976720?activeIndex=399112
直接下载最新版本就行
然后打开下载下来的压缩包,点进去找到里面的jar包,导进自己的项目里
在这里插入图片描述
将jar包导进项目的方法可参考:https://blog.csdn.net/m0_73900214/article/details/131400180
这一步也可以替换成引入依赖:

        <!--顺丰-->
        <dependency>
            <groupId>com.sf.csim</groupId>
            <artifactId>SF-CSIM-EXPRESS-SDK</artifactId>
            <version>0.0.1</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/SF-CSIM-EXPRESS-SDK-V2.1.7.jar</systemPath>
        </dependency>

4.开始写代码

1.顺丰配置类

/**
 * @author 
 * @date 
 * @desc 顺丰快递 丰桥接口配置类
 */
@Data
public class ShunFengConfig {
    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";
}

2.核心业务代码

/**
     * 查询顺丰路由信息
     * @param id 顺丰快递单号
     * @param phone 收件人手机号后四位
     * @return
     * @throws UnsupportedEncodingException
     */
    public JSONObject sfRoutes(String id, String phone) throws UnsupportedEncodingException {
        IServiceCodeStandard standardService = ExpressServiceCodeEnum.EXP_RECE_SEARCH_ROUTES;//查路由

        // 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", ShunFengConfig.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", CallExpressServiceTools.getMsgDigest(msgData,timeStamp,ShunFengConfig.CHECK_WORD));

        long startTime = System.currentTimeMillis();

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

        log.debug("====调用丰桥的接口服务代码:" + (standardService.getCode()) + " 接口耗时:"+ (System.currentTimeMillis()-startTime)+"====");
        log.debug("===调用地址 ==="+ShunFengConfig.CALL_URL_PROD);
        log.debug("===顾客编码 ==="+ShunFengConfig.CLIENT_CODE);
        log.debug("===返回结果:" +result);
        JSONObject apiResultData = JSONUtil.parseObj(JSONUtil.parseObj(result).get("apiResultData"));
        if(!apiResultData.getBool("success")){
            throw new BizException(ResultStatus.Common.ERROR_ADD_FAIL);
        }
        JSONObject resultMsgData = JSONUtil.parseObj(apiResultData.get("msgData"));
        JSONArray routeResps = JSONUtil.parseArray(resultMsgData.get("routeResps"));
        JSONObject routeRespsObj = routeResps.getJSONObject(0);
        return routeRespsObj;
    }

3.接口调用

    @ApiOperation(value = "获取顺丰快递物流")
    @PostMapping("/sfRoutes")
    public JSONObject sfRoutes(@RequestBody QuerySfRoutesReq req) throws UnsupportedEncodingException {
        return service.sfRoutes(req.getTrackingNumber(), req.getPhone());
    }
@Data
public class QuerySfRoutesReq {

    @ApiModelProperty("快递单号")
    private String trackingNumber;
    @ApiModelProperty("手机号码后四位")
    private String phone;
}

4.测试
在这里插入图片描述
搞定!

好的,我可以为您提供一个使用Spring Boot对接顺丰开放平台查询物流路由信息的完整示例代码。这个示例包括基本的配置、请求发送和响应处理。 首先,我们需要在pom.xml中添加必要的依赖: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> </dependencies> ``` 接下来,我们创建一个配置类来存储顺丰开放平台的API信息: ```java @Configuration public class SfConfig { public static final String API_URL = "https://sfapi.sf-express.com/std/service"; public static final String CUSTOMER_ID = "YOUR_CUSTOMER_ID"; public static final String CHECK_WORD = "YOUR_CHECK_WORD"; public static final String LANGUAGE = "zh-CN"; } ``` 然后,我们创建一个服务类来处理与顺丰API的通信: ```java @Service public class SfService { @Autowired private RestTemplate restTemplate; public String queryRoute(String trackingNumber) throws Exception { Map<String, String> params = new HashMap<>(); params.put("method", "RouteService"); params.put("language", SfConfig.LANGUAGE); params.put("tracking_type", "1"); params.put("tracking_number", trackingNumber); params.put("customer_id", SfConfig.CUSTOMER_ID); params.put("checkword", SfConfig.CHECK_WORD); String requestBody = buildRequestBody(params); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_XML); HttpEntity<String> request = new HttpEntity<>(requestBody, headers); ResponseEntity<String> response = restTemplate.postForEntity(SfConfig.API_URL, request, String.class); if (response.getStatusCode() == HttpStatus.OK) { return parseResponse(response.getBody()); } else { throw new Exception("API请求失败: " + response.getStatusCode()); } } private String buildRequestBody(Map<String, String> params) { StringBuilder sb = new StringBuilder(); sb.append("<Request service=\"").append(params.get("method")).append("\">"); sb.append("<Head>").append(SfConfig.CUSTOMER_ID).append("</Head>"); sb.append("<Body>"); sb.append("<RouteRequest>"); sb.append("<TrackingType>").append(params.get("tracking_type")).append("</TrackingType>"); sb.append("<TrackingNumber>").append(params.get("tracking_number")).append("</TrackingNumber>"); sb.append("</RouteRequest>"); sb.append("</Body>"); sb.append("</Request>"); return sb.toString(); } private String parseResponse(String responseBody) { // 简单的XML解析逻辑 String status = responseBody.split("<ResponseStatusCode>")[1].split("</ResponseStatusCode>")[0]; if ("0".equals(status)) { StringBuilder sb = new StringBuilder(); String[] routes = responseBody.split("<Route>"); for (String route : routes) { if (route.contains("<AcceptStation>")) { String description = route.split("<AcceptStation>")[1].split("</AcceptStation>")[0]; sb.append(description).append("\n"); } } return sb.toString(); } else { return "查询失败: " + status; } } } ``` 最后,我们创建一个控制器来处理HTTP请求: ```java @RestController public class SfController { @Autowired private SfService sfService; @GetMapping("/queryRoute") public String queryRoute(@RequestParam String trackingNumber) { try { return sfService.queryRoute(trackingNumber); } catch (Exception e) { return "查询失败: " + e.getMessage(); } } } ``` 这个示例提供了一个基本的实现,包括: 1. 使用Spring Boot的RestTemplate发送HTTP请求 2. 构建XML格式的请求体 3. 发送请求到顺丰API 4. 解析XML格式的响应 5. 提供一个HTTP接口来触发查询 请注意,这只是一个基本的实现。在实际应用中,你可能需要: 1. 添加更多的错误处理和异常捕获 2. 使用更健壮的XML解析方法(如使用JAXB或DOM解析器) 3. 实现缓存机制以减少API调用次数 4. 添加日志记录 5. 实现更复杂的业务逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值