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实现抖音功能,请看后续文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tenk啊

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值