| | |
| | | * 获取企业微信应用的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; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // Token不存在或已过期,刷新Token |
| | | return refreshAppAccessToken(corpId, corpSecret); |
| | | return refreshAppAccessToken(corpId, secret); |
| | | } catch (Exception e) { |
| | | log.error("获取企业微信AccessToken失败", e); |
| | | return null; |
| | |
| | | * 刷新企业微信应用的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); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获取企业微信小程序的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-禁用 |