添加maven依赖:
<!--钉钉-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>
authCode
由前端获取authCode,传给后端
钉钉管理Controller
/**
* @description: 根据免登授权码, 获取登录用户身份
* @param
* @return
* @throws
* @author lgn
* @date 2022/9/27 18:12
*/
@GetMapping("/getGingTalkUser")
public AjaxResult getGingTalkUser(@RequestParam(value = "authCode") String authCode) {
return AjaxResult.success(dingTalkUserService.getGingTalkUser(authCode));
}
DingTalkUserServiceImpl
package com.ruoyi.lab.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiV2UserGetuserinfoRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
import com.ruoyi.lab.service.DingTalkUserService;
import com.taobao.api.ApiException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
/**
* @ClassName DingTalkUserServiceImpl * @Description TODO
* @Author lgn
* @Date 18:15 2022/9/27
* @Version 1.0
**/
@Service
@RefreshScope //热刷新
public class DingTalkUserServiceImpl implements DingTalkUserService {
static Logger logger = LoggerFactory.getLogger(DingTalkUserServiceImpl.class);
@Override
public JSONObject getGingTalkUser(String authCode) {
JSONObject jsonObject=new JSONObject();
String appKey="dingxyd8mxocjzgbiyoj";
String appSecret="f168jCW6xAVRcGgvCXteTVIJV_WNuAhUZaLFCHEokzqBwMD_XakE7-bL-MIlrHJK";
String accessToken=getAccessToken(appKey,appSecret);
String info=getuserinfo(authCode,accessToken);
jsonObject.put("GingTalkUser",info);
jsonObject.put("accessToken",accessToken);
return jsonObject;
}
/**
* 在使用accessToken时,请注意:
* accessToken的有效期为7200秒(2小时),有效期内重复获取会返回相同结果并自动续期,过期后获取会返回新的accessToken。
* 开发者需要缓存accessToken,用于后续接口的调用。因为每个应用的accessToken是彼此独立的,所以进行缓存时需要区分应用来进行存储。
* 不能频繁调用接口,否则会受到频率拦截。
*
* @param appKey
* @param appSecret
* @return
*/
public static String getAccessToken(String appKey, String appSecret) {
String getAccessToken="";
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
request.setAppkey(appKey);
request.setAppsecret(appSecret);
request.setHttpMethod(HttpMethod.GET.name());
try {
OapiGettokenResponse response = client.execute(request);
if (response.isSuccess()) {
return response.getAccessToken();
} else {
logger.info(response.getErrorCode());
logger.info(response.getErrmsg());
}
} catch (Exception e) {
// 需要自己处理异常
e.printStackTrace();
}
return getAccessToken;
}
/**
* @description: 发送post请求
* @param
* @return
* @throws
* @author lgn
* @date 2022/9/27 18:18
*/
public String getuserinfo(String authCode, String accessToken) {
String getBody="";
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
req.setCode(authCode);
OapiV2UserGetuserinfoResponse rsp = client.execute(req, accessToken);
System.out.println(rsp.getBody());
getBody=rsp.getBody();
} catch (ApiException e) {
e.printStackTrace();
}
return getBody;
}
}