抖店订单发货回传的实际开发笔记

news2025/8/12 21:14:51

目录

前言

一、订单发货接口

二、商家对接接口步骤

1.业务逻辑分析

2.业务逻辑代码

总结


前言

主要是以前有对接过抖店开放平台,所以现在想要记录一下,做一个笔记,好好归纳一下,当时对接订单发货接口,是怎么实现的,以及后来的优化点又有哪些。

一、订单发货接口

这个接口是在抖店开放平台的商家自研文档中的, 是专门给有能力对接的商家回传自家的物流号给到自家店铺的订单标记发货用的,从官方文档看,它就是/order/logisticsAdd(订单发货接口),它暂时只支持整单出库,即接口调用时入参只能传父订单号。Tips:部分发货状态下的父订单,调此接口发货,会报错:该订单当前为“部分发货”状态,无法调用此接口。

这个接口的请求参数如图所示:

 那么它的响应参数又是什么呢,正常的响应如下所示:

 就是code的值必须为10000,才代表你的这个订单的物流号已经成功回传给到开放平台,且开放平台已成功标记为发货状态。

二、商家对接接口步骤

1.业务逻辑分析

第一步,我们先想设计好开发的方案,

首先,我们根据发货接口的请求参数,得到,订单号是必须要的,还有物流公司name、物流公司code、快递单号等参数等等。

然后,我们需要根据我们的自身商家的业务分析多种场景的情况,

第1个场景,就是我们抖店运营人员有时需要根据她们那边的需求,有时会人工导单到自家ERP系统中,然后再由自家ERP系统推单给到中通发货,中通一般会在当天回传该订单的物流号,

而这里的物流号又会分为2种情况:

1种情况就是需要回传物流号给到抖店开放平台的,标记订单发货的;

而第2种情况就是,不需要回传物流号给到抖店开放平台的,这里又会分为2种情况出现;

第1个就是抖店运营会跟抖音平台上的达人合作,由达人进行直播带货,那么由这个达人直播带货而产生的订单,到时它的订单是会传到我们自家商家店铺这边的,到时,我们这边进行拉单的时候,是可以拉取到这些达人带货的订单的,但是,如果我们想要通过这个接口回传物流号给到订单标记发货是不行的,只能通过抖音运营那边,手工给物流号提供给到达人那边标记发货,所以,我们这边就不需要再调用接口回传物流号了,所以我们会直接标记这个订单的一个状态为”已回传处理“,这样,下次,查询这些订单时,会把这些发货的订单号给过滤掉。

第2个就是福袋,就是直播随机抽奖的福袋,这样的订单,也是不需要回传物流号给到抖店开放平台的,所以,这部分订单也是不需要调用接口回传物流号,所以同样。我们会直接标记这个订单的一个状态为”已回传处理“。

上面这里的这2个都是不需要回传物流号的场景;接下来,就是需要回传物流号的了。

只要我们ERP系统的物流对照表中,如果中通已经回传了该订单的物流号,都会被标记在这个对照表中,到时,我们只需要开发好这个接口,通过定时任务,每天定一段时间调用接口轮询,查询这个时间内的订单的物流号是否已存在,如果存在,则立马调用抖店开放平台的发货接口标记订单发货,否则,则等待该订单的物流号回来后,在调用处理,在调用成功后,我们需要回标这个订单的状态为”已回传处理“。

2.业务逻辑代码

首先,是接口开始前,我们先轮询遍历获取到符合条件的订单,这些符合条件的订单,就是已经是发货状态,且推单给到中通物流那边了的,且已经回传运单号的了,只有符合这些条件的,才可以查询到。

       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<OrderBoBean> 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<String,OrderBoBean> 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


总结

主要是以前有对接过抖店开放平台,所以现在想要记录一下,做一个笔记,好好归纳一下,当时对接订单发货接口,是怎么实现的,以及后来的优化点又有哪些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用pip安装模块时,提示MemoryError

在使用pip安装依赖模块时&#xff0c;报错如下&#xff1a; 解决方法&#xff1a; 添加 --no-cache-dir参数 pip3 --no-cache-dir install -r *** 安装时遇到的其他问题&#xff1a; 设置python源命令&#xff1a; pip3 config set global.index-url https://pypi.tuna.tsing…

老K,硬核“锅”气

把一个有社会价值的事情&#xff0c;经过持续地思考和行动做成第一&#xff0c;并产生商业价值。之前&#xff0c;老K是这么做的&#xff1b; 现在“硬科技 &#xff0b; Food”就是老K新的选择与坚守。 作者|皮爷 出品|产业家 最近一年&#xff0c;一级市场交投清淡&…

SpringMVC学习篇(十一)

SpringMVC文件上传(普通版) 1 准备工作 1.1 导入文件上传需要的依赖 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version> </dependency>1.2 在springM…

5G无线技术基础自学系列 | 物理下行共享信道

素材来源&#xff1a;《5G无线网络优化实践》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 NR PDSCH采用OFDM符号调制方式&#xff0…

构建有效和安全的远程工作模式

IDSA的一项研究发现&#xff0c;79%的企业遭受了与身份相关的违规行为。在 ManageEngine&#xff0c;我们了解身份对企业组织的整体安全状况的重要性。在这个身份安全周&#xff0c;我们准备了一系列文章来传播身份安全重要性以及哪些简单措施可以帮助提高企业组织对身份安全的…

