当前位置: 首页 > news >正文

钉钉企业内部H5微应用或小程序之钉消息推送

钉钉简单的推送钉消息

一、钉钉准备工作

首先进入钉钉开放平台 你得有企业内部微应用或者小程序 没有创建的话去看我另一篇文章有说明

钉钉开放平台创建企业内部H5微应用或者小程序-CSDN博客

看不懂话也可以参考官方文档:创建应用 - 钉钉开放平台

二、开发的准备工作

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: dingxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxappkey: dingxxxxxxxxxxxxxxxxappsecret: 89QA-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxagentid: 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 {@Resourceprivate 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_idjsonObject.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 Explorer

 钉钉专门的API调用工具可以自己试试API Explorer 

1.根据自己应用的appKey和appSecret来获取accessToken。

2. 工作通知-异步发送工作通知

填入内容 然后往下拉找到我们要发的消息类型我这里是卡片消息(这里你也可以选别的消息类型)填入必填的参数再点发起调用 也是能够成功发送的。

最后希望能帮助到你们。

相关文章:

  • 赛事|基于SprinBoot+vue的CSGO赛事管理系统(源码+数据库+文档)
  • Python库之Scrapy的高级用法深度解析
  • MySQL 状态【中文对照表】
  • Java应用中文件上传安全性分析与安全实践
  • ModuleNotFoundError: No module named ‘import_export‘
  • 《TCP/IP网络编程》(第十二章)I/O复用(1)
  • 嵌入式学习记录5.18(多点通信)
  • Node.js和npm常用命令
  • element-ui组件table去除下方滚动条,实现鼠标左右拖拽移动表格
  • 四、通信和网络安全—局域网|广域网|远程连接和攻击技术(CISSP)
  • 让大模型更聪明——复杂而艰巨的任务
  • C++类与对象的特性
  • 【算法刷题day60】Leetcode:84. 柱状图中最大的矩形
  • 大规模语言模型的书籍分享
  • 听说部门来了个00后测试开发,一顿操作给我整麻了
  • [case10]使用RSQL实现端到端的动态查询
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Babel配置的不完全指南
  • express.js的介绍及使用
  • GraphQL学习过程应该是这样的
  • Hibernate【inverse和cascade属性】知识要点
  • Java面向对象及其三大特征
  • LeetCode算法系列_0891_子序列宽度之和
  • Quartz初级教程
  • Sass 快速入门教程
  • vue-router的history模式发布配置
  • 简单数学运算程序(不定期更新)
  • 你真的知道 == 和 equals 的区别吗?
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 我是如何设计 Upload 上传组件的
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ionic入门之数据绑定显示-1
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • %check_box% in rails :coditions={:has_many , :through}
  • (07)Hive——窗口函数详解
  • (1)bark-ml
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (十八)SpringBoot之发送QQ邮件
  • (四)js前端开发中设计模式之工厂方法模式
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Windows2003安全设置/维护
  • (转)负载均衡,回话保持,cookie
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET C# 操作Neo4j图数据库
  • .NET 直连SAP HANA数据库
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [Android] 240204批量生成联系人,短信,通话记录的APK