钉钉企业内部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: 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.mfbz.cn/a/653775.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

他用AI,抄袭了我的AI作品

《大话西游》里面有一句经典台词&#xff1a;每个人都有一个妈&#xff0c;但是“你妈就一定是你妈吗&#xff1f;” 用AI创作的艺术作品&#xff0c;也走进类似的困境&#xff1a;如何证明你用AI生成的作品&#xff0c;就是你的作品&#xff1f; 近日&#xff0c;腾讯科技独…

【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk

背景&#xff1a;部分客户需求将自己网站打包成app&#xff0c;供用户在浏览器安装使用、 网页网址快速生成app 准备材料操作流程第一步&#xff1a;打开HBuilder X新建项目第二步创建Wap2App项目第三步修改App图标第四步发布app第五步查看apk 准备材料 1.需要打包的网页 2.ap…

快速复制成功模式:解读SaaS裂变工具的核心价值

在数字化快速发展的今天&#xff0c;企业如何在竞争激烈的市场中迅速站稳脚跟&#xff0c;成为许多企业家和管理者关注的焦点。SaaS裂变工具作为一种创新的解决方案&#xff0c;以其独特的优势&#xff0c;帮助企业快速复制成功模式&#xff0c;实现业务的快速增长。 SaaS裂变工…

LED便携小型充气泵方案设计

当前推出的车载充气泵设计方案&#xff0c;是针对汽车轮胎充气及胎压监测等多功能于一体的PCBA方案。此方案不仅具备高精度的控制和测量能力&#xff0c;还采用了高集成度的芯片设计&#xff0c;支持三种压力单位的转换&#xff0c;并能适应多种类型产品的充气需求。以下是关于…

斯坦福报告解读3:图解有趣的评估基准(上)

《人工智能指数报告》由斯坦福大学、AI指数指导委员会及业内众多大佬Raymond Perrault、Erik Brynjolfsson 、James Manyika等人员和组织合著&#xff0c;旨在追踪、整理、提炼并可视化与人工智能&#xff08;AI&#xff09;相关各类数据&#xff0c;该报告已被大多数媒体及机构…

知识点总结

1、Uboot的流程调用&#xff1a; 1.1、cmd_process函数是怎么被调用到的&#xff1a; cmd_process在common/command.c 1.2、uboot阶段断电&#xff0c;后续起不来&#xff0c;可能要换线去使用&#xff0c;也许和电源线有关 2、git 相关使用 2.1 .gitignore相关的使用 1、…

搭建电商电子商务平台有哪些好用的电商API数据采集接口?

电商API接口主要用于帮助开发者将电商功能集成到自己的应用程序中&#xff0c;实现诸如商品检索、商品价格数据获取、订单处理、支付、物流跟踪等功能。以下是一些常用的电商API接口提供商&#xff1a; 主流电商平台API&#xff1a; 淘宝开放平台&#xff1a;提供淘宝、天猫、…

卤菜销售|基于SSM+vue的智能卤菜销售平台的设计与实现(源码+数据库+文档)

智能卤菜销售平台 目录 基于SSM&#xff0b;vue的智能卤菜销售平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 4商家功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

URL跳转

1.URL介绍 开放重定向&#xff08;Open Redirect&#xff09;&#xff0c;也叫URL跳转漏洞&#xff0c;是指服务端未对传入的跳转url变量进行检查和控制&#xff0c;导致诱导用户跳转到恶意网站&#xff0c;由于是从可信的站点跳转出去的&#xff0c;用户会比较信任。 2.URL跳…

有一个3x4的矩阵,求矩阵中所有元素中的最大值。要求用函数处理

解此题的算法已在之前的文章中介绍&#xff0c;详见&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/139181787 编写程序&#xff1a; 运行结果&#xff1a;

香橙派 AIPro开发板上手测评

前言 最近拿到了一个新玩具&#xff1a;香橙派 AIPro。一个只比银行卡大一点点的开发板能带给我们多少惊喜呢&#xff1f;接下来就跟我一起来体验下这块开发板的魅力。 一、硬件配置 CPU&#xff1a;配备了4核64位ARM处理器&#xff0c;其中默认预留1个给AI处理器使用 NPU&am…

【Qt常用控件】—— 布局管理器

目录 前言 &#xff08;一&#xff09;垂直布局 &#xff08;二&#xff09;水平布局 &#xff08;三&#xff09;网格布局 &#xff08;四&#xff09;表单布局 &#xff08;五&#xff09;分组布局 &#xff08;六&#xff09;Spacer 总结 前言 之前使⽤Qt在界⾯上…

听说部门来了个00后测试开发,一顿操作给我整麻了

公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司实习半年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍&#xff01…

HTML静态网页成品作业(HTML+CSS)——动漫熊出没介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

使用`War`包部署`Jenkins`(超级详细)

使用War包部署Jenkins(超级详细) 别着急&#xff0c;你看这年复一年&#xff0c;春光不必趁早&#xff0c;冬霜不会迟到。过去的都会过去&#xff0c;该来的都在路上&#xff0c;一切都是刚刚好。 网站说明 https://get.jenkins.io/war-stable/ war包下载地址 https://www.jenk…

AIGC笔记--基于PEFT库使用LoRA

1--相关讲解 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS LoRA 在 Stable Diffusion 中的三种应用&#xff1a;原理讲解与代码示例 PEFT-LoRA 2--基本原理 固定原始层&#xff0c;通过添加和训练两个低秩矩阵&#xff0c;达到微调模型的效果&#xff1b; 3--简单代…

boost asio异步服务器(2)实现伪闭包延长连接生命周期

闭包 在函数内部实现一个子函数&#xff0c;子函数的作用域内能访问外部函数的局部变量。闭包就是能够读取其他函数内部变量。但是由于闭包会使得函数中的变量都被保存在内存中&#xff0c;内存消耗很大&#xff0c;所以不能滥用闭包&#xff0c;否则会造成程的性能问题&#x…

没开玩笑!高速信号不能参考电源网络这条规则,其实很难做到

高速先生成员--黄刚 看到这篇文章的题目&#xff0c;我相信大家心里都呈现出了这么一个场景&#xff1a;高速信号线在L20层&#xff0c;我只要把L19和L21层都铺上完整的地平面&#xff0c;这不就满足了高速信号线不能参考电源平面这条规则了吗&#xff1f;这难道很难做到吗&…

51驱动DY-SV20F语音播放模块

51驱动DY-SV20F语音播放模块 简介模块特征电气参数工作模式配置原理图代码结果图 简介 DY-SV20F 是一款一对一分段触发控制播放器&#xff0c;支持 MP3,WAV 解码格式&#xff1b; 可分段触发 9 首曲目&#xff1b;低电平触发&#xff1b;3.7-5VDC 宽电压供电&#xff0c;直驱 …

expect自动交互

在执行命令或脚本的时候&#xff0c;当控制台提示我们需要输入账号密码、参数等信息的时候&#xff0c;expect可以将预设的参数值自动输入到控制台&#xff0c;实现了自动交互。 1. 安装expect yum install expect 2. 案例&#xff1a; 创建 demo.exp 文件&#xff0c;并添…