接入抖音之webhook通知

一、官网地址:回调通知地址

二、java示例

@PostMapping(value = "/subscribeEvent")
    public void subscribe( HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 1. 读取原始请求体
        StringBuilder rawBody = new StringBuilder();
        try (BufferedReader reader = request.getReader()) {
            String line;
            while ((line = reader.readLine()) != null) {
                rawBody.append(line);
            }
        }

        String requestBody = rawBody.toString();
        // 2. 获取签名头
        String signature = request.getHeader("X-Douyin-Signature");

        // 3. 获取AppSecret(确保这是正确的密钥)
        String appSecret = tiktokProperties.getClientSecret();

        // 4. 计算签名
        String dataToSign = appSecret + requestBody;
        String calculatedSignature = DigestUtils.sha1Hex(dataToSign);

        // 6. 验证签名
        if (!calculatedSignature.equals(signature)) {
            response.setStatus(403);
            response.getWriter().write("Signature verification failed");
            return;
        }

        JSONObject jsonObject = JSONObject.parseObject(requestBody);
        JSONObject content = jsonObject.getJSONObject("content");
        String event = jsonObject.getString("event");
        logger.info("event:{}", event);
        Object logId = jsonObject.get("log_id");
        logger.info("logId:{}", logId);
        String key = null;
        if (logId != null){
             key = CacheConstants.TIKTOK_EVENT_LOG_ID + logId.toString();
            if (redisService.hasKey(key)){
                return;
            }
        }else {
            return;
        }
        //退款申请审核通知
        if (event.equals(TikTokConstants.WEBHOOK_EVENT_LIFE_HERMES_AKTE_AFTER_SALE_AUDIT)) {
            ...
        }
        //券审核结果通知
        if (event.equals(TikTokConstants.WEBHOOK_EVENT_LIFE_PRODUCT_COMMON_AUDIT)) {
            ...
        }
        // 7. 处理业务逻辑
        JSONObject rs = new JSONObject();
        rs.put("challenge", content.get("challenge"));
        response.getOutputStream().write(rs.toJSONString().getBytes(StandardCharsets.UTF_8));
    }

三、注意点:

需要一个https的网址,虽然win也可以弄个穿透,但是还是推荐服务器。因为它有一秒中超时验证码。穿透延迟低于1s也可以使用。另外需要返回它传过来的特定值。如果要写成对象接收,要注意参数顺序。照我这样写不需要理会。验签方法是密钥加上传过过来的参数字符串加密,再对传过来的签名进行比对。另外,如果没有创建应用,先去创建应用抖音控制台。通过后就可以用了。自己服务白名单一定要开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值