package com.ruoyi.web.controller.tool.monitor;
|
import cn.hutool.http.HttpRequest;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.fastjson2.JSONObject;
|
import com.ruoyi.common.redis.service.RedisService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.codec.binary.Hex;
|
import org.apache.commons.codec.binary.StringUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Component;
|
|
import java.security.*;
|
import java.security.spec.PKCS8EncodedKeySpec;
|
import java.util.Base64;
|
import java.util.LinkedHashMap;
|
import java.util.Map;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* 获取token
|
*/
|
@Slf4j
|
@Component
|
public class TokenFetcher {
|
|
@Value("${qianliyan.config.appId}")
|
private String appId;
|
@Value("${qianliyan.config.secret}")
|
private String secret;
|
@Value("${qianliyan.config.tokenUrl}")
|
private String tokenUrl;
|
@Value("${qianliyan.config.privateKey}")
|
private String privateKey;
|
private static final String TOKEN_KEY = "token_key:";
|
|
@Autowired
|
private RedisService redisService;
|
|
/**
|
* 获取token
|
* @return token
|
*/
|
public String getToken() {
|
try {
|
String token = redisService.getCacheObject(TOKEN_KEY);
|
if(org.springframework.util.StringUtils.hasLength(token)){
|
return token;
|
}
|
|
String timestamp = String.valueOf(System.currentTimeMillis());
|
|
String sig = Hex.encodeHexString(MessageDigest.getInstance("MD5").digest(StringUtils.getBytesUtf8(appId+secret)));
|
|
JSONObject requestBody = new JSONObject();
|
requestBody.put("operatorType", 1);
|
requestBody.put("sig", sig);
|
String requestBodyStr = requestBody.toString();
|
|
// 2. 计算请求体MD5
|
String md5 = DigestUtils.md5Hex(String.valueOf(requestBody));
|
|
// 3. 构建签名字符串
|
Map signParams = new LinkedHashMap();
|
signParams.put("appid", appId);
|
signParams.put("md5", md5);
|
signParams.put("timestamp", timestamp);
|
signParams.put("version", "1.0.0");
|
String jsonString = JSONUtil.toJsonStr(signParams);
|
|
// 4. RSA签名
|
byte[] keyBytes = Base64.getDecoder().decode(privateKey);
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
|
PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
|
|
Signature signature = Signature.getInstance("SHA1WithRSA");
|
signature.initSign(priKey);
|
signature.update(jsonString.getBytes("UTF-8"));
|
String signatureString = Base64.getEncoder().encodeToString(signature.sign());
|
|
// 5. 发送请求
|
String response = HttpRequest.post(tokenUrl)
|
.header("content-type", "application/json")
|
.header("appid", appId)
|
.header("md5", md5)
|
.header("timestamp", timestamp)
|
.header("version", "1.0.0")
|
.header("signature", signatureString)
|
.body(requestBodyStr)
|
.execute().body();
|
|
System.err.println("Response: " + response);
|
|
JSONObject jsonObject = JSONObject.parseObject(response);
|
|
if ("000000".equals(jsonObject.getString("resultCode"))) {
|
log.info("获取token成功");
|
JSONObject data = jsonObject.getJSONObject("data");
|
Long expiresIn = data.getLong("expires_in");
|
token = data.getString("token");
|
redisService.setCacheObject(TOKEN_KEY, token, expiresIn, TimeUnit.SECONDS);
|
return token;
|
}else {
|
log.error("获取token失败");
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
}
|