飞道的博客

对接抖音开发之售后消息实时通知订单部分退款

336人阅读  评论(0)

目录

前言

一、抖音开发中的售后消息

二、抖音运营反馈的业务需求分析

三、整体的业务开发思路

四、售后消息的代码开发

1.售后消息的使用

2.实时保存抖音平台过来的售后消息

3.具体的订单业务处理

总结


前言

 这里主要是介绍一下抖音开放平台的这个售后消息的实际使用开发,主要是在零售端的业务,有些客户,会在抖音的一个整单里面只退款部分商品,那这时,如何通知到对接的系统里面就很关键,如果不通知到位的话,会造成我们的商品损失,因为不通过消息传递到我们的系统里面的话,那么我们的系统就会默认这个订单是整单发货出去的,那么物流就会整单发货出去,但这人家退款了一部分商品了呀,如果在整单发货出去,就是我们商家的损失了。

一、抖音开发中的售后消息

 买家发起售后申请消息: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.售后消息的使用

代码如下(示例):


  
  1. /**
  2. * 接收抖音第三方开发平台推送过来的订单售后消息
  3. * @param httpRequest
  4. * @return
  5. */
  6. @ApiOperation(tags = "TiktokEkOrder", value = "getDoudianEkShopDataPush", httpMethod = "POST",
  7. notes = "接收抖音第三方开发平台推送过来的消息")
  8. @AllowAnonymous
  9. @ResponseBody
  10. @PostMapping(value = "/getDoudianEkShopDataPush")
  11. public DoudianEkPushResult doudianEkShopDataPush (HttpServletRequest httpRequest) {
  12. DoudianEkPushResult result = tiktokEkOrderBiz.doudianEkShopDataPush(httpRequest);
  13. return result;
  14. }

2.实时保存抖音平台过来的售后消息

代码如下(示例):


  
  1. public DoudianEkPushResult doudianEkShopDataPush (HttpServletRequest httpRequest){
  2. DoudianPushResult result = new DoudianPushResult();
  3. String msgId = pushDataTestList.get( 0).getMsgId();
  4. try {
  5. DoudianPushMessage pushMessage = DoudianUtils.getPushMessage(httpRequest, APP_SECRET, APP_KEY);
  6. // logger.info("获取到抖音售后订单消息:" + pushMessage);
  7. if (!pushMessage.isSuccess()) {
  8. // logger.error("接收抖音第三方开发平台推送过来的消息 解析推送数据失败");
  9. result.setCode( 40041);
  10. result.setMsg( "解析推送数据失败");
  11. } else if (DoudianUtils.isEmpty(pushMessage.getData())) {
  12. result.setCode( 40041);
  13. result.setMsg( "解析推送数据为空");
  14. // logger.error("接收抖音第三方开发平台推送过来的消息 解析推送数据为空");
  15. } else {
  16. logger.info( "接收抖音第三方开发平台推送过来的消息 请求体;{}", Jack.toJson(pushMessage.getData()));
  17. //存储消息操作
  18. // TODO 售后消息
  19. if(pushMessage.getData().get( 0).getTag().equals( "200")) {
  20. TiktokEkMsgNotifyBean tiktokMsgNotifyBean = new TiktokMsgNotifyBean();
  21. tiktokMsgNotifyBean.setMsgType( "200"); // 取消订单类型消息
  22. tiktokMsgNotifyBean.setMsgContent(pushMessage.getBody()); // 消息体
  23. tiktokMsgNotifyBean.setProcResult( "20"); // 待处理状态
  24. Integer a = tiktokEkMsgNotifyService.save(tiktokMsgNotifyBean);
  25. }
  26. List<DoudianPushData> pushDataList = pushMessage.getData();
  27. // 业务处理
  28. createThead(pushDataList); // java 异步处理
  29. // 接收处理成功
  30. result.setCode( 0);
  31. result.setMsg( "success");
  32. // logger.info(" 接收抖音第三方开发平台推送过来的消息 接收处理成功");
  33. }
  34. // 回复抖音返回来的推送消息
  35. return result;
  36. } catch (Exception e) {
  37. // 接收处理失败
  38. result.setCode( 40044);
  39. result.setMsg( "接收处理失败消息");
  40. }
  41. return result;
  42. }

3.具体的订单业务处理

通过查询第三方消息表,遍历售后消息,获取到售后消息data数据,然后转化成java对象,在进行具体的业务处理

