java接入顺丰&京东物流教程

公司新需求,需要在web端发货时同时下单京东或者顺丰,在实现功能以后在这记录。

一、京东

京东物流开放平台,点击进入京东物流开放平台,注册自己的账号。然后进入控制台。

点击创建第一个应用

京东是需要认证的,我找了一圈没有找个个人测试的demo,只适合商家或者公司,这里我选择的是

然后进行认证:

提交之后等待审核即可,一般几分钟就好了,然后我创建了我的第一个项目:

接下来我们关联我们需要调用的API:点击管理再点击对接方案,再点击右侧的订阅

 选择需要的API,我需要的是下单,所以选择“京东快递快运”这个方案

订阅完成之后返回点击对接文档我们去查看API文档,看个大概之后先把SDK下载下来,也就是需要的jar包:京东物流开放平台

需要下载两个jar包,

然后我们把jar包安装到我们的本地仓库,

步骤如下:

在下载的jar包的目录下进入命令行,

然后执行命令:

mvn install:install-file -Dfile=下载jar包的绝对路径.jar -DgroupId=com.jd -DartifactId=依赖名称 -Dversion=依赖版本 -Dpackaging=jar
DgroupId、DartifactId、Dversion都是可以任意指定的,只要自己记得住就行且不能重复。

需要注意的是,执行这个命令,他会把这个依赖安装到我们本地的maven配置的安装目录下,这个在安装maven时一般都配置过,他在maven的conf目录下的setting.xml文件下,是这个标签:

  <localRepository>C:\javaAbout\Maven\repository</localRepository>

然后在idea中导入这两个jar包:

    <dependency>
          <groupId>com.jd</groupId>
          <artifactId>lop-opensdk-support</artifactId>
          <version>1.0.28</version>
      </dependency>

      <dependency>
          <groupId>com.jd</groupId>
          <artifactId>EcapSDK</artifactId>
          <type>jar</type>
          <version>1.0.0</version>
      </dependency>

接下来就可以编写创建订单方法了,

我把我的代码先贴出来,然后一步一步将讲解

package com.xinbiao.commons;

import com.alibaba.fastjson.JSONObject;
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.plugin.LopPlugin;
import com.lop.open.api.sdk.plugin.factory.OAuth2PluginFactory;
import com.lop.open.api.sdk.request.ECAP.EcapV1OrdersCreateLopRequest;
import com.lop.open.api.sdk.response.ECAP.EcapV1OrdersCreateLopResponse;
import com.xinbiao.controller.param.AllocateFacilityAndOtherPartParam;
import com.xinbiao.exception.XBException;
import com.xinbiao.model.AddressInfo;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;

public class JDUtil {
    //沙箱环境的地址的创建订单地址
    private static String CALL_URL_BOX="https://uat-api.jdl.com/ecap/v1/orders/create";
    //生产环境的地址
    private static String CALL_URL_PROD = "https://api.jdl.com/ecap/v1/orders/create";

//    appkey及appsecret生产环境和预发环境均通用
    //应用id
    private static String appKey = "";
    //AppSecret
    private static String AppSecret= "";
    private static String accessToken= "";

    //DefaultDomainApiClient对象全局只需要创建一次
    private static DefaultDomainApiClient client = new DefaultDomainApiClient("https://uat-api.jdl.com",500,15000);

