赞
踩
首先进入钉钉开放平台 你得有企业内部微应用或者小程序 没有创建的话去看我另一篇文章有说明
看不懂话也可以参考官方文档:创建应用 - 钉钉开放平台
1.pom的导入
- <!-- 钉钉SDK -->
- <dependency>
- <groupId>com.aliyun</groupId>
- <artifactId>dingtalk</artifactId>
- <version>1.2.15</version>
- </dependency>
- <dependency>
- <groupId>com.aliyun</groupId>
- <artifactId>alibaba-dingtalk-service-sdk</artifactId>
- <version>2.0.0</version>
- </dependency>
-
2.配置文件(yml配置文件)
- #钉钉信息
- dingtalk:
- corpid: dingxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- appkey: dingxxxxxxxxxxxxxxxx
- appsecret: 89QA-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxx
- agentid: 2xxxxxxxxx
这里的配置信息是你的应用信息(在钉钉后台-应用管理)
三、代码实现
添加工具类 获取钉钉AccessToken
- /**
- * 钉钉工具类
- * @date 2023-07-07 9:30
- */
- @Slf4j
- @Component
- public class DingTalkUtil {
-
- @Value("${dingtalk.appKey}")
- private String appKey;
-
- @Value("${dingtalk.appSecret}")
- private String appSecret;
-
- /**
- * 获取钉钉AccessToken
- *
- * @return
- */
- public String getAccessToken() {
- try {
- DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
- OapiGettokenRequest req = new OapiGettokenRequest();
- req.setAppkey(appKey);
- req.setAppsecret(appSecret);
- req.setHttpMethod("GET");
- OapiGettokenResponse rsp = client.execute(req);
- if (rsp.getErrcode() == 0) {
- return rsp.getAccessToken();
- } else {
- throw new JeecgBootException("获取dingtalk授权失败!");
- }
- } catch (ApiException e) {
- e.printStackTrace();
- }
-
- return null;
- }
-
- }
调用钉钉接口之前都是需要用到access_token校验的,接着调用用户电话获得钉钉的userId(某个人在企业里的唯一ID)
-
- /**
- * 获取钉钉的用户的userid
- *
- * @param phone 用户电话
- * @return 钉钉用户内部userId
- */
- public String getDingTalkUserId(String phone) throws Exception {
-
- String accessToken = this.getAccessToken();
- if (accessToken == null) {
- throw new Exception("获取到access_token失败!");
- }
- try {
- DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");
- OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
- req.setMobile(phone);
- OapiV2UserGetbymobileResponse rsp = client.execute(req, accessToken);
- String userId = rsp.getResult().getUserid();
- return userId;
- } catch (ApiException e) {
- log.error("请求获取钉钉用户的userid失败:{}", e.getErrMsg());
- }
- return null;
- }
-
发送消息工具类(可给单个或多个人发送)
- package org.jeecg.modules.aigoes.util;
-
- import com.alibaba.fastjson.JSONObject;
- import lombok.extern.slf4j.Slf4j;
- import org.jeecg.common.util.TokenUtils;
- import org.jeecg.modules.message.util.DingTalkUtil;
- import org.jeecg.modules.system.entity.SysTenant;
- import org.jeecg.modules.system.service.ISysTenantService;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Component;
-
- import javax.annotation.Resource;
- import java.io.*;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.List;
- import java.util.stream.Collectors;
-
- /**
- * rwy
- * @date 2023-07-07 9:30
- */
- @Slf4j
- @Component
- public class MessageUtils {
-
- @Resource
- private DingTalkUtil dingTalkUtil;
-
- // 钉钉发送消息给指定用户列表
- public void sendMessageNew(List<String> userIdList, String picUrl, String messageUrlDing, String text, String title) throws Exception {
- String accessToken = dingTalkUtil.getAccessToken();
- String messageUrl = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=" + accessToken;
-
- JSONObject jsonObject = new JSONObject();
- //钉钉后台应用的agent_id
- jsonObject.put("agent_id", sysTenant.getAgentId());
- //推送的userId
- jsonObject.put("userid_list",userIdList.stream().collect(Collectors.joining(",")));
- jsonObject.put("to_all_user", false);
- JSONObject msgObj = new JSONObject();
- //消息类型
- msgObj.put("msgtype", "action_card");
-
- JSONObject textObj = new JSONObject();
- //标题
- textObj.put("title", title);
- //内容
- textObj.put("markdown", text);
- //按钮名称
- textObj.put("single_title", picUrl);
- //跳转地址 填小程序莫页面地址或微应用的
- textObj.put("single_url", messageUrlDing);
- msgObj.put("action_card",textObj);
- jsonObject.put("msg", msgObj);
-
- String jsonBody = jsonObject.toJSONString();
- System.out.println(jsonBody);
-
- //发送POST请求
- JSONObject response = httpPost(messageUrl, jsonBody, "UTF-8");
- System.out.println(response);
- }
-
-
- public JSONObject httpPost(String url, String requestData, String charset) throws IOException {
- URL apiUrl = new URL(url);
- HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection();
- connection.setRequestMethod("POST");
- connection.setDoOutput(true);
-
- // 设置请求头部
- connection.setRequestProperty("Content-Type", "application/json;charset=" + charset);
-
- // 发送请求数据
- try (OutputStream outputStream = connection.getOutputStream()) {
- outputStream.write(requestData.getBytes(charset));
- outputStream.flush();
- }
-
- // 获取响应结果
- try (InputStream inputStream = connection.getInputStream();
- BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset))) {
- StringBuilder response = new StringBuilder();
- String line;
- while ((line = reader.readLine()) != null) {
- response.append(line);
- }
- return JSONObject.parseObject(response.toString());
- }
- }
-
- }
这里需要注意的是你选择的消息通知类型 - 钉钉开放平台,我这里选择是卡片消息 因为卡片消息支持整体跳转ActionCard样式和独立跳转ActionCard样式以及可以展示图片和添加多个按钮 样式和可玩性比较高。
测试发送钉消息
注意事项:小程序链接和微应用微应用唯一区别在这跳转地址 要跳转小程序前面是需要加 eapp:// 列如以下是这样的 eapp://pagesA/pages/Home/h-psy/ 而微应用不用加
- /**
- * 发送钉消息
- * @return
- * @throws Exception
- */
- @GetMapping("/cs2")
- public Result<?> cs() throws Exception {
- String headteacherId = "661xxxxxxxxxxxxxxx";
- messageUtils.sendMessageNew(Collections.singletonList(headteacherId),
- "点击查看详情","pagesA/pages/Home/h-psy/mood",
- "### <font color=#04CFFF>测试天气消息</font> \n **天气还不错。**",
- "天气报告");
- return Result.OK();
- }
钉钉专门的API调用工具可以自己试试API Explorer
1.根据自己应用的appKey和appSecret来获取accessToken。
2. 工作通知-异步发送工作通知
填入内容 然后往下拉找到我们要发的消息类型我这里是卡片消息(这里你也可以选别的消息类型)填入必填的参数再点发起调用 也是能够成功发送的。
最后希望能帮助到你们。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。