|
@@ -0,0 +1,123 @@
|
|
|
|
+package cn.iocoder.yudao.module.system.util;
|
|
|
|
+
|
|
|
|
+import com.dingtalk.api.DefaultDingTalkClient;
|
|
|
|
+import com.dingtalk.api.DingTalkClient;
|
|
|
|
+import com.dingtalk.api.request.OapiGettokenRequest;
|
|
|
|
+import com.dingtalk.api.request.OapiV2UserGetRequest;
|
|
|
|
+import com.dingtalk.api.request.OapiV2UserGetuserinfoRequest;
|
|
|
|
+import com.dingtalk.api.response.OapiGettokenResponse;
|
|
|
|
+import com.dingtalk.api.response.OapiV2UserGetResponse;
|
|
|
|
+import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
|
|
|
|
+import com.taobao.api.ApiException;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @author suiyy
|
|
|
|
+ * @date 20230602
|
|
|
|
+ * @desc 钉钉API接口工具类
|
|
|
|
+ */
|
|
|
|
+@Service
|
|
|
|
+public class DingtalkUtil {
|
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(DingtalkUtil.class);
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 钉钉企业id
|
|
|
|
+ */
|
|
|
|
+ private static String CORPID;
|
|
|
|
+ @Value("${dingtalk.CORPID}")
|
|
|
|
+ public void setCORPID(String CORPID) {
|
|
|
|
+ DingtalkUtil.CORPID = CORPID;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 微应用appKey
|
|
|
|
+ */
|
|
|
|
+ @Value("${justauth.type.DINGTALK.client-id}")
|
|
|
|
+ private String APP_KEY;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 微应用appSecret
|
|
|
|
+ */
|
|
|
|
+ @Value("${justauth.type.DINGTALK.client-secret}")
|
|
|
|
+ private String APP_SECRET;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取access_token
|
|
|
|
+ */
|
|
|
|
+ @Value("${dingtalk.GET_ACCESS_TOKEN_URL}")
|
|
|
|
+ private String GET_ACCESS_TOKEN_URL;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据钉钉用户id获取用户信息
|
|
|
|
+ */
|
|
|
|
+ @Value("${dingtalk.URL_GET_USERINFO_BYUSERID}")
|
|
|
|
+ private String URL_GET_USERINFO_BYUSERID;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 通过免登授权码获取用户信息
|
|
|
|
+ */
|
|
|
|
+ @Value("${dingtalk.URL_GET_USERINFO_BYAUTHCODE}")
|
|
|
|
+ private String URL_GET_USERINFO_BYAUTHCODE;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取钉钉 accessToken
|
|
|
|
+ * @return
|
|
|
|
+ * @throws ApiException
|
|
|
|
+ */
|
|
|
|
+ public String getAccessToken() throws ApiException {
|
|
|
|
+ DefaultDingTalkClient client = new DefaultDingTalkClient(GET_ACCESS_TOKEN_URL);
|
|
|
|
+ OapiGettokenRequest request = new OapiGettokenRequest();
|
|
|
|
+ request.setAppkey(APP_KEY);
|
|
|
|
+ request.setAppsecret(APP_SECRET);
|
|
|
|
+ request.setHttpMethod("GET");
|
|
|
|
+ OapiGettokenResponse response = client.execute(request);
|
|
|
|
+ return response.getAccessToken();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据免登授权码获取用户id
|
|
|
|
+ *
|
|
|
|
+ * @param authCode 免登授权码
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public String getUserIdByAuthCode(String authCode) throws Exception {
|
|
|
|
+ // 1. 获取access_token
|
|
|
|
+ String accessToken = getAccessToken();
|
|
|
|
+ // 2. 获取用户信息
|
|
|
|
+ DingTalkClient client = new DefaultDingTalkClient(URL_GET_USERINFO_BYAUTHCODE);
|
|
|
|
+ OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
|
|
|
|
+ req.setCode(authCode);
|
|
|
|
+ OapiV2UserGetuserinfoResponse rsp = client.execute(req, accessToken);
|
|
|
|
+ if (rsp.getErrcode() != 0L) {
|
|
|
|
+ throw new Exception(rsp.getBody());
|
|
|
|
+ }
|
|
|
|
+ // 3. 返回用户id
|
|
|
|
+ return rsp.getResult().getUserid();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据用户id获取用户信息(用户名 工号 所属部门列表)
|
|
|
|
+ *
|
|
|
|
+ * @param userId 用户id
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public OapiV2UserGetResponse.UserGetResponse getUserDetail(String userId) throws Exception {
|
|
|
|
+ // 1. 获取access_token
|
|
|
|
+ String accessToken = getAccessToken();
|
|
|
|
+ // 2. 获取用户详情
|
|
|
|
+ DingTalkClient client = new DefaultDingTalkClient(URL_GET_USERINFO_BYUSERID);
|
|
|
|
+ OapiV2UserGetRequest req = new OapiV2UserGetRequest();
|
|
|
|
+ req.setUserid(userId);
|
|
|
|
+ req.setLanguage("zh_CN");
|
|
|
|
+ OapiV2UserGetResponse rsp = client.execute(req, accessToken);
|
|
|
|
+ if (rsp.getErrcode() != 0L) {
|
|
|
|
+ throw new Exception(rsp.getBody());
|
|
|
|
+ }
|
|
|
|
+ // 返回用户名称rsp.getResult().getName()
|
|
|
|
+ return rsp.getResult();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|