目录
前言
这里主要是介绍一下抖音开放平台的这个售后消息的实际使用开发,主要是在零售端的业务,有些客户,会在抖音的一个整单里面只退款部分商品,那这时,如何通知到对接的系统里面就很关键,如果不通知到位的话,会造成我们的商品损失,因为不通过消息传递到我们的系统里面的话,那么我们的系统就会默认这个订单是整单发货出去的,那么物流就会整单发货出去,但这人家退款了一部分商品了呀,如果在整单发货出去,就是我们商家的损失了。
一、抖音开发中的售后消息
买家发起售后申请消息:doudian_refund_RefundCreated
这里先讲述一下消息的message,首先,它会触发的场景有如下:
1、订单未发货,买家申请整单退款时
2、订单已发货,买家申请售后仅退款时
3、订单已发货,买家申请售后退货时
4、订单已发货,买家申请换货时
消息过来的整体数据参数如下:
这个是data里面所包含的参数如下:
在这里,我们主要是要用到子订单id和父订单id
二、抖音运营反馈的业务需求分析
需求分析如下:
1. 第1种场景:
订单未被拉取到数据库中,在平台上仍然是“待发货”的状态, 客户已经取消整个订单中的部分商品;
解决方案:消息通知,拉取完订单后,更改订单中的部分商品。
2.第2种场景:
订单已经被拉取到数据库中,但是物流快递单号还没回传,在平台上仍然是“待发货”的状态,客户已经取消整个订单中的部分商品:
解决方案:消息通知,更改订单中的部分商品。
3.第3种场景:
订单已经发货了,快递单号已经回传给到平台,平台是”已发货“的状态,此时,客户要取消整个订单中的部分商品:
解决方案:像这种物流已发出的,如果客户要取消,只能通知客服来进行介入了
三、整体的业务开发思路
最终方案:
1.先改动拉单这边, 把子订单号,存入到order_item表中,
2. 先建一个接收售后消息的方法, 接收消息,保存在第三方消息表,
3. 在建一个方法,定时去查询第三方消息表,查询售后消息,如果查询到,则先去查询order_item表中是否存在这个子订单号,如果查询不到,总计查询5次,如果5次都查询不到,则默认为这个订单号已经整单取消了,未被拉入到数据库
4.如果查询到了,第一步,则根据unit这个字段判断是否有At,如果有,则是这行商品,则把这些商品行的商品数量都置为0,金额分别调整为0元;第二步,调整order表,分别减去之前这些调整的item行中的金额和,需要调整4个金额字段。
四、售后消息的代码开发
1.售后消息的使用
代码如下(示例):
-
/**
-
* 接收抖音第三方开发平台推送过来的订单售后消息
-
* @param httpRequest
-
* @return
-
*/
-
@ApiOperation(tags = "TiktokEkOrder", value = "getDoudianEkShopDataPush", httpMethod = "POST",
-
notes = "接收抖音第三方开发平台推送过来的消息")
-
@AllowAnonymous
-
@ResponseBody
-
@PostMapping(value = "/getDoudianEkShopDataPush")
-
public DoudianEkPushResult
doudianEkShopDataPush
(HttpServletRequest httpRequest) {
-
DoudianEkPushResult
result
= tiktokEkOrderBiz.doudianEkShopDataPush(httpRequest);
-
return result;
-
}
2.实时保存抖音平台过来的售后消息
代码如下(示例):
-
public DoudianEkPushResult
doudianEkShopDataPush
(HttpServletRequest httpRequest){
-
DoudianPushResult
result
=
new
DoudianPushResult();
-
String
msgId
= pushDataTestList.get(
0).getMsgId();
-
try {
-
DoudianPushMessage
pushMessage
= DoudianUtils.getPushMessage(httpRequest, APP_SECRET, APP_KEY);
-
// logger.info("获取到抖音售后订单消息:" + pushMessage);
-
if (!pushMessage.isSuccess()) {
-
// logger.error("接收抖音第三方开发平台推送过来的消息 解析推送数据失败");
-
result.setCode(
40041);
-
result.setMsg(
"解析推送数据失败");
-
}
else
if (DoudianUtils.isEmpty(pushMessage.getData())) {
-
result.setCode(
40041);
-
result.setMsg(
"解析推送数据为空");
-
// logger.error("接收抖音第三方开发平台推送过来的消息 解析推送数据为空");
-
}
else {
-
logger.info(
"接收抖音第三方开发平台推送过来的消息 请求体;{}", Jack.toJson(pushMessage.getData()));
-
//存储消息操作
-
// TODO 售后消息
-
if(pushMessage.getData().get(
0).getTag().equals(
"200")) {
-
TiktokEkMsgNotifyBean
tiktokMsgNotifyBean
=
new
TiktokMsgNotifyBean();
-
tiktokMsgNotifyBean.setMsgType(
"200");
// 取消订单类型消息
-
tiktokMsgNotifyBean.setMsgContent(pushMessage.getBody());
// 消息体
-
tiktokMsgNotifyBean.setProcResult(
"20");
// 待处理状态
-
Integer
a
= tiktokEkMsgNotifyService.save(tiktokMsgNotifyBean);
-
-
}
-
List<DoudianPushData> pushDataList = pushMessage.getData();
-
// 业务处理
-
-
createThead(pushDataList);
// java 异步处理
-
// 接收处理成功
-
result.setCode(
0);
-
result.setMsg(
"success");
-
// logger.info(" 接收抖音第三方开发平台推送过来的消息 接收处理成功");
-
}
-
// 回复抖音返回来的推送消息
-
return result;
-
}
catch (Exception e) {
-
// 接收处理失败
-
result.setCode(
40044);
-
result.setMsg(
"接收处理失败消息");
-
}
-
-
return result;
-
}
3.具体的订单业务处理
通过查询第三方消息表,遍历售后消息,获取到售后消息data数据,然后转化成java对象,在进行具体的业务处理
代码如下(示例):
-
List<TiktokEkMsgNotifyBean> tiktokEkMsgNotifyBeans = tiktokEkMsgNotifyBeanAllList;
// 查询抖音消息表
-
int
newOrderCount
=
0;
-
for(
int
i
=
0; i<tiktokEkMsgNotifyBeans.size(); i++ ){
-
String
body
= tiktokEkMsgNotifyBeans.get(i).getMsgContent();
-
List<DoudianPushData> pushDataList = getDatas(body);
-
for (DoudianPushData pushData : pushDataList) {
-
try {
-
if (
"200".equals(pushData.getTag())) {
-
-
logger.info(
"获取到抖音售后订单消息200:" + pushData.getTag());
-
DoudianRefundCreated200
doudianRefundCreated200
= pushData.toObject(DoudianRefundCreated200.class);
-
BizAssert.isTrue(doudianRefundCreated200 !=
null,
"接收抖音第三方开发平台推送过来的消息 消息体 TAG200 转Objecct失败");
-
if (doudianRefundCreated200.getAftersaleType() ==
2) {
//售后类型: 0: 退货 1: 售后仅退款 2: 发货前退款 3:换货
-
OrderBean
OrderBean
= OrderDao.findOrderNoByChannelOrderid(doudianRefundCreated200.getPId().toString());
-
String
shipmentCode
= OrderBean.getOrderNo();
-
BigDecimal
totalAmt
= OrderBean.getTotalAmt();
-
BigDecimal
afterDiscountAmt
= OrderBean.getAfterDiscountAmt();
-
BigDecimal
paidAmt
= OrderBean.getPaidAmt();
-
BigDecimal
prdAmt
= OrderBean.getPrdAmt();
-
-
logger.info(
"查询出来的订单号:" + shipmentCode);
-
if (shipmentCode ==
null || StringUtils.isEmpty(shipmentCode)) {
-
logger.info(
"抖音订单还没拉取到数据库中,售后订单不作处理" + shipmentCode);
-
}
else {
-
-
BigDecimal
orderAmt
= BigDecimal.ZERO;
// 定义1个订单金额
-
//1.先查询出每个子订单的商品行的金额,进行叠加后,得出减去的总金额 TODO 1 查询
-
OrderItemCriteria
orderFindItem
=
new
OrderItemCriteria();
-
orderFindItem.setChannelOrderItemId(doudianRefundCreated200.getSId().toString());
// 子订单号
-
orderFindItem.setUnit(
"At");
-
List<OrderItemBean> list = OrderItemDao.findOrderItemOrderids(orderFindItem);
-
for (OrderItemBean orderItemBean : list) {
-
orderAmt = orderAmt.add(orderItemBean.getAmt());
// 相加,最终要减去的价格
-
logger.info(
"要减去的价格===" + orderAmt);
-
}
-
// TODO 可能有多个子订单号,所以可能会更改多条 2 更改
-
OrderItemCriteria
orderItem
=
new
OrderItemCriteria();
-
orderItem.setChannelOrderItemId(doudianRefundCreated200.getSId().toString());
// 子订单号
-
orderItem.setUnit(
"At");
-
orderItem.setQty(
0);
-
orderItem.setAmt(BigDecimal.ZERO);
-
orderItem.setAfterDiscountAmt(BigDecimal.ZERO);
-
OrderItemDao.updateTiktokBean(orderItem);
-
-
-
// 2.得到减去的金额后,order表根据这个订单号进行金额上的调整
-
// 第3步,根据父订单号,修改order表中的订单的总金额等字段
-
OrderCriteria
bean
=
new
OrderCriteria();
-
bean.setOrderNo(shipmentCode);
// 订单号
-
bean.setAfterDiscountAmt(afterDiscountAmt.subtract(orderAmt));
//折扣后的金额
-
bean.setPaidAmt(paidAmt.subtract(orderAmt));
// 支付金额
-
bean.setTotalAmt(totalAmt.subtract(orderAmt));
// 总金额
-
bean.setPrdAmt(prdAmt.subtract(orderAmt));
-
Integer
a
= OrderDao.updateTiktokOrderBean(bean);
-
logger.info(
"更新订单表的个数===" + a);
-
-
-
}
-
// 更新消息为"成功处理"
-
updateTiktokMsgNotifyBeanSuccess(tiktokMsgNotifyBeans.get(i));
// 更新成功消息状态
-
newOrderCount++;
-
}
-
}
-
}
catch(Exception e){
-
logger.error(
"消息处理失败!!!" + e);
-
}
-
-
-
}
-
-
}
总结
这里主要是介绍一下抖音开放平台的这个售后消息的实际使用开发,主要是在零售端的业务,有些客户,会在抖音的一个整单里面只退款部分商品,那这时,如何通知到对接的系统里面就很关键,如果不通知到位的话,会造成我们的商品损失,因为不通过消息传递到我们的系统里面的话,那么我们的系统就会默认这个订单是整单发货出去的,那么物流就会整单发货出去,但这人家退款了一部分商品了呀,如果在整单发货出去,就是我们商家的损失了。
转载:https://blog.csdn.net/weixin_46442877/article/details/127572707