调用钉钉接口--发送通知消息(个人/全体)

前言

本人在项目中有一个任务是把系统与公司管理系统——钉钉 相结合,于是从钉钉官网的开放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());
    }
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值