springboot 整合 抖音 移动应用 授权

后端开发,因为没有JavaSDK,maven依赖,用到的是API接口去调用

抖音API开发文档

开发前先申请好移动应用,抖音控制台-移动应用

之后还需要开通所有能开通的能力

拿到应用的 clientKey 和 clientSecret,就可以进入开发了

在your_project/src/main/resources/application.yml中加入 抖音配置

kuaishou:
  ……
  ……

douyin:
  clientKey: xxxxxxxxxxx
  clientSecret: xxxxxxxxxxxxxxxxxxxxxxxx

创建抖音配置类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "douyin")
public class DouyinConfig {

    /**
     * 应用唯一标识,即AppID。
     */
    private String clientKey;

    /**
     * 应用唯一标识对应的密钥
     */
    private String clientSecret;

    /**
     * token/ticket的缓存时间
     * 1h50min
     */
    private final Long cacheTime=6600L;

    /**
     * 该接口用于获取接口调用的凭证 client_token。该接口适用于抖音授权;
     */
    private final String clientTokenUrl = "https://open.douyin.com/oauth/client_token/";

    /**
     * 该接口用于 h5 链接拉起抖音发布器分享视频时对开发者身份进行验签
     */
    private final String openTicketUrl = "https://open.douyin.com/open/getticket/";

    /**
     * 获取用户授权第三方接口调用的凭证 access_token
     */
    private final String accessTokenUrl = "https://open.douyin.com/oauth/access_token/";

    /**
     * 追踪分享的视频是否成功
     */
    private final String shareUrl = "https://open.douyin.com/share-id/";

    /**
     * 粉丝关系检测
     */
    private final String fansCheck = "https://open.douyin.com/fans/check/";

    /**
     * 视频详情页跳转链接获取
     */
    private final String videoInfo = "https://open.douyin.com/api/douyin/v1/schema/get_item_info/";

创建绑定抖音接口

import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 绑定第三方
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/bound")
public class BoundThirdPartController extends BaseController {

    private final ISysUserService userService;

    /**
     * 绑定抖音
     */
    @PostMapping("/douyin")
    public R<Void> boundDouyin(@Validated @RequestBody DouyinBound bound) {
        return toAjax(userService.boundDouyin(bound, getUserId()));
    }

    /**
     * 绑定快手
     * @param bound
     * @return
     */
    @PostMapping("/kuaishou")
    public R<Void> boundKuaishou(@Validated @RequestBody KuaishouBound bound){
        return toAjax(userService.boundKuaishou(bound, getUserId()));
    }
}



import lombok.Data;
import javax.validation.constraints.NotBlank;

@Data
public class DouyinBound {

    /**
     * 抖音授权码
     */
    @NotBlank(message = "抖音授权码不能为空")
    private String douyinCode;
}

 userService实现

    private final IDouyinService douyinService;

    @Override
    public boolean boundDouyin(DouyinBound bound, Long userId) {
        //根据授权码获取抖音授权信息
        JSONObject json = douyinService.getDouyinAccessToken(bound.getDouyinCode());
        String accessToken = json.get("access_token", String.class);
        String openId = json.get("open_id", String.class);
        Integer expiresIn = json.get("expires_in", Integer.class);
        //查看此openid是否有被绑定过
        SysUser old = userMapper.selectOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getDouyinOpenId, openId));
        if (ObjectUtil.isNotNull(old)) {
            if (!old.getUserId().equals(userId)) {
                //自己绑定过
                //throw new ServiceException("您已绑定该抖音账户,请勿重复绑定!");
                //别人绑定过
                throw new ServiceException("该抖音已绑定到其他用户!");
            }
        } else {
            //更新用户数据
            SysUser user = new SysUser();
            user.setUserId(userId);
            user.setDouyinOpenId(openId);
            return baseMapper.updateById(user) > 0;
        }
        RedisUtils.setCacheObject(CacheConstants.DOUYIN_ACCESS_TOKEN + userId, accessToken, Duration.ofSeconds(expiresIn));
        return true;
    }

抖音service 实现

@Slf4j
@RequiredArgsConstructor
@Service
public class DouyinServiceImpl implements IDouyinService {

    private final DouyinConfig douyinConfig;
    
