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; } }