|
|
@@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.checkerframework.checker.units.qual.A;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
import java.time.Duration;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.Objects;
|
|
|
@@ -30,32 +31,32 @@ import java.util.concurrent.locks.ReentrantLock;
|
|
|
public class TokenManager {
|
|
|
|
|
|
@Resource
|
|
|
- private ChargingUtil chargingUtil;
|
|
|
-
|
|
|
+ private OkHttpUtil okHttpUtil;
|
|
|
+
|
|
|
private static final String TOKEN_KEY = "api:local:accessToken";
|
|
|
private static final String TOKEN_REFRESH_LOCK_KEY = "api:token:refresh:lock";
|
|
|
private static final int DEFAULT_TOKEN_EXPIRE_HOURS = 24;
|
|
|
-
|
|
|
+
|
|
|
private final RedisTemplate<String, Object> redisTemplate;
|
|
|
|
|
|
// 本地锁,防止单JVM内重复刷新Token[2](@ref)
|
|
|
private final ReentrantLock localLock = new ReentrantLock();
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 获取有效的访问令牌(主入口方法)
|
|
|
*/
|
|
|
public String getValidAccessToken() {
|
|
|
// 尝试从Redis获取已存储的Token[1](@ref)
|
|
|
ApiToken apiToken = getStoredToken();
|
|
|
-
|
|
|
+
|
|
|
// 如果Token不存在或已过期,则刷新Token[1,3](@ref)
|
|
|
if (Objects.isNull(apiToken) || !apiToken.isValid()) {
|
|
|
apiToken = refreshAccessToken();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return apiToken.getAccessToken();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 从Redis获取存储的Token
|
|
|
*/
|
|
|
@@ -157,23 +158,65 @@ public class TokenManager {
|
|
|
.setOperatorID(ConnectivityConstants.OPERATOR_ID)
|
|
|
.setOperatorSecret(ConnectivityConstants.OPERATOR_SECRET);
|
|
|
|
|
|
- JsonObject response = chargingUtil.chargingRequest(ConnectivityConstants.QUERY_TOKEN, BeanUtil.beanToMap(queryTokenParms), false);
|
|
|
+ RequestParmsEntity requestParms = new RequestParmsEntity();
|
|
|
+ SequenceGenUtil.SequenceResult result = SequenceGenUtil.generate();
|
|
|
+
|
|
|
+ requestParms
|
|
|
+ .setOperatorID(ConnectivityConstants.OPERATOR_ID)
|
|
|
+ .setData(AESCryptoUtil.decrypt(queryTokenParms.toString(), ConnectivityConstants.DATA_SECRET, ConnectivityConstants.DATA_SECRET_IV))
|
|
|
+ .setTimeStamp(result.getTimestamp())
|
|
|
+ .setSeq(result.getSequence())
|
|
|
+ .setSig(HmacMD5Util.genSign(requestParms.getOperatorID(), requestParms.getData(), requestParms.getTimeStamp(), requestParms.getSeq(), ConnectivityConstants.SIG_SECRET));
|
|
|
+
|
|
|
+ JsonObject response = okHttpUtil.doPostForm(ConnectivityConstants.QUERY_TOKEN, BeanUtil.beanToMap(requestParms), null);
|
|
|
|
|
|
if (Objects.isNull(response)) {
|
|
|
log.error("调用第三方接口获取Token失败");
|
|
|
return null;
|
|
|
}
|
|
|
- JsonObject decode = chargingUtil.responseDecode(response);
|
|
|
+
|
|
|
+
|
|
|
Gson gson = new Gson();
|
|
|
- QueryTokenResponseData responseData = gson.fromJson(decode, QueryTokenResponseData.class);
|
|
|
+ ResponseParmsEntity responseParms = gson.fromJson(response, ResponseParmsEntity.class);
|
|
|
+ String data = responseParms.getRet() + responseParms.getMsg() + responseParms.getData();
|
|
|
+ boolean verify = HmacMD5Util.verify(data, ConnectivityConstants.PLATFORM_SIG_SECRET, responseParms.getSig());
|
|
|
+ if (!verify) {
|
|
|
+ log.error("第三方接口响应数据签名验证失败");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (responseParms.getRet() != 0) {
|
|
|
+ switch (responseParms.getRet()) {
|
|
|
+ case -1:
|
|
|
+ log.error("系统繁忙,此时请求方稍后重试");
|
|
|
+ break;
|
|
|
+ case 4001:
|
|
|
+ log.error("签名错误");
|
|
|
+ break;
|
|
|
+ case 4002:
|
|
|
+ log.error("Token错误");
|
|
|
+ break;
|
|
|
+ case 4003:
|
|
|
+ log.error("参数不合法,缺少必需的示例:OperatorID、Sig、TimeStamp、Data、Seq五个参数");
|
|
|
+ break;
|
|
|
+ case 4004:
|
|
|
+ log.error("请求的业务参数不合法,各接口定义自己的必须参数");
|
|
|
+ break;
|
|
|
+ case 500:
|
|
|
+ log.error("系统错误");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String decodeData = AESCryptoUtil.decrypt(responseParms.getData(), ConnectivityConstants.PLATFORM_DATA_SECRET,
|
|
|
+ ConnectivityConstants.PLATFORM_DATA_SECRET_IV);
|
|
|
+ QueryTokenResponseData responseData = gson.fromJson(decodeData, QueryTokenResponseData.class);
|
|
|
|
|
|
- if (responseData.getSuccStat() == 1){
|
|
|
+ if (responseData.getSuccStat() == 1) {
|
|
|
//0-无,1-OperatorID无效
|
|
|
String failReason = "";
|
|
|
- if (responseData.getFailReason() == 0){
|
|
|
+ if (responseData.getFailReason() == 0) {
|
|
|
failReason = "无";
|
|
|
}
|
|
|
- if(responseData.getFailReason() == 1){
|
|
|
+ if (responseData.getFailReason() == 1) {
|
|
|
failReason = "OperatorID无效";
|
|
|
}
|
|
|
log.error("调用第三方接口获取Token失败,失败原因: {}", failReason);
|