Java推送钉钉应用消息实现过程

 更新时间:2025年07月23日 11:01:33   作者:振宇i  
这篇文章主要介绍了Java推送钉钉应用消息实现的相关资料,包括创建应用、获取凭证、申请接口权限及调用接口流程,并提供Maven依赖配置,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言:

本文的目的是通过手机号获取钉钉成员的userid,实现钉钉应用的消息推送。

一、创建钉钉应用

登录钉钉开放平台

二、应用相关凭证

需要获取

Client ID (原 AppKey 和 SuiteKey)

Client Secret (原 AppSecret 和 SuiteSecret)

App ID 

原企业内部应用AgentId

三、申请钉钉接口权限

需要先申请对应的接口权限才能调用接口。

但是钉钉的接口太多了,一时半会也找不到对应的接口,推荐直接全勾选。

四、钉钉官方接口

1、获取token

请求方式:GET

参数:appKey,appSecret,reqMethod

url:https://oapi.dingtalk.com/gettoken

2、根据手机号获取用户ID

参数:access_token,mobileNum

url:https://oapi.dingtalk.com/topapi/v2/user/getbymobile

3、发送通知

参数:access_token,msgType,content,userId

url:https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2

五、工具类

import com.alibaba.fastjson.JSON;
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.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiV2UserGetbymobileRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Slf4j
@Component
public class DingTalkUtil {

    private static final String GET_TOKEN_URL = "https://oapi.dingtalk.com/gettoken";
    private static final String GET_BY_MOBILE = "https://oapi.dingtalk.com/topapi/v2/user/getbymobile";
    private static final String ASYNC_SEND_V2_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2";
    private static final String DEFAULT_APP_KEY = "XXX";
    private static final String DEFAULT_APP_SECRET = "XXXX";
    private static final Long DEFAULT_AGENT_ID = 123L;
    private static final String DEFAULT_REQUEST_METHOD = "GET";

    private String appKey;
    private String appSecret;
    private Long agentId;
    private String reqMethod;


    public DingTalkUtil() {
        this(DEFAULT_APP_KEY, DEFAULT_APP_SECRET, DEFAULT_AGENT_ID, DEFAULT_REQUEST_METHOD);
    }

    public DingTalkUtil(String appKey, String appSecret, Long agentId, String reqMethod) {
        this.appKey = (appKey != null && !appKey.isEmpty()) ? appKey : DEFAULT_APP_KEY;
        this.appSecret = (appSecret != null && !appSecret.isEmpty()) ? appSecret : DEFAULT_APP_SECRET;
        this.agentId = (agentId != null) ? agentId : DEFAULT_AGENT_ID;
        this.reqMethod = (reqMethod != null && !reqMethod.isEmpty()) ? reqMethod : DEFAULT_REQUEST_METHOD;
    }


