对接京东快递查询物流信息
对接京东快递查询物流信息
[
VibeCoding·九月创作之星挑战赛
10w+人浏览
2.2k人参与
](
)
京东快递查询物流轨迹信息的API在2025-04-29的时候更新过,我这里使用的新的接口
通过对接方案编码可以判断,之前是ECAP,现在改为了Tracking_JD
前期准备
京东物流开放平台账号并通过企业认证
第一个ISV是相对比较好认证的,我使用的就是这个
有与京东物流签约的账号(京东物流的销售开通的账号(不是物流开放平台的账号))
这个我不太清楚怎么签约,这应该是你们公司有这个账号,跟负责这个功能的岗位的人要账号就行
这个账号一定要有,否则查不出物流信息
开放平台操作
创建应用
登录京东物流开放平台后应用管理➡️创建应用➡️ISV应用,输入应用名称、应用描述,确定之后就创建成功了,过几秒会自动跳转到对接方案界面
我们点击订阅新的对接方案,找到京东物流标准轨迹服务➡️申请使用
申请之后订阅状态先在审批状态,过一会就审批通过变成订阅成功,就可以使用了
点击对接文档,选择开发工具,再选择京东物流轨迹查询通用接口,我们可以在这里使用API测试工具进行测试
这里需要填写一些必要的参数,我一一说明一下
AppKey和AppSecret在应用详情中查看
AccessToken通过点击应用详情中的授权链接登录签约账号获取,获取后会给你一个access_token和refresh_token
access_token有效期为1年,refresh_token有效期为1年1个月,在refresh_token有效期内,
- access_token临过期超过10天,调用刷新接口会固定返回原来的access_token 和 refresh_token,也就是说没有效果;
- access_token临过期10天内,调用刷新接口可以延长1年原有access_token有效期,并生成新的有效期为1年1个月的refresh_token,原refresh_token失效。
- 调用接口的完整代码在 最下面
referenceNumber:京东物流单号
referenceType:单号类型,填固定值20000就行
phone:快递发送方或接收方的手机号后四位
都填好之后点击发起测试,就会调用接口查询出物流信息,code返回1000即为成功
api测试工具没问题了之后点击旁边的代码示例,里面有现成的代码,可以直接用。当然也可以自己写,因为本质上就是请求一个接口,把参数组装好就行
自行编写代码
下面这个是我根据官方的示例代码简化的,因为我当时对接的时候不止是京东,还有顺丰和德邦,用已经封装好的方法会比较好写好维护
使用前记得先引入hutool依赖
<!--hutool工具类--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.11</version> </dependency>
ExpressConstants是存放静态常量的一个类,自行编写即可
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.erp.common.constant.ExpressConstants;
import org.apache.commons.codec.binary.Hex;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.time.OffsetTime;
import java.util.*;
/**
* 查询京东物流路由信息
* @param expressNum
* @return
*/
private String queryJDExpress(String expressNum,String phoneNumber) throws IOException, GeneralSecurityException {
//按照API要求放置参数
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> json = new HashMap<>();
json.put("referenceNumber",expressNum);
json.put("referenceType","20000");
json.put("phone",phoneNumber);
list.add(json);
String body = JSONUtil.toJsonStr(list);
String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());DateUtils.getTime();
String content = String.join("", new String[]{
ExpressConstants.JD_APP_SECRET,
"access_token", ExpressConstants.JD_ACCESS_TOKEN,
"app_key", ExpressConstants.JD_APP_KEY,
"method", ExpressConstants.JD_QUERY_URL,
"param_json", body,
"timestamp", timestamp,
"v", "2.0",
ExpressConstants.JD_APP_SECRET});
//md5加密签名 并转为十六进制字符串
String sign = Hex.encodeHexString(MessageDigest.getInstance("md5").digest(content.getBytes(StandardCharsets.UTF_8)));
String uri = ExpressConstants.JD_CALL_URL_PROD + ExpressConstants.JD_QUERY_URL;
Map<String, String> query = new HashMap<>();
query.put("LOP-DN", ExpressConstants.JD_DOCKING_CODE);
query.put("access_token", ExpressConstants.JD_ACCESS_TOKEN);
query.put("app_key", ExpressConstants.JD_APP_KEY);
query.put("timestamp", timestamp);
query.put("v", "2.0");
query.put("sign", sign);
query.put("algorithm", "md5-salt");
//在路径上拼接参数
StringBuilder stringBuilder = new StringBuilder();
boolean first = true;
for (Map.Entry<String, String> entry : query.entrySet()) {
if (!first) {
stringBuilder.append("&");
} else {
first = false;
}
stringBuilder.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.name()));
}
String url = uri + "?" + stringBuilder;
HttpRequest request = HttpUtil.createPost(url);
int offset = OffsetTime.now().getOffset().getTotalSeconds() / 3600;
Map<String, String> headers = new HashMap<>();
//lop-tz代表时区,为接口调用当地的时区;删去后默认为东八区
//headers.put("lop-tz", String.valueOf(offset));
//用于开放平台识别客户调用API方式,客户无需修改/
headers.put("User-Agent", "lop-http/java");
headers.put("content-type", "application/json;charset=utf-8");
request.addHeaders(headers);
request.body(body);
String result = request.execute().body();
System.out.println("result = " + result);
return result;
}
ExpressConstants.java
public class ExpressConstants
{
/**京东APPKEY——zmq*/
public static final String JD_APP_KEY = "";
/**京东APPSECRET*/
public static final String JD_APP_SECRET = "";
/**京东ACCESSTOKEN*/
public static final String JD_ACCESS_TOKEN = "";
/**京东对接方案编码*/
//public static final String JD_DOCKING_CODE = "ECAP";
public static final String JD_DOCKING_CODE = "Tracking_JD"; //2025-04-29 京东接口修改,原接口不再维护
/**京东查询路由接口地址*/
//public static final String JD_QUERY_URL = "/ecap/v1/orders/trace/query";
public static final String JD_QUERY_URL = "/jd/tracking/query"; //2025-04-29 京东接口修改,原接口不再维护
/**京东预发环境的地址 -PRO*/
public static final String JD_CALL_URL_BOX = "https://uat-api.jdl.com";
/**京东生产环境的地址 -PRO*/
public static final String JD_CALL_URL_PROD = "https://api.jdl.com";
}
有需要云服务器的小伙伴推荐使用
以及
,都很实惠,适合长期使用
另外,欢迎来我的博客——