方式:通过SDK调用API(开发者=>京东物流)
1.打开京东物流开放平台并登录(使用商家的京东账号),具有企业资质才能申请得到
京东文档介入指南:京东物流开放平台 (jdl.com)
使用第三方的 某某平台接口 都要在控制台创建应用,理解为一个账号,通过这个账号来使用平台提供的功能,创建完毕后我们可以得到 AppKey和AppSecret
京东有下单接口,查看物流信息,实时位置等接口,我们需要再控制台订阅对接方案
2.上面已经获取到了 AppKey和AppSecret现在还需要一个token。获取token有两种方式(1.简化模式 2.授权码模式)我们需要访问一个地址使用商家京东账户进行登录,登录后就可以获取到token了。这里使用的是简化模式。通过AppKey换取token(注:地址上换成你的appkey后进行访问登录,平台返回access token、refresh token(目前接口调用均使用access token)
获取token地址:https://oauth.jdl.com/oauth/authorize?client_id=YOUR_APP_KEY&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code
根据环境选择地址前缀
3.目前已经获取到了AppKey和AppSecret和access token了
4.下载JavaSDK。地址:京东物流开放平台 (jdl.com)
环境:需要依赖 Java SE/EE 1.8及以上
5.引入SDK,在类路径(resources)下创建lib文件夹,将两个jar包放入到文件夹中,并在maven中进行引入
引入到maven中
<dependency>
<groupId>com.example</groupId>
<artifactId>ECAP_3.0_20240823100912.jar</artifactId>
<version>3.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/ECAP_3.0_20240823100912.jar</systemPath>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>lop-opensdk-support-1.0.28-SNAPSHOT.jar</artifactId>
<version>1.0.28</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/lop-opensdk-support-1.0.28-SNAPSHOT.jar</systemPath>
</dependency>
6. 调用下单接口,获取订单号
京东下单接口官方文档地址:京东物流开放平台 (jdl.com) 需要进行阅读
注:下单和取消订单方法有效,其它还未测试,每个方法其实都是一样的一同百通
package com.mwj.auction.jingdong;
import com.lop.open.api.sdk.DefaultDomainApiClient;
import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCreateOrderV1.CommonCargoInfo;
import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCreateOrderV1.CommonCreateOrderRequest;
import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCreateOrderV1.CommonProductInfo;
import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCreateOrderV1.Contact;
import com.lop.open.api.sdk.domain.ECAP.CommonModifyCancelOrderApi.commonCancelOrderV1.CommonOrderCancelRequest;
import com.lop.open.api.sdk.domain.ECAP.CommonQueryOrderApi.commonGetOrderTraceV1.CommonOrderTraceRequest;
import com.lop.open.api.sdk.domain.ECAP.GeneralWaybillQueryApi.queryOrderInfoByCondition.OrderInfoQueryConditionDTO;
import com.lop.open.api.sdk.domain.ECAP.WaybillTrackAndTimePositionApi.getWaybillGisTrackByWaybillCode.WaybillDto;
import com.lop.open.api.sdk.plugin.LopPlugin;
import com.lop.open.api.sdk.plugin.factory.OAuth2PluginFactory;
import com.lop.open.api.sdk.request.ECAP.*;
import com.lop.open.api.sdk.response.ECAP.*;
import com.mwj.auction.pojo.Addres;
import com.mwj.auction.pojo.Good;
import com.mwj.auction.pojo.Orders;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
/**
* @author chenhonglong
* @ClassName JingDong
* 京东物流服务
* @since 2024/9/7 17:43
*/
//@Component
public class JingDong {
// 生产环境 使用这个地址
// public static String SERVER_URL = "https://api.jdl.com"; // 生产环境使用
// 开发环境
public static String APP_KEY = "你自己的";
public static String APP_SECRET = "你自己的";
public static String SERVER_URL = "https://test-api.jdl.com"; // 测试环境使用
public static String CUSTOMER_CODE = ""; // 客户编码
public static String ACCESS_TOKEN = "你自己的";
public static DefaultDomainApiClient client = new DefaultDomainApiClient(SERVER_URL,50000,150000);
// 京东物流下单,返回订单信息 EcapV1OrdersCreateLopRequest
public static EcapV1OrdersCreateLopResponse downOrder(Orders orders, Addres addres) throws Exception {
System.out.println(APP_KEY + " " + APP_SECRET + " " + SERVER_URL + " " + CUSTOMER_CODE + " " + ACCESS_TOKEN);
System.out.println("========================================");
//入参对象(请记得更换为自己要使用的接口入参对象)
EcapV1OrdersCreateLopRequest request = new EcapV1OrdersCreateLopRequest();
CommonCreateOrderRequest requestDTO = new CommonCreateOrderRequest();
requestDTO.setOrderId(orders.getOrderId()); // 订单号 长度有限制
//创建发货人和收货人
Contact senderContact = new Contact();
senderContact.setFullAddress("某某省......"); // 商家发货地址
senderContact.setName("杨无敌82级强攻系战魂斗罗"); // 发货人姓名
senderContact.setMobile("110..."); // 商家电话
Contact receiverContact = new Contact();//收件人地址
receiverContact.setFullAddress(addres.getEcon() + addres.getMark() + addres.getDist() + addres.getAddresInfo());
receiverContact.setName(addres.getName());
receiverContact.setMobile(addres.getPhone());
requestDTO.setReceiverContact(receiverContact);
requestDTO.setSenderContact(senderContact);
//产品信息:京东标快还是京东特快
CommonProductInfo commonProductInfo = new CommonProductInfo();
// commonProductInfo.setProductCode("ed-m-0001"); //京东标快 测试环境使用
requestDTO.setProductsReq(commonProductInfo);
//下单来源:
requestDTO.setOrderOrigin(1);//1:电商平台的商家(即京东物流的签约商家)发给C端用户的快递服务,或者企业发C端、B端,但重量(泡重比)小于30kg的业务
//客户编码 ,orderOrigin为 1 或者 2 时必填;orderOrigin为0时不要传此参数;与京东物流签约后生成,长度1-32
// 客户编码:C20240902756023 商家编码:010K3766118
// requestDTO.setCustomerCode("010K3766118");
requestDTO.setCustomerCode(CUSTOMER_CODE);
requestDTO.setSettleType(3);//设置付款方式,3为月结
//货品信息;寄递货物的基础信息,包括重量体积以及包裹的长宽高等
CommonCargoInfo commonCargoInfo = new CommonCargoInfo();
commonCargoInfo.setName("水果");
commonCargoInfo.setQuantity(orders.getNumber());//件数
commonCargoInfo.setWeight(new BigDecimal(2));
commonCargoInfo.setVolume(new BigDecimal(100));//体积,单位:cm³;必填;保留小数点后两位;必须大于0,
List<CommonCargoInfo> commonCargoInfos = Arrays.asList(commonCargoInfo);
requestDTO.setCargoes(commonCargoInfos);
request.setRequest(requestDTO);
LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(APP_KEY, APP_SECRET, ACCESS_TOKEN);
request.addLopPlugin(lopPlugin);
EcapV1OrdersCreateLopResponse response = client.execute(request);
// System.out.println("获取京东运单号===========》" + response.getResult().getData().getWaybillCode());
// System.out.println("获取运费======》" + response.getResult().getData().getFreightPre());
System.out.println("京东下单接口返回信息=========================》");
System.out.println(response.getMsg());
return response;
}
// 取消京东物流订单 EcapV1OrdersCancelLopRequest
/**
* @author 灰太狼
* @description TODO waybillCode
* @date 2024/9/9 20:52
*/
public static EcapV1OrdersCancelLopResponse cancelOrder(String WaybillCode) throws Exception {
System.out.println("取消京东物流订单");
System.out.println("========================================");
EcapV1OrdersCancelLopRequest request = new EcapV1OrdersCancelLopRequest();
CommonOrderCancelRequest requestDTO = new CommonOrderCancelRequest();
requestDTO.setWaybillCode(WaybillCode);
// requestDTO.setCustomerOrderId(ordersId); // 商家订单号
requestDTO.setOrderOrigin(1); // 下单来源 必填
requestDTO.setCustomerCode(CUSTOMER_CODE); // 客户编码,orderOrigin=1 时必填;与下单时使用的客户编码保持一致
requestDTO.setCancelReason("用户发起取消"); // 用户取消或者是超时取消 取消原因,商家自定义,字段长度1-30
requestDTO.setCancelReasonCode("1"); // 取消原因编码;枚举值:1-用户发起取消;2-超时未支付
requestDTO.setCancelType(1); // 枚举值:orderOrigin=0时此处传0;orderOrigin=1或2时此处传1
request.setRequest(requestDTO);
LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(APP_KEY, APP_SECRET, ACCESS_TOKEN);
request.addLopPlugin(lopPlugin);
EcapV1OrdersCancelLopResponse response = client.execute(request);
System.out.println("京东取消订单返回信息:");
System.out.println(response.getMsg());
return response;
}
/**
* @author 灰太狼
* @description TODO
* @date 2024/9/9 18:01
* 查询运单实时位置 EcapV1OrdersWaybillGisTrackLopRequest
* Query real-time location of orders
*
*/
public static EcapV1OrdersWaybillGisTrackLopResponse queryRealTimeLocationInformationOfOrders(String WaybillCode) throws Exception {
System.out.println("查询运单实时位置");
System.out.println("===================================");
EcapV1OrdersWaybillGisTrackLopRequest request = new EcapV1OrdersWaybillGisTrackLopRequest();
WaybillDto waybillDto = new WaybillDto();
waybillDto.setWaybillCode(WaybillCode); // 设置运单号,必填
waybillDto.setCustomerCode(CUSTOMER_CODE); // 商家编码(长度:1-32个字符),运单号要与商家编码保持一致
request.setWaybillDto(waybillDto);
LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(APP_KEY, APP_SECRET, ACCESS_TOKEN);
request.addLopPlugin(lopPlugin);
EcapV1OrdersWaybillGisTrackLopResponse response = client.execute(request);
System.out.println("京东物流 实时查询运单位置 返回信息:");
System.out.println(response.getMsg());
return response;
}
/**
* @author 灰太狼
* @description TODO
* @date 2024/9/10 10:32
* 查询运单预计送达时间 EcapV1OrdersInfoQueryLopRequest
* Query the estimated delivery time of the waybill
*/
public static EcapV1OrdersInfoQueryLopResponse queryTheEstimatedDeliveryTimeOfTheWaybill(String waybillCode) throws Exception {
System.out.println("查询运单预计送达时间");
System.out.println("===================================");
EcapV1OrdersInfoQueryLopRequest request = new EcapV1OrdersInfoQueryLopRequest();
OrderInfoQueryConditionDTO orderInfoQueryConditionDTO = new OrderInfoQueryConditionDTO();
orderInfoQueryConditionDTO.setCustomerCode(CUSTOMER_CODE); // 客户编码(好像是商家编码),长度1-32;收件人电话和客户编码至少一个有值
orderInfoQueryConditionDTO.setDeliveryId(waybillCode); // 设置运单号,必填
orderInfoQueryConditionDTO.setDynamicTimeFlag(1); // 动态时间标志,是否动态的根据京东物流的物流网络计算预计送达时间;0-获取非动态时间; 1 -获取动态时间
request.setOrderInfoQueryConditionDTO(orderInfoQueryConditionDTO);
LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(APP_KEY, APP_SECRET, ACCESS_TOKEN);
request.addLopPlugin(lopPlugin);
EcapV1OrdersInfoQueryLopResponse response = client.execute(request);
System.out.println("返回的时间" + response.getResult().getData().getDeliveryPromiseTime());
System.out.println("京东物流 查询运单预计送达时间 返回信息:");
System.out.println(response.getMsg());
return response;
}
/**
* @author 灰太狼
* @description TODO
* @date 2024/9/10 10:33
* 查询运单全程跟踪 EcapV1OrdersTraceQueryLopRequest
* Tracking the entire process of querying the waybill
*/
public static EcapV1OrdersTraceQueryLopResponse tackingTheEntireProcessOfQueryingTheWaybill(String waybillCode) throws Exception {
EcapV1OrdersTraceQueryLopRequest request = new EcapV1OrdersTraceQueryLopRequest();
CommonOrderTraceRequest commonOrderTraceRequest = new CommonOrderTraceRequest();
commonOrderTraceRequest.setWaybillCode(waybillCode); // 京东物流订单号,与京东物流运单号必填其一,订单号在下单接口中已返回
commonOrderTraceRequest.setCustomerCode(CUSTOMER_CODE);
commonOrderTraceRequest.setOrderOrigin(1); // 必填,下单来源; https://cloud.jdl.com/#/open-business-document/access-guide/267/54152
request.setCommonOrderTraceRequest(commonOrderTraceRequest);
LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(APP_KEY, APP_SECRET, ACCESS_TOKEN);
request.addLopPlugin(lopPlugin);
EcapV1OrdersTraceQueryLopResponse response = client.execute(request);
// System.out.println(response.getResult().getData().getTraceDetails());
System.out.println("京东物流 查询运单全程跟踪 返回信息:");
return response;
}
}
6.参数讲解官方接口文档讲:下单接口为 /ecap/v1/orders/create
官方提供的例子不是下单接口,因此我们并不知道该new哪个对象,所以根据路径可以在源码中查看进行new 哪个类。请求后响应类型也是这个道理,根据无非最后面的哪个request变成了response
所有:
下单接口:
EcapV1OrdersCreateLopRequest request = new EcapV1OrdersCreateLopRequest();
请求参数:
CommonCreateOrderRequest requestDTO = new CommonCreateOrderRequest();
requestDTO封装了所需要的请求参数,需要哪个进行设置。比如需要提交寄件信息,因此可以new 一个senderContact 设置完寄件信息后,最后使用requestDTO进行set一下,一层套一层,最后提交的就是requestDTO对象。
订单id:orderId 由我们自己生成
客户编码:customerCode 需要找商家或者京东客服
物品的长宽高随便设置,这个体积重量只是京东的一个参考,会以实际的京东物流上门计算的为准。
主产品编码:productCode
commonProductInfo.setProductCode("ed-m-0001"); //京东标快
根据商家属于哪种进行选择,如果错误会导致下单失败
参考地址:京东物流开放平台 (jdl.com)
因此重要参数讲解完毕,剩下的看京东参数文档。所有信息配置正确后调用下单方法,依然会报错,原因是 需要联系京东客户把你这功能开通就行了,之后下单成功生成订单号了
7.总结:springboot集成京东物流接口,完成信息自动化填写。系统下单,请求京东物流生成订单,京东物流派送员上门取件,运费自动从商家京东账户中扣除(下单后派送员没有上门取件是不会扣除商家京东账户中的钱)
8.京东物流也有测试环境,登录后到控制台中,有沙箱测试环境,调试等功能,可以进行物流查询。
沙箱地址:京东物流开放平台 (jdl.com)