    public static String JDCreateOrder(AllocateFacilityAndOtherPartParam param, Long id, AddressInfo addressInfo){
        try {
            //入参对象(请记得更换为自己要使用的接口入参对象)
            EcapV1OrdersCreateLopRequest request = new EcapV1OrdersCreateLopRequest();
            CommonCreateOrderRequest requestDTO = new CommonCreateOrderRequest();
            requestDTO.setOrderId(String.valueOf(UUID.randomUUID()));

//             创建指定的 LocalDateTime 对象,用于预定上门取件时间
//            LocalDateTime localDateTime = LocalDateTime.of(2024, 6, 1, 10, 0, 0);
//            // 转换为 Date 对象
//            Date specifiedDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
//            // 创建指定的 LocalDateTime 对象
//            LocalDateTime end = LocalDateTime.of(2024, 6, 1, 12, 0, 0);
//            // 转换为 Date 对象
//            Date endTime = Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
//            requestDTO.setPickupStartTime(specifiedDate);
//            requestDTO.setPickupEndTime(endTime);

            //创建发货人和收货人
            Contact senderContact  = new Contact();

            senderContact.setFullAddress(addressInfo.getSendAddress());
            senderContact.setName(addressInfo.getSendName());
            senderContact.setMobile(addressInfo.getSendPhone());

            Contact receiverContact = new Contact();//收件人地址
            receiverContact.setFullAddress(param.getAddress());
            receiverContact.setName(param.getHospitalContacts());
            receiverContact.setMobile(param.getHospitalContactsPhone());
            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
            requestDTO.setCustomerCode("");
            requestDTO.setSettleType(3);//设置付款方式,3为月结
            //货品信息;寄递货物的基础信息,包括重量体积以及包裹的长宽高等
            CommonCargoInfo commonCargoInfo = new CommonCargoInfo();
            commonCargoInfo.setName("电子产品");
            commonCargoInfo.setQuantity(1);//件数
            commonCargoInfo.setWeight(new BigDecimal(param.getWeight()));//重量
            BigDecimal multiply = new BigDecimal(param.getLength())
                    .multiply(new BigDecimal(param.getWeight()))
                    .multiply(new BigDecimal(param.getHigh()))
                    .setScale(2, BigDecimal.ROUND_HALF_UP);
            commonCargoInfo.setVolume(multiply);//体积,单位:cm³;必填;保留小数点后两位;必须大于0,
            List<CommonCargoInfo> commonCargoInfos = Arrays.asList(commonCargoInfo);
            requestDTO.setCargoes(commonCargoInfos);

            request.setRequest(requestDTO);

            LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(appKey, AppSecret,accessToken);
            request.addLopPlugin(lopPlugin);

            EcapV1OrdersCreateLopResponse response = client.execute(request);
            System.out.println("京东下单接口返回信息:");
            System.out.println(response.getMsg());

            return response.getMsg();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

}

先回到下单接口的官方文档,有这样几个重点:

可以看到,绑定我们请求参数的对象是

CommonCreateOrderRequest,他在这个包下:
import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCreateOrderV1.CommonCreateOrderRequest;

有一个同名类,注意不要导错了,然后我们接着看官方文档,它把必选参数都进行标注了,我们根据他给定的类型进行创建,然后绑定到CommonCreateOrderRequest对象即可,比如

寄件人和收件人信息,都是Contact对象,我们分别进行创建即可,然后再看最左侧参数名称,分别是sendercontact、receiverContact,他们就是CommonCreateOrderRequest的两个属性,于是我们就可以使用这个对象的set方法将寄件人和收件人信息绑定上去:

//创建发货人和收货人
                Contact senderContact  = new Contact();
            senderContact.setFullAddress(addressInfo.getSendAddress());
            senderContact.setName(addressInfo.getSendName());
            senderContact.setMobile(addressInfo.getSendPhone());

            Contact receiverContact = new Contact();//收件人地址
            receiverContact.setFullAddress(param.getAddress());
            receiverContact.setName(param.getHospitalContacts());
            receiverContact.setMobile(param.getHospitalContactsPhone());
            requestDTO.setReceiverContact(receiverContact);
            requestDTO.setSenderContact(senderContact);

依此类推,把必选参数都创建并绑定到请求对象CommonCreateOrderRequest上就可以了

当我们请求参数都准备好了吗,就可以想怎么发请求了,但是此时我们是少了很多东西的,比如校验码等,怎么发请求等,所有我们现在去翻他的官方文档,找他给出的demo,就知道了,

我直接把地址贴出来了,就不带着大家一步一步找了:京东物流开放平台

import com.lop.open.api.sdk.DefaultDomainApiClient;
import com.lop.open.api.sdk.LopException;
import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCheckPreCreateOrderV1.CommonCreateOrderRequest;
import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCheckPreCreateOrderV1.CommonProductInfo;
import com.lop.open.api.sdk.domain.ECAP.CommonCreateOrderApi.commonCheckPreCreateOrderV1.Contact;
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.EcapV1OrdersPrecheckLopRequest;
import com.lop.open.api.sdk.response.ECAP.EcapV1OrdersPrecheckLopResponse;

public class preCheck {
    public static void main(String[] args) {

            //示例为调用京东快递下单前置校验接口
        try {

            //设置接口域名(有的对接方案同时支持生产和沙箱环境,有的仅支持生产,具体以对接方案中的【API文档-请求地址】为准),生产域名:https://api.jdl.com 预发环境域名:https://uat-api.jdl.com
            //DefaultDomainApiClient对象全局只需要创建一次
            DefaultDomainApiClient client = new DefaultDomainApiClient("https://api.jdl.com",500,15000);
  
            //入参对象(请记得更换为自己要使用的接口入参对象)
            EcapV1OrdersPrecheckLopRequest request = new EcapV1OrdersPrecheckLopRequest();
  
            //设置入参(请记得更换为自己要使用的接口入参)
            Contact senderContact  = new Contact();
            senderContact.setFullAddress("河北省廊坊市广阳区万庄镇中心小学");
            Contact receiverContact = new Contact();
            receiverContact.setFullAddress("河北省廊坊市广阳区万庄镇中心小学");
            CommonCreateOrderRequest requestDTO = new  CommonCreateOrderRequest();
            requestDTO.setOrderOrigin(1);
            requestDTO.setCustomerCode("010K****20");
            CommonProductInfo productInfo = new CommonProductInfo();
            productInfo.setProductCode("ed-m-0001");
            requestDTO.setProductsReq(productInfo);
            requestDTO.setReceiverContact(receiverContact);
            requestDTO.setSenderContact(senderContact);
            request.setRequest(requestDTO);

            //设置插件,必须的操作,不同类型的应用入参不同,请看入参注释,公共参数按顺序分别为AppKey、AppSecret、AccessToken
            //使用开放平台ISV/自研商家应用调用接口
            LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin("eb8bb6********************b3604", "333a******************1170", "11************11");
            request.addLopPlugin(lopPlugin);

            //使用开放平台合作伙伴应用调用接口
//            LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin("bae34******************8fd", "661e4d**********************ec", "");
//            request.addLopPlugin(lopPlugin);

            //使用JOS应用调用物流开放平台接口
//            request.setUseJosAuth(true);
//            LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin("DE79844E3***********43236CC", "7b01ff52c2********7b661448", "b89114***************d4e9da950m2u");
//            request.addLopPlugin(lopPlugin);

            EcapV1OrdersPrecheckLopResponse response = client.execute(request);
            System.out.println(response.getMsg());
        } catch (LopException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

可用看到,这个DefaultDomainApiClient就是我们需要的用于发送请求的对象,文档也说了,全局只需要创建一次,所有我们把它提出来,做成静态属性,

 private static DefaultDomainApiClient client = new DefaultDomainApiClient("https://uat-api.jdl.com",500,15000);

这个官方给出的代码示例中还有一个入参对象,这个入参对象是什么呢?其实就是携带验证信息和请求参数的对象,根据实际情况进行创建即可,因为我们的是创建订单的,所以我们创建:

 EcapV1OrdersCreateLopRequest request = new EcapV1OrdersCreateLopRequest();

他和官方文档的接口名称有点像,是有规律的,当我们需要查询或者其他的时候根据具体接口来创建不同的请求对象就好了。

在官方示例代码最后,我们发现:

request.setRequest(requestDTO);
            LopPlugin lopPlugin = OAuth2PluginFactory.produceLopPlugin(appKey, AppSecret,accessToken);
            request.addLopPlugin(lopPlugin);

他先是将请求参数进行了绑定,然后绑定了一个LopPlugin对象,他需要三个参数:

appKey, AppSecret,accessToken

接下来我们去找这三个参数,首先找appKey,这个最好找,顾名思义,就是我们创建的应用的id,他在我们的应用详情的概述里,AppSecret也在这里面

直接把它提取放到我们的代码里面去,之后还差一个accessToken,说实话这个是真难找

根据官方的解释知道了其实就是一个验证码,在官方文档中翻到了:

进入https://uat-oauth.jdl.com,他会跳转到一个京东登录页,我们扫码登录就好,然后点击授权地址生成

填写appKey即可,再点击生成,然后授权地址栏会生成一段地址,复制出来去访问他,回来再刷新页面就得到了accessToken,有效期是一年,把它复制到我们的代码,这样一切都可以了,就可以发请求了,以上,就是对接京东物流下订单的流程了。

顺丰的demo网上很多我就不写了,JD的应该是csdn第一个,反正我是没有搜到一个有用的。如果对你有帮助的话,嘿嘿。

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要在Spring Boot中接入快递,您可以按照以下步骤进行操作: 1. 首先,您需要在顺开放平台注册一个账号,并获得相应的API Key和API Secret。您可以访问顺开放平台的官方网站(https://open.sf-express.com/)进行注册和申请。 2. 在您的Spring Boot项目中,添加相应的依赖。您可以使用顺官方提供的Java SDK,该SDK封装了与顺开放平台的交互逻辑。您可以在项目的`pom.xml`文件中添加以下依赖: ```xml &lt;dependency&gt; &lt;groupId&gt;com.sf&lt;/groupId&gt; &lt;artifactId&gt;sf-express-sdk-java&lt;/artifactId&gt; &lt;version&gt;1.0.0&lt;/version&gt; &lt;/dependency&gt; ``` 3. 创建一个快递服务类,用于调用顺开放平台提供的API。您可以在该类中使用SDK提供的方法,发送请求并处理返回结果。例如,您可以编写一个方法来创建订单: ```java import com.sf.api.client.SfExpressApiClient; import com.sf.api.request.order.OrderRequest; import com.sf.api.response.order.OrderResponse; public class ExpressService { private SfExpressApiClient client; public ExpressService(String apiKey, String apiSecret) { this.client = new SfExpressApiClient(apiKey, apiSecret); } public OrderResponse createOrder(OrderRequest request) { return client.createOrder(request); } } ``` 4. 在您的应用程序中,使用该快递服务类来创建订单或执行其他操作。您可以根据实际需求,调用不同的API方法。例如: ```java public class MyApp { public static void main(String[] args) { // 创建ExpressService实例 ExpressService expressService = new ExpressService(&quot;YOUR_API_KEY&quot;, &quot;YOUR_API_SECRET&quot;); // 创建订单请求 OrderRequest request = new OrderRequest(); // 设置订单相关信息 // ... // 调用创建订单API OrderResponse response = expressService.createOrder(request); // 处理返回结果 // ... } } ``` 请注意,上述示例仅供参考,您需要根据实际情况进行相应的调整和处理。 希望以上信息能够对您有所帮助!如果您有任何其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值