    /**
    * access_token 为用户授权第三方接口调用的凭证,存储在客户端,可能会被窃取,泄漏后可能会发生用户隐私数据泄漏的风险,建议存储在服务端。
    */
    @Override
    public JSONObject getDouyinAccessToken(String code) {
        //请求参数
        Map<String, Object> parma = new HashMap<>();
        parma.put("grant_type", "authorization_code");
        parma.put("code", code);
        parma.put("client_secret", douyinConfig.getClientSecret());
        parma.put("client_key", douyinConfig.getClientKey());
        //发送请求
        JSONObject result = JSONUtil.parseObj(HttpUtil.post(douyinConfig.getAccessTokenUrl(), parma));
        //解析结果
        if ("success".equals(result.get("message"))) {
            JSONObject data = JSONUtil.parseObj(result.get("data"));
            if (StringUtils.isEmpty(data.get("access_token", String.class)) ||
                StringUtils.isEmpty(data.get("open_id", String.class))) {
                throw new ServiceException("授权码错误");
            }
            return data;
        } else {
            JSONObject data = JSONUtil.parseObj(result.get("data"));
            String errorCode = data.get("error_code", String.class);
            if ("10007".equals(errorCode)) {
                throw new ServiceException("授权码过期");
            } else {
                log.error("抖音:error:{}", data.get("description", String.class));
                throw new ServiceException("抖音:error:" + data.get("description", String.class));
            }
        }
    }
}

绑定抖音用户已实现,更多java springboot实现抖音功能,请看后续文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 三维图表绘制指南

Python 三维图表绘制指南 在数据可视化中&#xff0c;三维图表可以更直观地展示数据之间的关系&#xff0c;尤其是当数据具有多个维度时。Python 提供了多个库来绘制三维图表&#xff0c;其中最常用的就是 Matplotlib。本文将介绍如何使用 Matplotlib 绘制三维图表&#xff0c…

Node.js:Express 服务 路由

Node.js&#xff1a;Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架&#xff0c;可以快速开发一个web框架。本质是一个包&#xff0c;可以通过npm直接下载。 创建服务 Express创建一…

计算机网络-以太网小结

前导码与帧开始分界符有什么区别? 前导码--解决帧同步/时钟同步问题 帧开始分界符-解决帧对界问题 集线器 集线器通过双绞线连接终端, 学校机房的里面就有集线器 这种方式仍然属于共享式以太网, 传播方式依然是广播 网桥: 工作特点: 1.如果转发表中存在数据接收方的端口信息…

学生成绩查询系统设计与实现

学生成绩查询系统设计与实现 1. 系统概述 学生成绩查询系统是一个基于PHP和SQL的Web应用程序&#xff0c;旨在为学校提供一个高效的学生成绩管理和查询平台。该系统可以帮助教师录入成绩、学生查询成绩、管理员管理用户和成绩数据&#xff0c;提高教育管理的效率和透明度。 2…

Rust 力扣 - 2653. 滑动子数组的美丽值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的的窗口 因为数据范围比较小&#xff0c;所以我们可以通过计数排序找到窗口中第k小的数 如果小于0&#xff0c;则该窗口的美丽值为第k小的数如果大于等于0&#xff0c;则该窗口的美丽值为0 题…

VisualStudio远程编译调试linux_c++程序(二)

前章讲述了gdb相关&#xff0c;这章主要讲述用VisualStudio调试编译linux_c程序 1&#xff1a;环境 win10 VisualStudio 2022 Community ubuntu22.04 2:安装 1>vs安装时&#xff0c;勾选 使用c进行linux 和嵌入式开发 (这里以vs2022为例) OR VS安装好了&#xff0c; 选择工…

音视频听译:助力多维度沟通与发展的大门

在全球经济一体化的大背景下&#xff0c;企业之间的跨国合作愈发频繁。在商务会议、谈判和产品演示等活动中&#xff0c;语言的多样性成为了一大挑战。而音视频听译服务能够将不同语言的音频准确转换为目标语言文字&#xff0c;确保信息的精准传达&#xff0c;避免因语言障碍引…

基于MATLAB人脸检测的汽车疲劳驾驶检测

