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

news2024/9/23 19:22:05

钉钉简单的推送钉消息

一、钉钉准备工作

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

钉钉开放平台创建企业内部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: 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 Explorer

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

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

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

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

最后希望能帮助到你们。

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

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

相关文章

mfc140u.dll丢失的解决方法有哪些?怎么全面修复mfc140u.dll文件

mfc140u.dll丢失其实相对来说不太常见到&#xff0c;因为这个文件一般是不丢失的&#xff0c;不过既然有人遇到这种问题&#xff0c;那么小编一定满足各位&#xff0c;给大家详细的唠叨一下mfc140u.dll丢失的各种解决方法&#xff0c;教大家以最快最有效率的方法去解决mfc140u.…

二零二四充能必读 | 618火热来袭,编程书单助你提升代码力

文章目录 &#x1f4d8; Java领域的经典之作&#x1f40d; Python学习者的宝典&#x1f310; 前端开发者的权威指南&#x1f512; 并发编程的艺术&#x1f916; JVM的深入理解&#x1f3d7; 构建自己的编程语言&#x1f9e0; 编程智慧的结晶&#x1f31f; 代码效率的提升 亲爱的…

开源监控工具monit安装部署

Monit 简介 Monit是一个轻量级(500KB)跨平台的用来监控Unix/linux系统的开源工具。部署简单&#xff0c;并且不依赖任何第三方程序、插件或者库。 Monit可以监控服务器进程、文件、文件系统、网络状态&#xff08;HTTP/SMTP等协议&#xff09;、远程主机、服务器资源变化等等。…

Android 架构 UseCase最佳实践

Android 架构 UseCase最佳实践 前言UseCase 的职责UseCase 的命名UseCase 的线程安全UseCase 的签名依赖UseCase 的引用透明UseCase 的接口抽象 前言 Android 官方的最新架构中引入了 Domain &#xff08;网域层 or 领域层&#xff09;&#xff0c;Domain Layer 由一个个 UseC…

《征服数据结构》双向链表

摘要&#xff1a; 1&#xff0c;双链表的介绍 2&#xff0c;双链表的用途 3&#xff0c;双链表的节点插入和删除 1&#xff0c;双链表的介绍 前面我们讲过单链表&#xff0c;单链表的特点就是只能往后访问不能往前访问。单链表一般在面试中用的比较多&#xff0c;比如删除倒数第…

【数据分析面试】55. 寻找双词组 (Python)

题目&#xff1a; 寻找双词组 &#xff08;Python&#xff09; 编写一个名为 find_bigrams 的函数&#xff0c;该函数接收一个句子或段落的字符串&#xff0c;并按顺序返回其所有双词组的列表。 注意&#xff1a; 双词组是指连续的两个单词。 示例&#xff1a; 输入&#x…

gitLab 使用tortoiseGit 克隆新项目 一直提示tortoiseGitPlink输入密码 输完也不生效

问题描述&#xff1a;准备用TortoiseGit拉取gitlab上一个新项目代码&#xff0c;出现tortoiseGitPlink提示让输入密码&#xff0c;输入后又弹出&#xff0c;反复几次&#xff0c;无法down下来代码。 解决方案&#xff1a; 1.找到PuTTYgen工具&#xff0c;打开 2. 点击load 按钮…

Docker是什么?使用场景作用及Docker的安装和启动详解

目录 Docker是什么&#xff1f; Docker的发展 Docker的安装 Docker使用 Docker的运行机制 第一个Docker容器 进入Docker容器 客户机访问容器 Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker …

网络安全防御之下一代防火墙部署思路分享

随着企业在数字化转型过程中不断深化&#xff0c;为了促进业务快速且安全地推出和更新&#xff0c;企业所采用的应用架构和部署方式经历了显著的演进&#xff1a;它们从单一应用转变为分层架构&#xff0c;进而发展为微服务架构&#xff1b;同时部署方式也由传统的本地部署进化…

区间选点问题-贪心-C++