【node进阶】深入浅出websocket即时通讯(一)

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

游戏黑卡代充36技术及库存系统案例分析

黑卡充值常隐匿于「代充」服务中&#xff0c;且形式多变&#xff0c;从外币汇率差、退款到36漏洞、黑卡/盗刷信用卡充值&#xff0c;甚至还出现了专门的库存系统。 「36漏洞」是利用iOS小额支付漏洞实现的刷单套利业务。苹果为提高用户体验&#xff0c;在 APP Store 购买商品时…

【Hack The Box】linux练习-- Sunday

HTB 学习笔记 【Hack The Box】linux练习-- Sunday &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f3…

电容笔用什么品牌?电容笔10大品牌排行榜

尽管苹果公司的原装电容笔使用起来非常的流畅&#xff0c;非常的方便&#xff0c;但是它的价格却非常昂贵&#xff0c;这让很多学生党望而却步&#xff0c;还有这款电容笔的重量也不轻&#xff0c;长时间使用手会感觉疲劳。如果是来学习的&#xff0c;那就未必买如此贵的电容笔…

Java抽象类(abstract)

抽象类 当父类的某些方法&#xff0c;需要声明&#xff0c;但是又不确定如何实现时&#xff0c;可以将其声明为抽象方法&#xff0c;那么这个类就是抽象类 1)用abstract关键字来修饰一个类时,这个类就叫抽象类 访问修饰符 abstract 类名 {}2)用abstract关键宇来修饰一个方法时…

C. Division(分解质因数)

Problem - 1445C - Codeforces 奥列格最喜欢的科目是历史和数学&#xff0c;而他最喜欢的数学分支是除法。 为了提高他的除法技巧&#xff0c;奥列格想出了t对整数pi和qi&#xff0c;并决定为每对整数找到最大的整数xi&#xff0c;这样。 pi能被xi整除。 xi不能被qi整除。 奥…

基于NodeJs+Express+MySQL 实现的个人博客完整项目

目录 一、创建项目并初始化 项目结构 二、安装项目所需要的包 三、创建所需要的数据库表 表 user 用于存放账户密码 表 notepad 用于存放文章数据 表 leaving 用于存放留言板的数据 三、编写app.js文件 1、导入所有需要的包 2、创建web服务器 3、创建db文件夹&#…

智能制造APS,赋能「钣金行业」提升数字化战斗力!

导语&#xff1a; 钣金加工是典型的离散制造行业&#xff0c;具有品种多、批量小、交期短、质量要求高的发展趋势&#xff0c;这对钣金车间的生产管理提出了新的挑战。推进行业数字化、智能化改造&#xff0c;实现质效双提升&#xff0c;打破增长瓶颈&#xff0c;成为钣金行业…

Git常用命令与分支管理

Git常用的命令有以下6个&#xff1a;fetch/clone命令&#xff0c;add命令&#xff0c;commit命令&#xff0c;checkout命令&#xff0c;push命令&#xff0c;pull命令。 workspace&#xff1a;工作区staging area&#xff1a;暂存区loacl repository&#xff1a;本地仓库remot…

计算机毕业设计springboot+vue+elementUI会员制医疗预约服务管理信息系统

项目介绍 会员制医疗预约服务管理信息系统是针对会员制医疗预约服务管理方面必不可少的一个部分。在会员制医疗预约服务管理的整个过程中&#xff0c;会员制医疗预约服务管理系统担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类的管理系统也在不断改进 本系…

字节面试问到CPU的多级缓存架构,诸佬们怎么回答?

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;上周在面试字节中&#xff0c;问到了一个关于CPU多级缓存架构的问题&#xff0c;当时答得并不是很好&#xff0c;之后查阅了资料&#xff0c;对此进行了复盘总结。 如果文章有什么需要改进的地方…

全网最详细SpringBoot、SpringCloud整合阿里云OSS对象存储服务

1、进入阿里云官网 https://www.aliyun.com/ 2、搜索“对象存储OSS” 3、进入“管理控制台” 4、进入“Bucket列表”&#xff0c;点击“创建Bucket” 5、根据实际情况选择&#xff0c;最后点击“确定” 这里插入一个可以通过代码创建Bucket的测试类&#xff0c;如下&#xff…

什么是供应商管理?为什么它很重要?

**供应商管理**是确保企业付给供应商的钱获得最大价值的过程&#xff0c;且目标是确保与供应商签订的所有合同都能满足企业业务的需求。 乍一看&#xff0c;供应商管理似乎是一件很容易总结的事情&#xff0c;建立适当的关系&#xff0c;管理需求&#xff0c;并与供应商进行清…

VR直播系统设置大揭秘,带你穿越时空亲临现场

直播现在可谓是各个行业的香饽饽&#xff0c;不管是电商带货直播&#xff0c;还是游戏竞赛直播都是如火如荼。而VR直播也逐渐频繁出现在大众眼前&#xff0c;就例如前两年广大人民都是通过VR直播在线观看火神山的建设&#xff0c;随着近两年5G技术和VR技术的兴起和发展&#xf…

MongoDB安装及进程介绍

文章目录 MongoDB安装重要的进程介绍mongo进程其他进程MongoDB安装 MongoDB 官方已经提供了Linux、Windows、Mac OS X 以及Solaris 4 种平台的二进制分发包,最新的稳定版本是 6.0.2,下载地址是:https://www.mongodb.com/try/download/community,如图: 下载完成后,解压…