课题介绍 疲劳驾驶导致汽车交通事故逐年增加&#xff0c;为了提升驾车的安全性&#xff0c;需对驾驶员疲劳状态实时监测并及时提醒. 为了提高疲劳驾驶判断效率及准确率&#xff0c;本文运用Viola-Jones 框架特征矩阵进行人脸预判断&#xff1b;预判断过程中为了减少Haar 值计算…

论文阅读(三十二):EGNet: Edge Guidance Network for Salient Object Detection

文章目录 1.Introduction2.Related Works3.Salient Edge Guidance Network3.1Complementary information modeling3.1.1Progressive salient object features extraction3.1.2Non-local salient edge features extraction 3.2One-to-one guidance module 4.Experiments4.1Imple…

MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题

1. limit 100000,10 和 limit 10区别 LIMIT 100000, 10&#xff1a; 这个语句的意思是&#xff0c;从查询结果中跳过前100000条记录&#xff0c;然后返回接下来的10条记录。这通常用于分页查询中&#xff0c;当你需要跳过大量的记录以获取后续的记录时。例如&#xff0c;如果你…

源码侦探:理解 numpy 中的 tile 方法

文章目录 pre &#xff1a;先来一张源码的切片1. 参数和基本定义&#xff1a;2. 将 reps 转换为元组&#xff1a;3. 提升数组维度&#xff1a;4. 特殊情况检查&#xff1a;5. 处理数组维度的不同情况&#xff1a;6. 计算输出数组的形状&#xff1a;7. 通过重复构造数组&#xf…

单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构

目录 一、合并两个有序链表 二、链表分割 三、链表的回文结构 u解题的总体思路&#xff1a; 合并两个有序链表&#xff1a;首先创建新链表的头节点&#xff08;哨兵位&#xff1a;本质上是占位子&#xff09;&#xff0c;为了减少一些判断情况&#xff0c;简化操作。然后我们…

Qt6 CMake 中引入 Qt Linguist 翻译功能

qt cmake 使用自带翻译工具配置步骤 创建Qt CMake 程序配置项目 CMake 及 代码使用流程最终CMake 如下最终工程链接为&#xff1a;参考 创建Qt CMake 程序 配置项目 CMake 及 代码 在CMake 中添加如下代码, 导入相关的翻译库 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPON…

Android IPC机制(一)多进程模式

1. 什么是进程&#xff1f; 进程是操作系统分配资源&#xff08;如 CPU、内存等&#xff09;的基本单位。简单来说&#xff0c;进程是一个正在执行的程序的实例。每个进程都有自己的内存空间、数据栈和其他辅助数据&#xff0c;用于跟踪进程的执行状态。在 Android 中&#xff…

SQL,力扣题目1767,寻找没有被执行的任务对【递归】

一、力扣链接 LeetCode_1767 二、题目描述 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

《JVM第3课》运行时数据区

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 运行时数据区结构图如下&#xff1a; 可分为 5 个区域&#xff0c;分别是方法区、堆区、虚拟机栈、本地方法栈、程序计数器。这里大概介绍一下各个模块的作用&#xff0c;会在后面的文章展开讲。 类加载子系统会把类信息…

[ 问题解决篇 ] 解决远程桌面安全登录框的问题

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件

Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件 可视区域没超过当前屏幕高度时候只显示三个菜单效果 可视区域超过当前屏幕高度时,显示可回到顶部菜单的,当然这个菜单显示条件可以自定义,根据需求设置 然后将这个整体功能创建为一个全局组件 代…

苏州金龙新V系客车创新引领旅游出行未来

10月25日&#xff0c;为期三天的“2024第六届旅游出行大会”在风景秀丽的云南省丽江市落下帷幕。本次大会由中国旅游车船协会主办&#xff0c;全面展示了中国旅游出行行业最新发展动态和发展成就&#xff0c;为旅游行业带来全新发展动力。 在大会期间&#xff0c;备受瞩目的展车…

看门狗电路原理与应用

看门狗的原理与应用 看门狗基本原理 看门狗&#xff0c;英文简称为“Watchdog Timer ”或者“Watchdog”&#xff1b; 本质上就是一个定时器的作用&#xff0c;简单理解就是 MCU发出一个周期性的信号&#xff0c;这个信号是满足看门狗芯片内部计时器的时间限制&#xff0c;则…