目录
前言
这里主要是介绍一下抖音开放平台的这个售后消息的实际使用开发,主要是在零售端的业务,有些客户,会在抖音的一个整单里面只退款部分商品,那这时,如何通知到对接的系统里面就很关键,如果不通知到位的话,会造成我们的商品损失,因为不通过消息传递到我们的系统里面的话,那么我们的系统就会默认这个订单是整单发货出去的,那么物流就会整单发货出去,但这人家退款了一部分商品了呀,如果在整单发货出去,就是我们商家的损失了。
一、抖音开发中的售后消息
买家发起售后申请消息: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);
}
}
}
总结
这里主要是介绍一下抖音开放平台的这个售后消息的实际使用开发,主要是在零售端的业务,有些客户,会在抖音的一个整单里面只退款部分商品,那这时,如何通知到对接的系统里面就很关键,如果不通知到位的话,会造成我们的商品损失,因为不通过消息传递到我们的系统里面的话,那么我们的系统就会默认这个订单是整单发货出去的,那么物流就会整单发货出去,但这人家退款了一部分商品了呀,如果在整单发货出去,就是我们商家的损失了。