package com.qianwen.smartman.modules.sync.api; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.beust.jcommander.ParameterException; import com.jeecg.qywx.api.base.JwAccessTokenAPI; import com.jeecg.qywx.api.core.common.AccessToken; import com.jeecg.qywx.api.department.vo.Department; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.StringJoiner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.qianwen.smartman.common.utils.MessageUtils; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.redis.cache.BladeRedis; import com.qianwen.core.tool.api.IResultCode; import com.qianwen.core.tool.utils.SpringUtil; import com.qianwen.smartman.modules.sync.constant.OuterAppConfigConstant; import com.qianwen.smartman.modules.sync.constant.QyWechatApiConstant; import com.qianwen.smartman.modules.sync.constant.QyWechatConstant; import com.qianwen.smartman.modules.sync.entity.OuterAppConfig; import com.qianwen.smartman.modules.sync.entity.QyTag; import com.qianwen.smartman.modules.sync.entity.QyUser; import com.qianwen.smartman.modules.sync.entity.QyUserTicket; import com.qianwen.smartman.modules.sync.service.impl.OuterAppConfigServiceImpl; /* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/sync/api/QyWechatApi.class */ public class QyWechatApi { private static final Logger log = LoggerFactory.getLogger(QyWechatApi.class); public static List getDepartmentAll() { log.info("[企业微信获取所有的部门].[getDepartmentAll start]"); return listApi(null, QyWechatApiConstant.DEPARTMENT_LIST_URL, "department", Department.class, new String[0]); } public static List getDepartmentAll(String token) { log.info("[企业微信获取所有的部门].[getDepartmentAll start]"); return listApi(token, QyWechatApiConstant.DEPARTMENT_LIST_URL, "department", Department.class, new String[0]); } public static List getUsersByDepartId(String deptId) { log.info("[企业微信获取部门下的用户].[getUsersByDepartId start,departmentId={}]", deptId); return listApi(null, QyWechatApiConstant.USER_LIST_BY_DEPARTMENT_URL, QyWechatConstant.USER_LIST_KEY, QyUser.class, deptId); } public static List getUsersByDepartId(String token, String deptId) { log.info("[企业微信获取部门下的用户].[getUsersByDepartId start,departmentId={}]", deptId); return listApi(token, QyWechatApiConstant.USER_LIST_BY_DEPARTMENT_URL, QyWechatConstant.USER_LIST_KEY, QyUser.class, deptId); } public static List getTags() { log.info("[企业微信获取岗位列表].[getTags start]"); return listApi(null, QyWechatApiConstant.TAG_LIST_URL, QyWechatConstant.TAG_LIST_KEY, QyTag.class, new String[0]); } public static List getTags(String token) { log.info("[企业微信获取岗位列表].[getTags start]"); return listApi(token, QyWechatApiConstant.TAG_LIST_URL, QyWechatConstant.TAG_LIST_KEY, QyTag.class, new String[0]); } public static Map getUserTagMap() { Map resTagMap = new HashMap<>(); List tags = getTags(); for (QyTag tag : tags) { List userListByTag = getUserListByTag(tag.getTagid()); for (QyUser qyUser : userListByTag) { StringJoiner tagIdJoiner = resTagMap.get(qyUser.getUserid()); if (Objects.isNull(tagIdJoiner)) { StringJoiner postIdJoiner = new StringJoiner(","); postIdJoiner.add(tag.getTagid()); resTagMap.put(qyUser.getUserid(), postIdJoiner); } else { tagIdJoiner.add(tag.getTagid()); } } } return resTagMap; } public static Department getDeptById(String token, String deptId) { return (Department) getObjApi(token, QyWechatApiConstant.DEPT_GET_BY_ID_URL, Department.class, deptId); } public static Department getDeptById(String deptId) { return (Department) getObjApi(null, QyWechatApiConstant.DEPT_GET_BY_ID_URL, Department.class, deptId); } public static List getUserListByTag(String tagId) { log.info("[企业微信获取该岗位的员工].[getUserListByTag start,tagId={}]", tagId); return listApi(null, QyWechatApiConstant.TAG_USER_URL, QyWechatConstant.USER_LIST_KEY, QyUser.class, tagId); } public static List getUserListByTag(String token, String tagId) { log.info("[企业微信获取该岗位的员工].[getUserListByTag start,tagId={}]", tagId); return listApi(token, QyWechatApiConstant.TAG_USER_URL, QyWechatConstant.USER_LIST_KEY, QyUser.class, tagId); } public static QyUser getUserById(String userId) { log.info("[企业微信根据用户id获取用户].[getUserById start,userId={}]", userId); return (QyUser) getObjApi(null, QyWechatApiConstant.USERINFO_BY_ID_URL, QyUser.class, userId); } public static QyUser getUserById(String token, String userId) { log.info("[企业微信根据用户id获取用户].[getUserById start,userId={}]", userId); return (QyUser) getObjApi(token, QyWechatApiConstant.USERINFO_BY_ID_URL, QyUser.class, userId); } private static String getAccessToken(Integer type) { OuterAppConfigServiceImpl configService = (OuterAppConfigServiceImpl) SpringUtil.getBean(OuterAppConfigServiceImpl.class); OuterAppConfig appConfig = configService.getAppConfig(OuterAppConfigConstant.QY_WECHAT); if (Objects.isNull(appConfig)) { throw new ServiceException(MessageUtils.message("sync.qy.config.not.exist", new Object[0])); } String cacheKey = QyWechatConstant.TOKEN_KEY + (type.equals(QyWechatConstant.BOOK_TYPE) ? QyWechatConstant.BOOK_TYPE : QyWechatConstant.QY_APP_TYPE); BladeRedis bladeRedis = (BladeRedis) SpringUtil.getBean(BladeRedis.class); Object tokenObj = bladeRedis.get(cacheKey); if (!Objects.isNull(tokenObj)) { return String.valueOf(tokenObj); } String syncSecret = type.equals(QyWechatConstant.BOOK_TYPE) ? appConfig.getWxBookSecret() : appConfig.getWxAppSecret(); AccessToken accessToken = JwAccessTokenAPI.getAccessToken(appConfig.getWxCorpId(), syncSecret); if (Objects.isNull(accessToken)) { throw new ServiceException(MessageUtils.message("sync.qy.generate.token.fail", new Object[0])); } bladeRedis.setEx(cacheKey, accessToken.getAccesstoken(), Long.valueOf(accessToken.getExpiresIn())); return accessToken.getAccesstoken(); } public static String getBookAccessToken() { return getAccessToken(QyWechatConstant.BOOK_TYPE); } public static String getAppAccessToken() { return getAccessToken(QyWechatConstant.QY_APP_TYPE); } public static QyUserTicket getUserTicketByCode(String code) { log.info("[企业微信根据授权Code获取用户身份].[getUserTicketByCode code={}]", code); return (QyUserTicket) getObjApi(null, QyWechatApiConstant.USER_TICKET_URL, QyUserTicket.class, code); } public static QyUserTicket getUserTicketByCode(String token, String code) { log.info("[企业微信根据授权Code获取用户身份].[getUserTicketByCode code={}]", code); return (QyUserTicket) getObjApi(token, QyWechatApiConstant.USER_TICKET_URL, QyUserTicket.class, code); } public static QyUser getUserDetailByTicket(String userTicket) { log.info("[企业微信根据用户授权身份获取详情].[getUserDetailByTicket userTicket={}]", userTicket); if (StrUtil.isEmpty(userTicket)) { throw new ParameterException("用户身份参数异常"); } JSONObject params = JSONUtil.createObj().put("user_ticket", userTicket); return (QyUser) postObjApi(null, QyWechatApiConstant.AUTH_USER_DETAIL_URL, QyUser.class, JSONUtil.toJsonStr(params), new String[0]); } public static QyUser getUserDetailByTicket(String token, String userTicket) { log.info("[企业微信根据用户授权身份获取详情].[getUserDetailByTicket userTicket={}]", userTicket); if (StrUtil.isEmpty(userTicket)) { throw new ParameterException("用户身份参数异常"); } JSONObject params = JSONUtil.createObj().put("user_ticket", userTicket); return (QyUser) postObjApi(token, QyWechatApiConstant.AUTH_USER_DETAIL_URL, QyUser.class, JSONUtil.toJsonStr(params), new String[0]); } private static List listApi(String token, String apiUrl, String responseKey, Class responseClass, String... params) { String accessToken = StrUtil.isEmpty(token) ? getAppAccessToken() : token; String requestUrl = parseRequestUrl(apiUrl, handlerParam(accessToken, params)); log.info("[企业微信API].[list->api调用 request apiUrl={}]", requestUrl); String responseData = HttpUtil.get(requestUrl); log.info("[企业微信API].[list->api调用 response class={},responseData={}]", responseClass, responseData); if (StrUtil.isEmpty(responseData)) { return new ArrayList(); } return parseResponseDataList(responseData, responseClass, responseKey); } private static String[] handlerParam(String accessToken, String... params) { ArrayDeque arrayDeque = new ArrayDeque<>(ListUtil.toList(params)); arrayDeque.addFirst(accessToken); String[] temp = new String[arrayDeque.size()]; return (String[]) arrayDeque.toArray(temp); } private static T getObjApi(String token, String apiUrl, Class responseClass, String... params) { String accessToken = StrUtil.isEmpty(token) ? getAppAccessToken() : token; String requestUrl = parseRequestUrl(apiUrl, handlerParam(accessToken, params)); log.info("[企业微信API].[obj->api调用 【GET】 request apiUrl={}]", requestUrl); String responseData = HttpUtil.get(requestUrl); log.info("[企业微信API].[obj->api调用 response class={},responseData={}]", responseClass, responseData); if (StrUtil.isEmpty(responseData)) { return null; } return (T) parseResponseDataObj(responseData, responseClass); } private static T postObjApi(String token, String apiUrl, Class responseClass, String body, String... params) { String accessToken = StrUtil.isEmpty(token) ? getAppAccessToken() : token; String requestUrl = parseRequestUrl(apiUrl, handlerParam(accessToken, params)); log.info("[企业微信API].[obj->api调用 【POST】 request apiUrl={}]", requestUrl); String responseData = HttpUtil.post(requestUrl, body); log.info("[企业微信API].[obj->api调用 response class={},responseData={}]", responseClass, responseData); if (StrUtil.isEmpty(responseData)) { return null; } return (T) parseResponseDataObj(responseData, responseClass); } private static List parseResponseDataList(String responseData, Class clazz, String dataKey) { JSONObject jsonObject = JSONUtil.parseObj(responseData); Integer errCode = jsonObject.getInt(QyWechatConstant.ERROR_CODE_KEY); String errMsg = jsonObject.getStr(QyWechatConstant.ERROR_MSG_KEY); if (errCode.equals(QyWechatConstant.SUCCESS)) { JSONArray jsonArray = jsonObject.getJSONArray(dataKey); return JSONUtil.toList(jsonArray, clazz); } log.error("[parseResponseData].[请求方法= {} error errCode={},errMsg={}]", new Object[]{Thread.currentThread().getStackTrace()[2].getMethodName(), errCode, errMsg}); errCheck(errMsg, errCode); return null; } private static T parseResponseDataObj(String responseData, Class clazz) { JSONObject jsonObject = JSONUtil.parseObj(responseData); Integer errCode = jsonObject.getInt(QyWechatConstant.ERROR_CODE_KEY); String errMsg = jsonObject.getStr(QyWechatConstant.ERROR_MSG_KEY); if (errCode.equals(QyWechatConstant.SUCCESS)) { return (T) jsonObject.toBean(clazz); } log.error("[parseResponseData].[请求方法= {} error errCode={},errMsg={}]", new Object[]{Thread.currentThread().getStackTrace()[2].getMethodName(), errCode, errMsg}); errCheck(errMsg, errCode); return null; } private static void errCheck(String errMsg, Integer errCode) { if (errCode.intValue() == 40029) { throw new ServiceException(setResultCode(MessageUtils.message("sync.qy.login.invalid.code", new Object[0]), 400)); } if (errCode.intValue() == 60020) { throw new ServiceException(setResultCode(MessageUtils.message("sync.qy.ip.trust", new Object[0]) + ":" + errMsg, 400)); } throw new ServiceException(setResultCode(MessageUtils.message("sync.qy.api.error", new Object[0]) + ":" + errMsg, 400)); } private static IResultCode setResultCode(final String errMsg, final Integer code) { return new IResultCode() { // from class: org.springblade.modules.sync.api.QyWechatApi.1 public String getMessage() { return errMsg; } public int getCode() { return code.intValue(); } }; } public static String parseRequestUrl(String url, String... params) { String requestUrl = url; for (int i = 0; i < params.length; i++) { String placeholder = StrUtil.format("{{}}", new Object[]{Integer.valueOf(i)}); requestUrl = requestUrl.replace(placeholder, params[i]); } return requestUrl; } }