公司新需求,需要在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://oauth.jdl.com(生产环境)或https://uat-oauth.jdl.com(预发环境)查看自己的授权记录或解除授权。
进入https://uat-oauth.jdl.com,他会跳转到一个京东登录页,我们扫码登录就好,然后点击授权地址生成
填写appKey即可,再点击生成,然后授权地址栏会生成一段地址,复制出来去访问他,回来再刷新页面就得到了accessToken,有效期是一年,把它复制到我们的代码,这样一切都可以了,就可以发请求了,以上,就是对接京东物流下订单的流程了。
顺丰的demo网上很多我就不写了,JD的应该是csdn第一个,反正我是没有搜到一个有用的。如果对你有帮助的话,嘿嘿。