SpringBoot集成京东物流

方式:通过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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值