代码如下(示例):


  
  1. List<TiktokEkMsgNotifyBean> tiktokEkMsgNotifyBeans = tiktokEkMsgNotifyBeanAllList; // 查询抖音消息表
  2. int newOrderCount = 0;
  3. for( int i = 0; i<tiktokEkMsgNotifyBeans.size(); i++ ){
  4. String body = tiktokEkMsgNotifyBeans.get(i).getMsgContent();
  5. List<DoudianPushData> pushDataList = getDatas(body);
  6. for (DoudianPushData pushData : pushDataList) {
  7. try {
  8. if ( "200".equals(pushData.getTag())) {
  9. logger.info( "获取到抖音售后订单消息200:" + pushData.getTag());
  10. DoudianRefundCreated200 doudianRefundCreated200 = pushData.toObject(DoudianRefundCreated200.class);
  11. BizAssert.isTrue(doudianRefundCreated200 != null, "接收抖音第三方开发平台推送过来的消息 消息体 TAG200 转Objecct失败");
  12. if (doudianRefundCreated200.getAftersaleType() == 2) { //售后类型: 0: 退货 1: 售后仅退款 2: 发货前退款 3:换货
  13. OrderBean OrderBean = OrderDao.findOrderNoByChannelOrderid(doudianRefundCreated200.getPId().toString());
  14. String shipmentCode = OrderBean.getOrderNo();
  15. BigDecimal totalAmt = OrderBean.getTotalAmt();
  16. BigDecimal afterDiscountAmt = OrderBean.getAfterDiscountAmt();
  17. BigDecimal paidAmt = OrderBean.getPaidAmt();
  18. BigDecimal prdAmt = OrderBean.getPrdAmt();
  19. logger.info( "查询出来的订单号:" + shipmentCode);
  20. if (shipmentCode == null || StringUtils.isEmpty(shipmentCode)) {
  21. logger.info( "抖音订单还没拉取到数据库中,售后订单不作处理" + shipmentCode);
  22. } else {
  23. BigDecimal orderAmt = BigDecimal.ZERO; // 定义1个订单金额
  24. //1.先查询出每个子订单的商品行的金额,进行叠加后,得出减去的总金额 TODO 1 查询
  25. OrderItemCriteria orderFindItem = new OrderItemCriteria();
  26. orderFindItem.setChannelOrderItemId(doudianRefundCreated200.getSId().toString()); // 子订单号
  27. orderFindItem.setUnit( "At");
  28. List<OrderItemBean> list = OrderItemDao.findOrderItemOrderids(orderFindItem);
  29. for (OrderItemBean orderItemBean : list) {
  30. orderAmt = orderAmt.add(orderItemBean.getAmt()); // 相加,最终要减去的价格
  31. logger.info( "要减去的价格===" + orderAmt);
  32. }
  33. // TODO 可能有多个子订单号,所以可能会更改多条 2 更改
  34. OrderItemCriteria orderItem = new OrderItemCriteria();
  35. orderItem.setChannelOrderItemId(doudianRefundCreated200.getSId().toString()); // 子订单号
  36. orderItem.setUnit( "At");
  37. orderItem.setQty( 0);
  38. orderItem.setAmt(BigDecimal.ZERO);
  39. orderItem.setAfterDiscountAmt(BigDecimal.ZERO);
  40. OrderItemDao.updateTiktokBean(orderItem);
  41. // 2.得到减去的金额后,order表根据这个订单号进行金额上的调整
  42. // 第3步,根据父订单号,修改order表中的订单的总金额等字段
  43. OrderCriteria bean = new OrderCriteria();
  44. bean.setOrderNo(shipmentCode); // 订单号
  45. bean.setAfterDiscountAmt(afterDiscountAmt.subtract(orderAmt)); //折扣后的金额
  46. bean.setPaidAmt(paidAmt.subtract(orderAmt)); // 支付金额
  47. bean.setTotalAmt(totalAmt.subtract(orderAmt)); // 总金额
  48. bean.setPrdAmt(prdAmt.subtract(orderAmt));
  49. Integer a = OrderDao.updateTiktokOrderBean(bean);
  50. logger.info( "更新订单表的个数===" + a);
  51. }
  52. // 更新消息为"成功处理"
  53. updateTiktokMsgNotifyBeanSuccess(tiktokMsgNotifyBeans.get(i)); // 更新成功消息状态
  54. newOrderCount++;
  55. }
  56. }
  57. } catch(Exception e){
  58. logger.error( "消息处理失败!!!" + e);
  59. }
  60. }
  61. }


总结

   这里主要是介绍一下抖音开放平台的这个售后消息的实际使用开发,主要是在零售端的业务,有些客户,会在抖音的一个整单里面只退款部分商品,那这时,如何通知到对接的系统里面就很关键,如果不通知到位的话,会造成我们的商品损失,因为不通过消息传递到我们的系统里面的话,那么我们的系统就会默认这个订单是整单发货出去的,那么物流就会整单发货出去,但这人家退款了一部分商品了呀,如果在整单发货出去,就是我们商家的损失了。


转载:https://blog.csdn.net/weixin_46442877/article/details/127572707
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场