    // 获取AccessToken
    public String getTokenResponse() throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient(GET_TOKEN_URL);
        OapiGettokenRequest req = new OapiGettokenRequest();
        req.setAppkey(appKey);
        req.setAppsecret(appSecret);
        req.setHttpMethod(reqMethod);
        OapiGettokenResponse rsp = client.execute(req);
        return rsp.getAccessToken();
    }

    // 根据手机号获取UserId
    public String getUserIdByMobile(String accessToken, String mobileNum) throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient(GET_BY_MOBILE);
        OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
        req.setMobile(mobileNum);
        OapiV2UserGetbymobileResponse rsp = client.execute(req, accessToken);

        JSONObject jsonObject = JSON.parseObject(rsp.getBody());
        JSONObject result = jsonObject.getJSONObject("result");
        String userid = result.getString("userid");
        return userid;
    }

    // 发送工作通知消息
    public boolean sendWorkNotice(String accessToken, String msgType, String content, List<String> userIds) throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient(ASYNC_SEND_V2_URL);

        OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();
        req.setAgentId(agentId);
        req.setUseridList(String.join(",", userIds));

        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
        msg.setMsgtype(msgType);
        OapiMessageCorpconversationAsyncsendV2Request.Text text = new OapiMessageCorpconversationAsyncsendV2Request.Text();
        text.setContent(content);
        msg.setText(text);

        req.setMsg(msg);

        OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(req, accessToken);
        return rsp.isSuccess();
    }

    public static class Builder {
        private String msgType = "text";
        private String content;
        private List<String> mobiles = new ArrayList<>();
        private List<String> userIds = new ArrayList<>();

        public Builder setMsgType(String msgType) {
            this.msgType = msgType;
            return this;
        }

        public Builder setContent(String content) {
            this.content = content;
            return this;
        }

        public Builder addUserId(String userId) {
            this.mobiles.add(userId);
            return this;
        }

        public Builder addUserIds(List<String> userIds) {
            this.mobiles = userIds;
            return this;
        }

        public boolean send(DingTalkUtil utils) throws ApiException {
            // 获取 accessToken
            String accessToken = utils.getTokenResponse();
            // 根据手机获取userId
            for (String mobileNum : mobiles) {
                String userId = utils.getUserIdByMobile(accessToken, mobileNum);
                userIds.add(userId);
            }
            // 调用 sendWorkNotice 发送消息
            return utils.sendWorkNotice(accessToken, msgType, content, userIds);
        }
    }


    // 封装的发送钉钉通知的方法
    public boolean sendDingTalkNotification(List<String> phoneList, String message) throws ApiException {
        DingTalkUtil dingTalkUtil = new DingTalkUtil();
        return new DingTalkUtil.Builder().setMsgType("text")
                .setContent(message)
                .addUserIds(phoneList)
                .send(dingTalkUtil);
    }

    // 内部测试
    public static void main(String[] args) throws ApiException {
        DingTalkUtil dingTalkUtil = new DingTalkUtil();
        List<String> phoneList = Arrays.asList("phoneNum");
        String message = "your message";
        boolean result = dingTalkUtil.sendDingTalkNotification(phoneList, message);
        System.out.println("消息发送结果: " + result);
    }

}

六、MAVEN引入

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dingtalk</artifactId>
            <version>1.5.24</version>
        </dependency>

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>2.0.0</version>
        </dependency>

总结 

到此这篇关于Java推送钉钉应用消息实现的文章就介绍到这了,更多相关Java推送钉钉应用消息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中indexOf函数示例详解

    Java中indexOf函数示例详解

    Java String 类的 indexOf() 方法返回指定字符串中指定字符或字符串第一次出现的位置,这篇文章主要介绍了Java中indexOf函数详解,需要的朋友可以参考下
    2024-01-01
  • MyBatis快速入门(简明浅析易懂)

    MyBatis快速入门(简明浅析易懂)

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。mybatis的学习是程序员的必修课。今天小编通过分享本教程帮助大家快速入门mybatis,对mybatis入门知识感兴趣的朋友参考下吧
    2016-11-11
  • 新手入门Jvm-- JVM对象创建与内存分配机制

    新手入门Jvm-- JVM对象创建与内存分配机制

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
    2021-06-06
  • Servlet+JavaBean+JSP打造Java Web注册与登录功能

    Servlet+JavaBean+JSP打造Java Web注册与登录功能

    比作MVC的话,控制器部分采用Servlet来实现,模型部分采用JavaBean来实现,而大部分的视图采用Jsp页面来实现,接下来我们就来详细看看如何用Servlet+JavaBean+JSP打造Java Web注册与登录功能
    2016-05-05
  • Java设计模式之单例模式实例分析

    Java设计模式之单例模式实例分析

    这篇文章主要介绍了Java设计模式之单例模式,以实例形式较为详细的分析了单例模式的概念、定义及简单实现技巧,需要的朋友可以参考下
    2015-11-11
  • IDEA关于.properties资源文件的编码调整问题

    IDEA关于.properties资源文件的编码调整问题

    这篇文章主要介绍了IDEA关于.properties资源文件的编码调整问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • java实现MapReduce对文件进行切分的示例代码

    java实现MapReduce对文件进行切分的示例代码

    本文主要介绍了java实现MapReduce对文件进行切分的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • spring AOP注解失效原因分析及解决过程

    spring AOP注解失效原因分析及解决过程

    Spring AOP注解失效原因及解决方法,详细解析Spring动态代理机制,包括JDK动态代理和CGLIB动态代理,以及AOP注解在方法调用中的应用问题和解决方案
    2026-06-06
  • SpringBoot之跨域过滤器配置允许跨域访问方式

    SpringBoot之跨域过滤器配置允许跨域访问方式

    这篇文章主要介绍了SpringBoot之跨域过滤器配置允许跨域访问方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • java方法通用返回结果集封装操作

    java方法通用返回结果集封装操作

    这篇文章主要介绍了java方法通用返回结果集封装操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论