问题&#xff1a; 给定 &#x1d441; 个闭区间 [ai,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 &#x1d441;&#xff0c;表示区间数…

这样问问题, 客户才会下单!

和供应商沟通时&#xff0c;提问方式至关重要。如何提问是外贸交流的关键&#xff0c;而针对客户的合适提问更是促成交易的秘诀。前不久&#xff0c; 我有一个客户想要一个不属于我们行业的新品&#xff0c; 于是我准备去阿里巴巴找找供应商。但因为我对该领域并不了解&#xf…

MYSQL 使用子查询id数据做条件更新

举例&#xff0c;我想查出某个表里面符合条件的前5条数据的id 做数据更新 &#xff1a; 想法 报错 更正写法 &#xff1a; 示例&#xff1a; UPDATE t_authorisation_record ar1JOIN (SELECT IDFROM t_authorisation_recordWHERE device_company_name JCcccORDER BY id ASCLI…

Python代码:二十一、增加派对名单(二)

1、题目 描述 为庆祝驼瑞驰在牛爱网找到合适的对象&#xff0c;驼瑞驰通过输入的多个连续字符串创建了一个列表作为派对邀请名单&#xff0c;在检查的时候发现少了他最好的朋友“Allen”的名字&#xff0c;因为是最好的朋友&#xff0c;他想让这个名字出现在邀请列表的最前面…

边缘计算网关的用途及其使用方法-天拓四方

在数字化日益深入的今天&#xff0c;边缘计算网关作为一种重要的设备&#xff0c;正在越来越多地被应用于各种场景中。它不仅能够提升数据处理的速度和效率&#xff0c;还能在降低网络延迟的同时确保数据的安全性。本文将详细介绍边缘计算网关的用途及其使用方法&#xff0c;帮…

linux安装mysql后,配置mysql,并连接navicate软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后&#xff0c;输入密码&#xff0c;不显示输入的密码 注意mysql服务状态&#xff0c;是否运行等 修改配置文件my.cnf&#xff0c;这里没找到就找my.ini&#xff0c;指定有一个是对的 find / -name my.cnf 接下…

04_前端三大件JS

文章目录 JavaScript1.JS的组成部分2.JS引入2.1 直接在head中通过一对script标签定义脚本代码2.2创建JS函数池文件&#xff0c;所有html文件共享调用 3.JS的数据类型和运算符4.分支结构5.循环结构6.JS函数的声明7.JS中自定义对象8.JS_JSON在客户端使用8.1JSON串格式8.2JSON在前…

2024年zoom会议受主持人账户限制影响,无法加入会议。(错误代码13215)

问题一、老师&#xff0c;你好!我的zoom账户&#xff0c;刚开始注册后可以登录&#xff0c;但是现在登录不了了。代码1044。其次&#xff0c;我如果通过网页版设置会议号&#xff0c;别人也加入不了。代码13215。 这两个问题一般会同时出现。登录失败。(错误代码:1044)一般是创…

如何自动识别图片上的文字?一键转文本方法分享

如何自动识别图片上的文字&#xff1f;自动识别图片上的文字&#xff0c;即OCR技术&#xff0c;已经取得显著进步&#xff0c;并在多个领域得到广泛应用。它可以极大地提高我们处理文本信息的效率&#xff0c;无论是从文档扫描、图片识别&#xff0c;还是到自动翻译和数据录入&…

【干货】如何用SaaS商城助力全球化布局

在全球化的大潮中&#xff0c;企业如何迅速而有效地拓展海外市场&#xff0c;成为了众多企业家和管理者关注的焦点。随着技术的发展&#xff0c;SaaS&#xff08;软件即服务&#xff09;商城作为一种创新的商业模式&#xff0c;为企业全球化布局提供了强有力的支持。saas商城如…

Java整合EasyExcel实战——2 导出复杂表头

详情代码 实体类 Data public class ComplexHeadData {ExcelProperty({"主标题", "字符串标题"})private String string;ExcelProperty({"主标题", "日期标题"})private Date date;ExcelProperty({"主标题", "数字标…