DyLoginVo
@Data
public class DyLoginVo {
private String code;
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/");
}
@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");
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);
}
}