|
|
@ -1,24 +1,37 @@ |
|
|
|
package com.ccsensptos.tallsdk.util; |
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil; |
|
|
|
import cn.hutool.core.collection.CollectionUtil; |
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
import cn.hutool.core.util.StrUtil; |
|
|
|
import cn.hutool.http.HttpUtil; |
|
|
|
import com.alibaba.fastjson.JSON; |
|
|
|
import com.alibaba.fastjson.JSONArray; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import com.ccsens.util.RedisUtil; |
|
|
|
import com.ccsens.util.RestTemplateUtil; |
|
|
|
import com.ccsensptos.tallsdk.bean.dto.TokenDto; |
|
|
|
import com.ccsensptos.tallsdk.bean.vo.TokenVo; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
|
|
|
|
import javax.annotation.PostConstruct; |
|
|
|
import javax.annotation.Resource; |
|
|
|
import javax.servlet.http.HttpServlet; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
/** |
|
|
|
* @author 逗 |
|
|
|
*/ |
|
|
|
@Component |
|
|
|
@Slf4j |
|
|
|
public class TokenUtil { |
|
|
|
|
|
|
|
public static final String REDIS_IS_OPEN = "1"; |
|
|
|
/**缓存token或用户信息*/ |
|
|
|
public static Map<String, Object> accessTokenMap = new HashMap<>(); |
|
|
|
|
|
|
|
public static String openRedis; |
|
|
|
|
|
|
|
@Value("${spring.application.sdk-cache-redis:}") |
|
|
|
public void setApplication(String redis) { |
|
|
|
openRedis = redis; |
|
|
@ -37,11 +50,9 @@ public class TokenUtil { |
|
|
|
|
|
|
|
/** |
|
|
|
* 通过AppId获取accessToken |
|
|
|
* @param appId appId |
|
|
|
* @param secret secret |
|
|
|
* @return 返回accessToken |
|
|
|
*/ |
|
|
|
public static String getAccessToken(String appId,String secret){ |
|
|
|
public static String getAccessToken(String appId, String secret){ |
|
|
|
//查看业务是否开启redis缓存
|
|
|
|
// if(REDIS_IS_OPEN.equals(openRedis)){
|
|
|
|
// //redis开启则通过appId去redis内查询
|
|
|
@ -55,26 +66,80 @@ public class TokenUtil { |
|
|
|
|
|
|
|
//调用tall的接口生成accessToken
|
|
|
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
//查找map内的数据
|
|
|
|
long now = System.currentTimeMillis(); |
|
|
|
TokenVo.AccessToken accessToken = (TokenVo.AccessToken) accessTokenMap.get(appId); |
|
|
|
if(ObjectUtil.isNotNull(accessToken)){ |
|
|
|
if(accessToken.getTime() + Constant.EXPIRATION_TIME > now){ |
|
|
|
return accessToken.getAccessToken(); |
|
|
|
}else { |
|
|
|
//如果过期,就删掉数据
|
|
|
|
accessTokenMap.remove(appId); |
|
|
|
} |
|
|
|
} |
|
|
|
//map内查不到,则去请求tall获取新的accessToken
|
|
|
|
String url = Constant.TALL_URL + Constant.TALL_GET_ACCESS_TOKEN; |
|
|
|
TokenDto.GetAccessToken getAccessToken = new TokenDto.GetAccessToken(appId,secret); |
|
|
|
log.info("调用接口:{}--{}", url, getAccessToken); |
|
|
|
String postBody = RestTemplateUtil.postBody(url, getAccessToken); |
|
|
|
JSONObject jsonObject = JSONObject.parseObject(postBody); |
|
|
|
log.info("接口返回:{}", jsonObject); |
|
|
|
//请求正确返回则,否则无操作
|
|
|
|
Integer code = jsonObject.getInteger("code"); |
|
|
|
if (code == null || code != 200) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
String data = jsonObject.getString("data"); |
|
|
|
if(ObjectUtil.isNull(data)){ |
|
|
|
return null; |
|
|
|
} |
|
|
|
TokenVo.AccessToken t = new TokenVo.AccessToken(); |
|
|
|
t.setAccessToken(data); |
|
|
|
t.setTime(System.currentTimeMillis()); |
|
|
|
accessTokenMap.put(getAccessToken.getAppId(),t); |
|
|
|
return data; |
|
|
|
} |
|
|
|
|
|
|
|
// /**
|
|
|
|
// * 通过token获取用户信息
|
|
|
|
// * @return 返回accessToken
|
|
|
|
// */
|
|
|
|
// public static TokenVo.UserIdByToken getUserByToken(String token,){
|
|
|
|
// //查看业务是否开启redis缓存
|
|
|
|
//// if(REDIS_IS_OPEN.equals(openRedis)){
|
|
|
|
//// //查询token是否存在
|
|
|
|
//// util.redisUtil.get(token);
|
|
|
|
//// }
|
|
|
|
// //没开启redis则去map内查找,如果
|
|
|
|
//
|
|
|
|
// //调用tall的接口生成查询项目信息
|
|
|
|
//// TokenVo.UserIdByToken userIdByToken =
|
|
|
|
//
|
|
|
|
// return null;
|
|
|
|
// }
|
|
|
|
/** |
|
|
|
* 通过token获取用户信息 |
|
|
|
* @return 返回accessToken |
|
|
|
*/ |
|
|
|
public static TokenVo.UserIdByToken getUserByToken(TokenDto.GetUserByToken getUserByToken){ |
|
|
|
//查看业务是否开启redis缓存
|
|
|
|
// if(REDIS_IS_OPEN.equals(openRedis)){
|
|
|
|
// //查询token是否存在
|
|
|
|
// util.redisUtil.get(token);
|
|
|
|
// }
|
|
|
|
//没开启redis则去map内查找,如果
|
|
|
|
|
|
|
|
//调用tall的接口生成查询项目信息
|
|
|
|
|
|
|
|
//发送请求
|
|
|
|
String url = Constant.TALL_URL + Constant.TALL_USER_TOKEN; |
|
|
|
log.info("调用接口:{}--{}", url, getUserByToken); |
|
|
|
Map<String,String> map = new HashMap<>(); |
|
|
|
map.put(Constant.ACCESS_TOKEN,getAccessToken(getUserByToken.getAppId(),getUserByToken.getSecret())); |
|
|
|
String postBody = RestTemplateUtil.postBodySpecialHeader(url, getUserByToken,map); |
|
|
|
JSONObject jsonObject = JSONObject.parseObject(postBody); |
|
|
|
log.info("接口返回:{}", jsonObject); |
|
|
|
//请求正确返回则,否则无操作
|
|
|
|
Integer code = jsonObject.getInteger("code"); |
|
|
|
if (code == null || code != 200) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
String data = jsonObject.getString("data"); |
|
|
|
if(ObjectUtil.isNull(data)){ |
|
|
|
return null; |
|
|
|
} |
|
|
|
TokenVo.UserIdByToken userIdByToken; |
|
|
|
try { |
|
|
|
userIdByToken = JSON.parseObject(data,TokenVo.UserIdByToken.class); |
|
|
|
}catch (Exception e){ |
|
|
|
log.info("返回值转换失败"); |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
return userIdByToken; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|