大家好,这里是一口八宝周👏
欢迎来到我的博客❤️一起交流学习
文章中有需要改进的地方请大佬们多多指点 谢谢🙏
最近好像搞了个什么钉钉小程序,具体做什么咱也不知道,就让我搞一个钉钉获取免登录用户信息的接口出来,2分钟交代完的任务,是谁懵了我不说👀 没办法,只能回家面向百度了,现在来总结一下,虽然大概率以后也不会用到哈哈哈哈哈哈哈哈。
正文开始👇👇👇
钉钉获取免登录用户信息步骤
- 获取免登录授权码
- 获取accesstoken
- 获取userid
- 获取用户详情
其中1是通过h5实现的,234步骤则需要服务端支持,所以我们可以参考钉钉官方文档进行开发。
参考文档:概述 - 钉钉开放平台
下面进行实用教程⬇️
pom依赖
<dependency> <groupId>com.aliyun</groupId> <artifactId>dingtalk</artifactId> <version>1.1.76</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>alibaba-dingtalk-service-sdk</artifactId> <version>2.0.0</version> </dependency>
获取accessToken
获取企业内部应用的accessToken - 钉钉开放平台
文档说的很清晰,调用服务端API获取应用资源时,需要通过accessToken来鉴权调用者身份进行授权。所以我们需要获取企业内部的accessToken。
/**
* 使用 Token 初始化账号Client
* @return Client
* @throws Exception
* 钉钉开发者调用钉钉官方接口的时候,需要先要进行认证,
* 企业开发者在钉钉创建应用,将应用的appKey键和appSecret传入,
* 获取到accessToken值,通过该认证即可调用钉钉的相关接口。
*/
public static com.aliyun.dingtalkoauth2_1_0.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.protocol = "https";
config.regionId = "central";
return new com.aliyun.dingtalkoauth2_1_0.Client(config);
}
public String getAccessToken() throws Exception {
java.util.List<String> args = java.util.Arrays.asList();
com.aliyun.dingtalkoauth2_1_0.Client client = DingTalkOauthClient.createClient();
GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
.setAppKey("你的应用的AppKe")
.setAppSecret("你的应用AppSecret");
try {
String accessToken = null;
int expireIn = 7200;
//存入缓存,有效期2h。避免频率拦截。可以使用redis进行缓存,这里我使用的是tair
//key命名不做要求,有效期内token只有一个
if(tairOperator.get(TAIR_KEY) != null){
accessToken = (String) tairOperator.get(TAIR_KEY);
}else {
GetAccessTokenResponse response=client.getAccessToken(getAccessTokenRequest);
accessToken = response.getBody().getAccessToken();
expireIn = response.getBody().getExpireIn().intValue();//7200
}
tairOperator.put(TAIR_KEY , accessToken, expireIn);
return accessToken;
} catch (TeaException err) {
if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
log.error("getAccessToken error", err.message);
}
} catch (Exception _err) {
TeaException err = new TeaException(_err.getMessage(), _err);
if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
log.error("error while getAccessToken", err.message);
}
}
return null;
}
通过这个方法我们可以拿到accessToken,接下来就是获取用户id
获取userid
参考文档:通过免登码获取用户信息 - 钉钉开放平台
这里通过文档可以知道我们需要 access_token和code两个参数,毫无疑问,access_token就是通过⬆️上述步骤自行获取的。code就是通过步骤1,h5得到的免登授权码。我们需要做的就是拿这两个参数去调用钉钉内部接口。
通过下面的方法,我们可以轻松得到用户的一些信息,具体格式要不要贴一下呢?文档是有的
public OapiV2UserGetuserinfoResponse getUserId(String accessToken, String authCode) throws Exception {
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);
log.info("getUserId return rsp:{}",JSON.toJSONString(rsp.getBody()));
return rsp;
}
得到的用户对象
{
"errcode": 0,
"result": {
"associated_unionid": "N2o5U3axxxx",
"unionid": "gliiW0piiii02zBUjUxxxx",
"device_id": "12drtfxxxxx",
"sys_level": 1,
"name": "张xx",
"sys": true,
"userid": "userid123"
},
"errmsg": "ok"
}
OK 那么通过👆这个我们可以拿到userid。没毛病吧,那么进一步拿到用户的详细信息💻该怎么办,简简单单,go on
获取用户详细信息
文档:查询用户详情 - 钉钉开放平台
需要的参数就是access_token、userid还有一个language,而且参考值也给你了。文档写的也挺清晰的,直接CV大法,自信回头。我这里就不重复操作了。
咱就是说,直接一个方法整合一下,一步到位跑起来
public OapiV2UserGetResponse getUserInfo(String authCode) throws Exception {
try {
String accessToken = getAccessToken();
String userid = getUserId(accessToken, authCode).getResult().getUserid();
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
OapiV2UserGetRequest req = new OapiV2UserGetRequest();
req.setUserid(userid);
req.setLanguage("zh_CN");
OapiV2UserGetResponse rsp = client.execute(req, accessToken);
return rsp;
} catch (ApiException e) {
e.printStackTrace();
}
return null;
}
大功告成✅ 具体返回信息可以去看文档,别问,问就是我还没见过返回类型👀我没权限5555~
这点写的还是比较完整的,来自一只菜鸟的认可🐶
添加权限这块咱没搞,毕竟应用也不是我创建的,所以只能贴出来文档供大家参考,具体操作还请自行研究🧐
参考文档:添加接口调用权限 - 钉钉开放平台
OK,拜拜👋