目录
前言
一、订单发货接口
二、商家对接接口步骤
1.业务逻辑分析
2.业务逻辑代码
总结
主要是以前有对接过抖店开放平台,所以现在想要记录一下,做一个笔记,好好归纳一下,当时对接订单发货接口,是怎么实现的,以及后来的优化点又有哪些。
这个接口是在抖店开放平台的商家自研文档中的, 是专门给有能力对接的商家回传自家的物流号给到自家店铺的订单标记发货用的,从官方文档看,它就是/order/logisticsAdd(订单发货接口),它暂时只支持整单出库,即接口调用时入参只能传父订单号。Tips:部分发货状态下的父订单,调此接口发货,会报错:该订单当前为“部分发货”状态,无法调用此接口。
这个接口的请求参数如图所示:
那么它的响应参数又是什么呢,正常的响应如下所示:
就是code的值必须为10000,才代表你的这个订单的物流号已经成功回传给到开放平台,且开放平台已成功标记为发货状态。
第一步,我们先想设计好开发的方案,
首先,我们根据发货接口的请求参数,得到,订单号是必须要的,还有物流公司name、物流公司code、快递单号等参数等等。
然后,我们需要根据我们的自身商家的业务分析多种场景的情况,
第1个场景,就是我们抖店运营人员有时需要根据她们那边的需求,有时会人工导单到自家ERP系统中,然后再由自家ERP系统推单给到中通发货,中通一般会在当天回传该订单的物流号,
而这里的物流号又会分为2种情况:
1种情况就是需要回传物流号给到抖店开放平台的,标记订单发货的;
而第2种情况就是,不需要回传物流号给到抖店开放平台的,这里又会分为2种情况出现;
第1个就是抖店运营会跟抖音平台上的达人合作,由达人进行直播带货,那么由这个达人直播带货而产生的订单,到时它的订单是会传到我们自家商家店铺这边的,到时,我们这边进行拉单的时候,是可以拉取到这些达人带货的订单的,但是,如果我们想要通过这个接口回传物流号给到订单标记发货是不行的,只能通过抖音运营那边,手工给物流号提供给到达人那边标记发货,所以,我们这边就不需要再调用接口回传物流号了,所以我们会直接标记这个订单的一个状态为”已回传处理“,这样,下次,查询这些订单时,会把这些发货的订单号给过滤掉。
第2个就是福袋,就是直播随机抽奖的福袋,这样的订单,也是不需要回传物流号给到抖店开放平台的,所以,这部分订单也是不需要调用接口回传物流号,所以同样。我们会直接标记这个订单的一个状态为”已回传处理“。
上面这里的这2个都是不需要回传物流号的场景;接下来,就是需要回传物流号的了。
只要我们ERP系统的物流对照表中,如果中通已经回传了该订单的物流号,都会被标记在这个对照表中,到时,我们只需要开发好这个接口,通过定时任务,每天定一段时间调用接口轮询,查询这个时间内的订单的物流号是否已存在,如果存在,则立马调用抖店开放平台的发货接口标记订单发货,否则,则等待该订单的物流号回来后,在调用处理,在调用成功后,我们需要回标这个订单的状态为”已回传处理“。
首先,是接口开始前,我们先轮询遍历获取到符合条件的订单,这些符合条件的订单,就是已经是发货状态,且推单给到中通物流那边了的,且已经回传运单号的了,只有符合这些条件的,才可以查询到。
LogisticsAddBoResponse response = new LogisticsAddBoResponse();
response.setErrOrderNos(Lists.newArrayList());
response.setSuccessOrderNos(Lists.newArrayList());
BoCriteria criteria = new BoCriteria();
criteria.setStatus(CodeItemKeys.T_ORDER_STATUS_DELIVER);
criteria.setExpressStatusEmpty(true);
criteria.setExprIdEmpty(false);//不允许运单号为空
criteria.setTranBackToSales(0); // 回传标识,0代表待回传,1代表已回传,2代表取消
List orderBeans = OrderService.findBeansByOrderNos(criteria);
if(CollectionUtils.isEmpty(orderBeans)){
response.setMessage("抖店_批量订单发货接口"+LocalDateTime.now().format(dateTimeFormatter)+",未查询到需配送订单");
return response;
}
GlobalConfig.initAppKey(projectConfig.getTiktokECommerceAppId());
GlobalConfig.initAppSecret(projectConfig.getTiktokECommerceAppSecret());
AccessToken accessToken = AccessTokenBuilder.build(Long.valueOf(projectConfig.getTiktokECommerceDefaultStoreId()));
BizAssert.isTrue(accessToken.getAccessToken()!= null,"很抱歉,抖店发货生成并获取token失败;返回来的token为空null");
Map duplicateOrderNoCheckMap = new HashMap<>();
String companyCode = projectConfig.getTikTokLogisticsDefaultCode();
TiktokLogisticsCompanyCriteria logisticsCompanyCriteria = new TiktokLogisticsCompanyCriteria();
logisticsCompanyCriteria.setCode(companyCode);
TiktokLogisticsCompanyBean logisticsCompanyBean = TiktokLogisticsCompanyService.findOneBean(logisticsCompanyCriteria);
上面的代码,可以分解为三大部分,第一部分就是准备订单的数据,第二部分就是获取token,第三部分就是准备物流公司等相关信息的数据。
接下来的这一部分代码就是分场景的:
这部分的代码就是正常的请求发货接口标记发货的代码了,由orderLogisticsAddRequest中的execute的请求方法执行,得到了res响应后,我们在做进一步的处理,首先,是标记该订单为”已回传状态“。
OrderLogisticsAddResponse res = orderLogisticsAddRequest.execute(accessToken);
logger.info("抖音发货接口返回的响应体"+res.toString());
logger.info(""+CodeItemKeys.TIKTOK_API_RES_CODE_SUCCESS.equals(res.getCode().longValue()));
if(CodeItemKeys.TIKTOK_API_RES_CODE_SUCCESS.equals(res.getCode().longValue())) {
successOrderNum++;
OrderExpressBean updateBean = BeanUtils.copy(order,OrderExpressBean.class);
BizAssert.isTrue(StringUtils.isNotBlank(updateBean.getOrderNo()),"很抱歉,更新order_express失败,不存在order_no订单号"); updateBean.setExprStatus(CodeItemKeys.ORDER_EXPRESS_STATUS_DELIVER);
updateBean.setTranBackToSales(1); //将它设置为1,代表已经回传成功
Integer updateSql = OrderExpressService.updateBeanByOrderNo(updateBean);
logger.error("订单批量发货成功的订单:"+channelOrderId);
logger.info("订单批量发货成功的订单:"+channelOrderId);
response.getSuccessOrderNos().add(channelOrderId);
接下来的代码是不需要回传的场景的:
我们这边就是根据res.getSubCode()响应中返回来的SubCode,来进行判断,第1个就是已重复发货的判断,因为有些时候的抖店订单,是通过运营人工导入到我们系统中,所以物流号回传后,它是可以按上面的逻辑回传给到平台,但是,有可能它没有标记的情况发生,所以在这加多一个判断,如果已重复回传,则标记为”已回传处理“即可。
另一种情况,就是抖音运营人员有时会自己人工导抖音单到订单表上,推到中通发货,这种类型的订单,是不需要回传给抖音的,而这时候的res.getSubCode()响应中返回来的SubCode,它是订单不存在的code,所以根据这个code判断,这些订单可以标记为"已回传处理"即可。
if(CodeItemKeys.TIKTOK_API_RES_CODE_FAIL_DELIVER.equals(res.getSubCode())){
logger.info("返回来的错误码==="+res.getSubCode());
logger.info("说明该订单已经回传物流号了");
OrderExpressBean updateBean = BeanUtils.copy(order,OrderExpressBean.class);
BizAssert.isTrue(StringUtils.isNotBlank(updateBean.getOrderNo()),"很抱歉,更新order_express失败,不存在order_no订单号");
updateBean.setExprStatus(CodeItemKeys.ORDER_EXPRESS_STATUS);
updateBean.setTranBackToSales(1); //将它设置为1,代表已经回传成功
Integer updateSql = OrderExpressService.updateBeanByOrderNo(updateBean);
logger.error("订单批量发货==重复发货的订单:"+channelOrderId);
logger.info("订单批量发货==重复发货的订单:"+channelOrderId);
}
//TODO 抖音运营人员有时会自己人工导抖音单到订单表上,推到中通发货,这种类型的订单,是不需要回传给抖音的
if(CodeItemKeys.API_RES_CODE_FAIL_NULL.equals(res.getSubCode())){
logger.info("返回来的错误码==="+res.getSubCode());
logger.info("说明该订单在抖音平台上的店铺中不存在");
OrderExpressBean updateBean = BeanUtils.copy(order,OrderExpressBean.class);
updateBean.setExprStatus(CodeItemKeys.ORDER_EXPRESS_STATUS_DELIVER);
updateBean.setTranBackToSales(1); //将它设置为1,代表已经回传成功
Integer updateSql = OrderExpressService.updateBeanByOrderNo(updateBean);
}
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
主要是以前有对接过抖店开放平台,所以现在想要记录一下,做一个笔记,好好归纳一下,当时对接订单发货接口,是怎么实现的,以及后来的优化点又有哪些。