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

目录

前言

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

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

三、整体的业务开发思路

四、售后消息的代码开发

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.售后消息的使用

代码如下(示例):

    /**
     * 接收抖音第三方开发平台推送过来的订单售后消息
     * @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);
                        }


                }

            }


总结

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

对接团购码核销需要以下步骤: 1. 测试API是否通畅。可以使用Postman等工具发送请求,验证API的可用性和响应情况。 2. 根据开放平台的API文档,了解团购码核销接口的入参和出参。可以根据API文档封装相应的实体类(如DTO和Param)。 3. 如果从远程分支pull下来的项目,需配置Maven的profile,勾选dev。这样可以保证项目使用正确的依赖和配置文件。 4. 如果微服务Maven项目依赖报错,需要检查项目使用的JDK版本是否为JDK8,并检查每个模块的JDK版本是否一致。 5. 根据API文档的要求,编写Java代码实现团购码核销的功能。可以使用Java的HTTP请求库,如OkHttp或RestTemplate,发送请求并处理响应。 6. 在代码中调用提供的团购码核销接口,传入相关参数进行核销操作。 7. 根据接口的返回结果进行相应的处理。可能需要对返回的数据进行解析和处理,以获取核销结果或其他相关信息。 综上所述,Java开发对接团购码核销的流程包括测试API可用性、封装实体类、配置Maven profile、检查依赖报错、编写核销代码、发送请求、处理响应结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [库迪咖啡团购对接项目总结](https://blog.csdn.net/mannery19140/article/details/129235939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶厂小程

码字不易,你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值