wlzboy
5 天以前 7de1396e315896dbc72a9d54e44f77434ea90f18
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/QyWechatAccessTokenServiceImpl.java
@@ -31,15 +31,15 @@
     * 获取企业微信应用的AccessToken
     *
     * @param corpId 企业ID
     * @param corpSecret 应用密钥
     * @param secret 应用密钥或小程序密钥
     * @return AccessToken
     */
    @Override
    public String getAppAccessToken(String corpId, String corpSecret) {
    public String getAppAccessToken(String corpId, String secret) {
        try {
            // 参数校验
            if (StringUtils.isEmpty(corpId) || StringUtils.isEmpty(corpSecret)) {
                log.warn("企业微信配置参数不完整,corpId或corpSecret为空");
            if (StringUtils.isEmpty(corpId) || StringUtils.isEmpty(secret)) {
                log.warn("企业微信配置参数不完整,corpId或secret为空");
                return null;
            }
@@ -77,7 +77,7 @@
            }
            // Token不存在或已过期,刷新Token
            return refreshAppAccessToken(corpId, corpSecret);
            return refreshAppAccessToken(corpId, secret);
        } catch (Exception e) {
            log.error("获取企业微信AccessToken失败", e);
            return null;
@@ -88,16 +88,16 @@
     * 刷新企业微信应用的AccessToken
     *
     * @param corpId 企业ID
     * @param corpSecret 应用密钥
     * @param secret 应用密钥或小程序密钥
     * @return 新的AccessToken
     */
    @Override
    public String refreshAppAccessToken(String corpId, String corpSecret) {
    public String refreshAppAccessToken(String corpId, String secret) {
        try {
            log.info("开始刷新企业微信AccessToken");
            // 构建请求URL
            String url = GET_ACCESS_TOKEN_URL + "?corpid=" + corpId + "&corpsecret=" + corpSecret;
            String url = GET_ACCESS_TOKEN_URL + "?corpid=" + corpId + "&corpsecret=" + secret;
            // 发送HTTP请求获取Token
            String response = sendHttpGetRequest(url);
@@ -135,6 +135,112 @@
    }
    /**
     * 获取企业微信小程序的AccessToken
     *
     * @param corpId 企业ID
     * @param corpSecret 小程序密钥
     * @return AccessToken
     */
    @Override
    public String getQyMiniAccessToken(String corpId, String corpSecret) {
        try {
            // 参数校验
            if (StringUtils.isEmpty(corpId) || StringUtils.isEmpty(corpSecret)) {
                log.warn("企业微信小程序配置参数不完整,corpId或corpSecret为空");
                return null;
            }
            // 检查服务是否启用
            if (!isEnabled()) {
                log.info("企业微信服务已禁用,无法获取小程序AccessToken");
                return null;
            }
            // 构建配置键名(使用不同的键名以区分普通应用和小程序)
            String tokenKey = "qy_wechat.mini_access_token." + corpId;
            String expiresKey = "qy_wechat.mini_access_token_expires." + corpId;
            // 从配置中获取Token和过期时间
            String accessToken = configService.selectConfigByKey(tokenKey);
            String expiresStr = configService.selectConfigByKey(expiresKey);
            // 检查Token是否存在且未过期
            if (StringUtils.isNotEmpty(accessToken) && StringUtils.isNotEmpty(expiresStr)) {
                try {
                    long expiresTime = Long.parseLong(expiresStr);
                    long currentTime = System.currentTimeMillis();
                    // 预留60秒安全边界,避免临界点过期
                    if (currentTime < expiresTime - 60000) {
                        log.debug("使用缓存的企业微信小程序AccessToken,剩余有效时间: {}秒",
                            (expiresTime - currentTime) / 1000);
                        return accessToken;
                    } else {
                        log.info("企业微信小程序AccessToken已过期或即将过期,需要刷新");
                    }
                } catch (NumberFormatException e) {
                    log.warn("解析企业微信小程序AccessToken过期时间失败: {}", expiresStr);
                }
            }
            // Token不存在或已过期,刷新Token
            return refreshQyMiniAccessToken(corpId, corpSecret);
        } catch (Exception e) {
            log.error("获取企业微信小程序AccessToken失败", e);
            return null;
        }
    }
    /**
     * 刷新企业微信小程序的AccessToken
     *
     * @param corpId 企业ID
     * @param corpSecret 小程序密钥
     * @return 新的AccessToken
     */
    public String refreshQyMiniAccessToken(String corpId, String corpSecret) {
        try {
            log.info("开始刷新企业微信小程序AccessToken");
            // 构建请求URL
            String url = GET_ACCESS_TOKEN_URL + "?corpid=" + corpId + "&corpsecret=" + corpSecret;
            // 发送HTTP请求获取Token
            String response = sendHttpGetRequest(url);
            if (StringUtils.isEmpty(response)) {
                log.error("获取企业微信小程序AccessToken失败,响应为空");
                return null;
            }
            // 解析响应
            QyWechatTokenResponse tokenResponse = parseTokenResponse(response);
            if (tokenResponse == null || StringUtils.isEmpty(tokenResponse.getAccessToken())) {
                log.error("解析企业微信小程序AccessToken响应失败: {}", response);
                return null;
            }
            // 计算过期时间(当前时间 + 有效期 - 60秒安全边界)
            long expiresTime = System.currentTimeMillis() + (tokenResponse.getExpiresIn() * 1000L) - 60000L;
            // 构建配置键名(使用不同的键名以区分普通应用和小程序)
            String tokenKey = "qy_wechat.mini_access_token." + corpId;
            String expiresKey = "qy_wechat.mini_access_token_expires." + corpId;
            // 保存到系统配置表
            configService.updateConfigValue(tokenKey, tokenResponse.getAccessToken());
            configService.updateConfigValue(expiresKey, String.valueOf(expiresTime));
            log.info("企业微信小程序AccessToken刷新成功,有效期: {}秒", tokenResponse.getExpiresIn());
            return tokenResponse.getAccessToken();
        } catch (Exception e) {
            log.error("刷新企业微信小程序AccessToken失败", e);
            return null;
        }
    }
    /**
     * 检查企业微信服务是否启用
     *
     * @return true-启用,false-禁用