Java 抖音授权登录

DyLoginVo

@Data
public class DyLoginVo {
    private String code;
    // dy 抖音, tt 头条, xg 西瓜
    private String btyeDanceType = "dy";
    // 加密手机号
    private String encryptedMobile;
}

授权代码

public final static Map<String, String> btyeDanceTypeApi = new HashMap<String, String>();

	static {
		// 抖音授权
		btyeDanceTypeApi.put("dy", "https://open.douyin.com/");
		// 头条授权
		btyeDanceTypeApi.put("tt", "https://open.snssdk.com/");
		// 西瓜视频
		btyeDanceTypeApi.put("xg", "https://open-api.ixigua.com/");
	}

	/**
	 * 抖音授权登录
	 * @param vo
	 * @return
	 */
	@Override
	public CommonResult loginForDy(DyLoginVo vo) {
		if (StringUtils.isEmpty(vo.getCode())) {
			return CommonResult.error("code 不能为空");
		}
		String appid = "填写你的appid";
		String key = "填写你的appKey";
		/**
		 * 获取用户基本信息
		 */
		Map<String, String> param = new HashMap<>();
		param.put("client_key", appid);
		param.put("client_secret", key);
		param.put("code", vo.getCode());
		param.put("grant_type", "authorization_code");
		String baseDataStr = HttpKit.sendGet(btyeDanceTypeApi.get(vo.getBtyeDanceType()) + "oauth/access_token", param);
		JSONObject baseDataObject = JSON.parseObject(baseDataStr);
		if (baseDataObject.get("data") == null) {
			logger.info("获取字节用户基本信息异常 req => {} , res => {}", JSON.toJSONString(param), baseDataStr);
			return CommonResult.error("获取用户信息失败");
		}
		JSONObject baseData = baseDataObject.getJSONObject("data");
		if (baseData.get("open_id") == null) {
			logger.info("获取字节用户基本信息异常 req => {} , res => {}", JSON.toJSONString(param), baseDataStr);
			return CommonResult.error("获取用户信息失败");
		}
		String openId = baseData.get("open_id").toString();
		String accessToken = baseData.get("access_token").toString();

		// 此刻可以判断用户是否存在, 可注册
		Integer count = memberMapper.selectCount(new QueryWrapper<Member>().eq("openid", openId));
		if (count > 0) {
			// 存在, 组装返回信息
			Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("openid", openId).last("LIMIT 1"));
			return CommonResult.ok(member);
		} else {
			// 不存在, 获取用户公开信息
			param.clear();
			param.put("open_id", openId);
			param.put("access_token", accessToken);
			String publicDataStr = HttpKit.sendGet(btyeDanceTypeApi.get(vo.getBtyeDanceType()) + "oauth/userinfo", param);
			JSONObject publicDataObject = JSON.parseObject(publicDataStr);
			JSONObject data = publicDataObject.getJSONObject("data");

			/**
			data => {
				    "avatar": "https://example.com/x.jpeg",
				    "city": "上海",
				    "country": "中国",
				    "description": "",
				    "e_account_role": "<nil>",
				    "error_code": "0",
				    "gender": "<nil>",
				    "nickname": "张伟",
				    "open_id": "0da22181-d833-447f-995f-1beefea5bef3",
				    "province": "上海",
				    "union_id": "1ad4e099-4a0c-47d1-a410-bffb4f2f64a4"
				  }
			*/

			Member member = new Member();
			member.setCreated(new Date());
			member.setUpdated(new Date());
			member.setNickName(data.getString("nickname"));
			if (StringUtils.isNotEmpty(vo.getEncryptedMobile())) {
				try {
					member.setUserPhone(DyUtil.getMobile(key, vo.getEncryptedMobile()));
				} catch (Exception e) {
					return CommonResult.error("手机号解密失败!");
				}
			}
			member.setOpenid(openId);
			// 头像
			member.setUserPic(data.getString("avatar"));
			if ("dy".equals(vo.getBtyeDanceType())) {
				member.setUserType(1);
			}
			if ("tt".equals(vo.getBtyeDanceType())) {
				member.setUserType(2);
			}
			if ("xg".equals(vo.getBtyeDanceType())) {
				member.setUserType(3);
			}
			memberMapper.insert(member);
			return CommonResult.ok(member);
		}
	}

解密抖音手机号


public class DyUtil {

    public static String getMobile(String clientSecret, String encryptedMobile) throws Exception {
        byte[] clientSecretBytes = clientSecret.getBytes();
        SecretKey secretKey = new SecretKeySpec(clientSecretBytes, 0, clientSecretBytes.length, "AES");
        byte[] iv = Arrays.copyOfRange(clientSecretBytes, 0, 16);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        String algorithm = "AES/CBC/PKCS5Padding";
        String mobile = decrypt(algorithm, encryptedMobile, secretKey, ivParameterSpec);
        return mobile;
    }

    public static String decrypt(String algorithm, String cipherText, SecretKey key, IvParameterSpec iv)
            throws Exception {
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.DECRYPT_MODE, key, iv);
        byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));
        return new String(plainText);
    }
}

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
抖音授权小程序的实现需要以下步骤: 1. 在抖音开放平台注册开发者账号,创建应用并获取AppKey和AppSecret。 2. 在小程序中引入抖音开放平台的SDK,并初始化SDK。 3. 在小程序中实现用户授权登录功能,调用SDK提供的授权接口。 4. 授权成功后,SDK会返回access_token和open_id等信息,开发者可以根据这些信息调用抖音开放平台提供的API,获取用户信息或者进行其他操作。 以下是一个简单的Java代码示例,演示了如何实现抖音授权小程序: ``` import com.douyin.open.api.*; // 初始化SDK DouyinOpenConfig config = new DouyinOpenConfig.Builder() .setAppKey("your_app_key") .setAppSecret("your_app_secret") .build(); DouyinOpenSDK sdk = new DouyinOpenSDK(config); // 用户授权登录 String redirectUrl = "your_redirect_url"; String state = "your_state"; String authUrl = sdk.oauth2buildAuthorizationUrl(redirectUrl, state); // 将authUrl返回给小程序,让用户进行授权 // 授权成功后,获取access_token和open_id等信息 String code = "user_authorization_code"; DouyinOpenOAuth2AccessToken accessToken = sdk.oauth2getAccessToken(code); // 根据access_token和open_id等信息,调用API获取用户信息 String accessTokenStr = accessToken.getAccessToken(); String openId = accessToken.getOpenId(); DouyinOpenUsersClient usersClient = sdk.getUserClient(accessTokenStr); DouyinOpenUsersUserinfoResponse userinfo = usersClient.getUserinfo(openId); System.out.println(userinfo.getNickname()); ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值