钉钉企业内部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. 工作通知-异步发送工作通知

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

最后希望能帮助到你们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马聚合的分类及实现

1、什么是聚合? 聚合是对文档数据的统计、分析、计算 聚合的常见种类有哪些? 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组&#xff0c;例如一周为一组&#xff0c;或者一月为一组 度量(…

抖店的注意事项,2024新版,照做即可!

我是王路飞。 如果你想做抖店&#xff0c;但还没开通抖店的话&#xff0c;那这篇文章算你刷着了。 先别着急开店&#xff0c;把这篇文章看完&#xff0c;再开店也不迟&#xff0c;能帮你少走很多开店、做店阶段的弯路。 内容来源于【电商王路飞】 第一个注意事项&#xff0c…

基于Spring+Struts2+Hibernate+MySQL的个人网上银行

## 系统概述该系统采用SpringHibernateStruts2框架搭建&#xff0c;实现了登录、退出功能。不同账号之间进行转账功能&#xff0c;查询转账记录功能&#xff0c;修改登录密码功能。## 使用方法* 将项目导入idea&#xff0c;修改hibernate.cfg.xml中的数据库用户名、密码等信息…

文件压缩-42的魅力

让我们以一个非常简单的程序为例&#xff0c;一个什么都不做的程序 将数字返回给操作系统。为什么不呢&#xff1f;毕竟&#xff0c;Unix 已经附带了不少于两个这样的程序&#xff1a;true 和 假。由于已经取了 0 和 1&#xff0c;我们将使用数字 42。 所以&#xff0c;这是我…

ComfyUI 基础教程:界面介绍/文生图工作流

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文将介绍 ComfyUI 的主要界面&#xff0c;包括&#xff1a;工作流区域、操作面板、基础操作和快捷键&#xff0c;并详…

ctfshow web 月饼杯

web1_此夜圆 <?php error_reporting(0);class a {public $uname;public $password;public function __construct($uname,$password){$this->uname$uname;$this->password$password;}public function __wakeup(){if($this->passwordyu22x){include(flag.php);echo…

如何处理 Google Chrome中的代理服务器错误?

如果您在 Google Chrome 浏览器中遇到代理服务器错误&#xff0c;您可以采取一些步骤来排除故障并解决问题。代理服务器充当您的设备和互联网之间的中介&#xff0c;与其相关的错误有时会破坏您的浏览体验。以下是帮助您解决该问题的一些步骤&#xff1a; 1. 检查您的互联网连接…

QListWidget详解

QListWidget详解 QListWidget 是 PyQt5 中一个方便的部件&#xff0c;用于创建和管理列表。它继承自 QListView&#xff0c;并提供了一些高级功能&#xff0c;使得添加和管理列表项更加简单。以下是 QListWidget 的详解&#xff0c;包括基本用法、主要方法和属性以及如何与其他…

Unity Apple Vision Pro 开发(一):开发前期准备【软硬件要求 | 开发者模式 | 无线调试打包】

文章目录 &#x1f4d5;教程说明&#x1f4d5;硬件要求&#x1f4d5;软件要求⭐Xcode 15.2 及以上⭐visionOS 1.0 (21N301) SDK 或者更高版本⭐Unity 2022 LTS for Apple Silicon (2022.3.18f1及以上的版本)⭐Unity Pro/Unity Enterprise/Unity Industry的授权许可证 &#x1f…

最新斗音评论区截流拓客,自动引流【引流软件+使用教程】

面对社交媒体的蓬勃生长&#xff0c;加粉和拓展客户群成为品牌及个体的当务之急。新推出的一款技术工具恰到好处地迎合了这一需求&#xff0c;提供了一个多功能、适用性强的增粉与互动解决方案。该工具与抖音平台的所有版本兼容&#xff0c;消除了对特定版本的依赖。 利用这一…

selenium自动化测试环境搭建

1.下载安装python python的下载与安装-CSDN博客 2.下载安装pycharm pycharm免费下载安装教程_pycharmcommunity下载-CSDN博客 3.下载安装浏览器驱动 chrome浏览器官网下载网址 https://www.google.cn/chrome/?standalone1&platformwin64 Selenium安装WebDriver最新…

预训练大模型

参考代码&#xff1a;https://github.com/LlamaFamily/Llama-Chinese

Python 应用开发:Streamlit 布局篇(容器布局)

st.columns 以并列方式插入容器。 插入若干并排排列的多元素容器&#xff0c;并返回一个容器对象列表。 要在返回的容器中添加元素&#xff0c;可以使用 with 符号&#xff08;首选&#xff09;或直接调用返回对象的方法。请参见下面的示例。 列只能放置在其他列的内部&…

你还别不信,停电停网也能玩超级玛丽,还能自己编辑关卡和地图呢!

网管小贾 / sysadm.cc 死神正了然无趣地翻阅着人间档案&#xff0c;突然&#xff0c;它眼前一亮。 艾瑞克牛&#xff0c;社畜属&#xff0c;躺平体质&#xff0c;1996年9月6日出生&#xff0c;现年59岁&#xff0c;剩余寿命1小时15分08秒…… 当晚&#xff0c;在不足20平的出…

【Unity之FGUI】Fairy GUI面板的创建相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

vue组件的基本使用方法

组件 【1】组件是什么&#xff1f; 组件就是&#xff1a;扩展 HTML 元素&#xff0c;封装可重用的代码&#xff0c;目的是复用例如&#xff1a;有一个轮播图&#xff0c;可以在很多页面中使用&#xff0c;一个轮播有js&#xff0c;css&#xff0c;html组件把js&#xff0c;cs…

【移动云】5G时代——你我的智慧云

文章目录 0.引言1.移动云简介2.移动云学习资源3.移动云产品介绍3.1 大数据—数据可视化&#xff08;DataInsight&#xff09;3.1.1 应用场景3.1.2 产品基本架构3.1.3 优势 3.2 云主机ECS3.2.1 云主机ECS优势3.2.2 云主机主要功能3.2.3 应用场景 4.移动云解决方案4.1 热门案例1&…

男士内裤哪个品牌好穿舒服?适合夏季的五款男士内裤推荐

很多男性对内裤的不重视&#xff0c;似乎是与生俱来的&#xff0c;错把“糙汉”当“硬汉”。特别是一直以来都由女性包办内裤的男士&#xff0c;经常是不合适也勉强穿着。即使是生活条件不断提升的今天&#xff0c;还是有不少男士表面光鲜亮丽&#xff0c;对内裤反而不太讲究。…

解读:Mint Blockchain 最新路线图,释放 NFT 生态重磅发展计划

作者&#xff1a;Mint Ecosystem 关于 Mint Blockchain&#xff1a;Mint Blockchain 是一个以太坊原生 L2 网络&#xff0c;核心是发展 NFT 生态和产业&#xff0c;促进 NFT 领域的 Mass Adoption 产生。MintCore 团队致力于将 Mint Blockchain 打造成一个围绕服务 NFT 资产的…

SqlServer 2016 2017 2019安装失败-无法找到数据库引擎启动句柄

SqlServer 2016 2017 2019安装失败-无法找到数据库引擎启动句柄 出现以上问题的原因是因为系统账户无法操作数据库引擎服务。需要调整权限。 按照以下步骤解决&#xff0c;成功完成安装&#xff0c;已亲测&#xff1a; 1、如果您已经安装了相同版本的SQL Server&#xff0c;…