前言
本人在项目中有一个任务是把系统与公司管理系统——钉钉 相结合,于是从钉钉官网的开放API出发,对钉钉的对接有了一个简单的了解。
对接简介
根据任务的需求场景,本人需要用到钉钉API的功能主要有:
授权:获取access_token
功能:消息通知
钉钉API接入-发送通知消息
一、获取Accesstoken
1.设置参数
获取一个access_token需要一个向"https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2"这个地址发送一个请求。
需要的参数如下:
private static String APPKEY = "*************";//(这里是应用的AppKey)
private static String APPSECRET = "*************";//(这里是应用的APPSECRET )
2.获取access_token函数
获取access_token的函数(在这里我们只需要参考官方api代码,然后把APPKEY和APPSECRET设置为自己申请第三方应用获得的APPKEY和APPSECRET)如下:
private static String getAccessToken() throws Exception {
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
request.setAppkey(APPKEY);
request.setAppsecret(APPSECRET);
request.setHttpMethod("GET");
OapiGettokenResponse response = client.execute(request);
String accessToken = response.getAccessToken();
//将获取的AccessToken和它的过期时间封装到一个AccessToken类中
Atl=new AccessTokenlin(accessToken, "7200");
return accessToken;
}
附上Accesstoken类代码:
public class AccessTokenlin {
private String accessToken;
private long expireTime;
public AccessTokenlin(String accessToken, String expirein) {
this.accessToken = accessToken;
this.expireTime = System.currentTimeMillis() + Integer.parseInt(expirein)*1000;
}
//判断accessToken是否过期
public boolean isExpired() {
return System.currentTimeMillis()>expireTime;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public long getExpireTime() {
return expireTime;
}
public void setExpireTime(long expireTime) {
this.expireTime = expireTime;
}
}
3.提供一个向外暴露的接口
自此我们已经取到了一个Accesstoken,但是getAccessToken()方法应该是private不可以向外暴露 ,我们应该向外暴露一个获取Accesstoken的一个接口GetAccessToken():
public static String GetAccessToken() throws Exception {
//这里我们需要判断一下Accesstoken是否过期,然后才将其返回
if(Atl==null||Atl.isExpired()) {
getAccessToken();
}
return Atl.getAccessToken();
}
二、发送通知
1.需要关注的参数
当我们获取了一个Accesstoken后,我们参考钉钉的开发文档,它的API给我们提供了6种通知发送的类型。我们需要关注的参数如下(切记同一条信息它一天只能发一次,无法重复发送):
(1)request.setUseridList(“manager4425,306507340036230940”);
目前来说,淘宝没有向外提供一个通过电话号码获取员工id的一个接口,以上两个员工id是我以一个特殊的形式来获取的,获取的方法在如下:
查阅钉钉的api我们可以知道,钉钉它向我们提供了一个查询部门字列表,和查询部门所有成员信息的api.
/**
*获取子部门列表
*/
public static void getDeptList() {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list_ids");
OapiDepartmentListIdsRequest request = new OapiDepartmentListIdsRequest();
request.setId("1");
request.setHttpMethod("GET");
try {
OapiDepartmentListIdsResponse response = client.execute(request, GetAccessToken());
//这里引用了JSONObject,需要导入相关的jar包,这里我是直接输出相关的信息到控制台获取一个部门id
JSONObject jsonObject = JSONObject.fromObject(response);
System.out.println(jsonObject);
} catch (ApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我们获取子部门列表,以根目录查找可以查找到当前所有部门(默认"1"位根目录),自此我找到了我添加的一个部门(id:142067643),然后我通过查找这个部门的成员信息查找到了用户的id,getDepartmentUser函数如下:
/**
* 获取部门下的所有用户列
* @param departmentId
* @return
*/
public static Object getDepartmentUser(Long departmentId){
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/simplelist");
OapiUserSimplelistRequest request = new OapiUserSimplelistRequest();
request.setDepartmentId(departmentId);
request.setOffset(0L);
request.setSize(10L);
request.setHttpMethod("GET");
try {
OapiUserSimplelistResponse response = client.execute(request, getAccessToken());
//这里引用了JSONObject,我是直接输出相关的信息到控制台获取了员工id
JSONObject jsonObject = JSONObject.fromObject(response);
String body = jsonObject.getString("body");
System.out.println(jsonObject);
return response;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
(2)request.setAgentId(AgentId);
这个Agentld在应用详情中可以获取。
(3)request.setToAllUser(false);
默认为false,true的时候是向全体人员发送信息。
(4)msg.getText().setContent(“测试text文挡信息通知第一次”);
这里可以编辑我们要发送的文档或其他类型的通知。
(5)OapiMessageCorpconversationAsyncsendV2Response response = client.execute(request,GetAccessToken());
这是我们要传入我们获取的Accesstoken;
最后发送通知信息函数如下:
/**
* 发送通知信息
* @throws ApiException
* @throws Exception
*/
public static void SendMsg() throws ApiException, Exception {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
//传入的是员工的工号
request.setUseridList("manager4425,306507340036230940");
//申请的应用AgentId
request.setAgentId(310559737L);
//true为全体员工
request.setToAllUser(false);
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setMsgtype("text");
msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text());
msg.getText().setContent("测试text文挡信息通知第一次");
request.setMsg(msg);
/*//发送图片
msg.setMsgtype("image");
msg.setImage(new OapiMessageCorpconversationAsyncsendV2Request.Image());
msg.getImage().setMediaId("@lADOdvRYes0CbM0CbA");
request.setMsg(msg);
/*
//发送文件
msg.setMsgtype("file");
msg.setFile(new OapiMessageCorpconversationAsyncsendV2Request.File());
msg.getFile().setMediaId("@lADOdvRYes0CbM0CbA");
request.setMsg(msg);
//发送链接
msg.setMsgtype("link");
msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link());
msg.getLink().setTitle("test");
msg.getLink().setText("test");
msg.getLink().setMessageUrl("test");
msg.getLink().setPicUrl("test");
request.setMsg(msg);
msg.setMsgtype("markdown");
msg.setMarkdown(new OapiMessageCorpconversationAsyncsendV2Request.Markdown());
msg.getMarkdown().setText("##### text");
msg.getMarkdown().setTitle("### Title");
request.setMsg(msg);
msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
msg.getOa().getHead().setText("head");
msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
msg.getOa().getBody().setContent("xxx");
msg.setMsgtype("oa");
request.setMsg(msg);
//发送的文本信息+url
msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
msg.getActionCard().setTitle("xxx123411111");
msg.getActionCard().setMarkdown("### 测试123111");
msg.getActionCard().setSingleTitle("接入钉钉发送通知接口");
msg.getActionCard().setSingleUrl("https://www.baidu.com");
msg.setMsgtype("action_card");
request.setMsg(msg);
*/
OapiMessageCorpconversationAsyncsendV2Response response = client.execute(request,GetAccessToken());
}