目录 前言 这里主要是介绍一下抖音开放平台的这个消息退款的实际使用开发,抖音开发平台提供了一个实时退款的消息推送功能,那这时,我们需要对接这个推送功能,它如何通知到对接的系统里面就很关键,如果不通知到位的话,会造成我们的商品损失,因为不通过消息传递到我们的系统里面的话,那么我们的系统就会默认这个订单是整单发货出去的,那么物流就会整单发货出去,但这人家家已经退款了的,如果在整单发货出去,就是我们商家的损失了。 所以,实时的退款消息通知我们自研系统就显得很重要了。 一、抖音开发中的订单取消消息 买家发起订单取消消息:doudian_trade_TradeCanceled 这里先讲述一下消息的message,首先,它会触发的场景有如下:

  1. 货到付款订单且订单状态为「待确认」,买家和商家可取消订单
  2. 货到付款订单且订单状态为「备货中」,买家、商家和平台客服可取消订单
  3. 货到付款订单且订单状态为「已发货」,物流状态为拒收或退回
  4. 在线支付订单且订单状态为「待付款」,买家可取消该订单
  5. 在线支付订单因风控取消后 消息过来的整体数据参数如下: 这个是data里面所包含的参数如下: 在这里,我们主要是要用到父订单id 二、抖音运营反馈的业务需求分析 需求分析如下:
  6. 第1种场景: 订单未被拉取到数据库中,在平台上仍然是“待发货”的状态, 客户已经取消整个订单; 解决方案:消息通知,查询订单表,如果没有查询到该订单号,则代表该订单还没拉入到数据库内,则消息无需处理,那最后,在抖音订单拉单这一个环节,需要设置过滤掉已退款状态的订单即可。 2.第2种场景: 订单已经被拉取到数据库中,但是物流快递单号还没回传,在平台上仍然是“待发货”的状态,客户已经取消整个订单: 解决方案:消息通知,查询到该订单,如果该订单已经推送到物流系统发货了,则发短信通知到抖音运营人员,人工拦截物流;如果该订单还没有推送到物流系统发货,则调用物流系统的相关接口,取消出库操作等等。 三、整体的业务开发思路 最终方案: 1.先开发消息推送的功能,先把过来的消息保存在第三方消息表中
  7. 然后开启异步操作,在实时查询订单表,是否有该订单号,如果无,无需处理 3.如果有,则判断该订单是否已经推送到物流系统发货,如果无,则调用物流相关的接口,取消出库 4.如果需要,则通过短信通知抖音运营人员,由人工介入处理物流发货等操作。 四、订单取消消息的代码开发 代码如下(示例):
/**      * 接收抖音第三方开发平台推送过来的订单取消消息      * @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.实时保存抖音平台过来的订单取消消息 代码如下(示例):

/**      * 实时保存抖音平台过来的订单取消消息      * @param orderCancelMessage      */     @ApiOperation(tags = "TiktokEkOrder", value = "saveOrderCancelMessage", notes = "实时保存订单取消消息")     @ApiImplicitParams({@Param(name = "orderCancelMessage", value = "订单取消消息", required = true, dataType = "String")})     @RequestMapping(value = "/saveOrderCancelMessage")     public void saveOrderCancelMessage(@RequestParam("orderCancelMessage") String orderCancelMessage) {}

重构后的代码如下:

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("解析推送数据为空");
} else {
logger.info("接收抖音第三方开发平台推送过来的消息请求体{}", Jack.toJson(pushMessage.getData()));
// TODO: 存储消息操作
if (pushMessage.getData().get(0).getTag().equals("106")) {
TiktokMsgNotifyBean tiktokMsgNotifyBean = new TiktokMsgNotifyBean();
tiktokMsgNotifyBean.setMsgType("106");
// 取消订单类型消息
tiktokMsgNotifyBean.setMsgContent(pushMessage.getBody());
tiktokMsgNotifyBean.setProcResult("20");
Integer a = tiktokMsgNotifyService.save(tiktokMsgNotifyBean);
logger.info("新增了{}条消息", a);
}
List<DoudianPushData> pushDataList = pushMessage.getData();
// 业务处理
createThead(pushDataList);
// java 异步处理
// 接收处理成功
result.setCode(0);
result.setMsg("success");
logger.info(" 接收抖音第三方开发平台推送过来的消息 接收处理成功");
}
} catch (Exception e) {
// 接收处理失败
result.setCode(40044);
result.setMsg("接收处理失败消息");
}
return result;
}

在处理订单取消业务时,首先需要通过查询第三方消息表来遍历订单取消消息。获取到订单取消消息data数据后,将其转化为Java对象,并针对具体的业务进行处理。以下是一个示例代码:

List<TiktokMsgNotifyBean> tiktokMsgNotifyBeans = tiktokOrderService.findTiktokMsgNotifyBeans(); // 查询抖音消息表
for (int i = 0; i < tiktokMsgNotifyBeans.size(); i++) {
String body = tiktokMsgNotifyBeans.get(i).getMsgContent(); // 获取抖音消息体内容
List<DoudianPushData> pushDataList = getDatas(body); // 根据消息体内容获取推送数据列表
for (DoudianPushData pushData : pushDataList) {
if (StringUtils.equals(pushData.getTag(), "106")) { // 如果标签为106
try {
logger.info("获取到抖音取消订单消息106:" + pushData.getTag());
DoudianTradeTradeCanceled106 tradeTradeCanceled106 = pushData.toObject(DoudianTradeTradeCanceled106.class); // 将消息体TAG106转为DoudianTradeTradeCanceled106对象
BizAssert.isTrue(tradeTradeCanceled106 != null, "接收抖音第三方开发平台推送过来的消息 消息体 TAG106 转Objecct失败"); // 验证转化是否成功
// 具体业务处理
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

这段代码首先查询了抖音消息表,然后遍历了订单取消消息。对于每个消息,它获取了消息体内容,并根据内容获取了推送数据列表。接下来,它检查推送数据列表中是否有标签为”106”的数据。如果有,它会尝试将这个消息体转换为一个特定的Java对象(DoudianTradeTradeCanceled106)。如果转换成功,它会进行具体的业务处理;如果转换失败,它会记录错误信息。 在抖音开放平台,我们引入了一项新的功能——实时退款消息推送。这一功能的目的在于确保商家能够及时接收到退款通知,从而避免因系统未及时处理订单而造成的损失。 为了实现这一点,我们需要与抖音开发平台进行对接,确保退款消息能够准确无误地传达给相应的系统。如果未能正确通知到对接的系统,可能会导致商品被错误地发出,进而造成商家的损失。因此,实时退款消息通知对于自研系统的可靠性至关重要。