java对接钉钉 发送/更新 互动卡片消息

java对接钉钉 发送/更新 互动卡片消息

    • 一、准备工作
    • 二、发送互动卡片消息
    • 三、更新互动消息卡片

先看下效果图
积分审核
点击相应的积分按钮,就会给对应的申请人发送对应的积分(对接到我们自己的系统发送),审核完之后,按钮变成已审核。
在这里插入图片描述
接下来就开始吧!

一、准备工作

参考钉钉提供的 互动卡片消息发送流程

步骤一:创建消息模板

这里简单给出示例,具体可以参考钉钉给的示例
在这里插入图片描述
步骤二:注册卡片回调地址
需要告诉钉钉用户点击卡片后,要回调到我们自己系统的哪个接口
部分代码如下:在这里插入图片描述

public void interactiveCardRegisterCallBack(String callBackUrl, Boolean forceUpdate) {try {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/im/chat/scencegroup/interactivecard/callback/register");OapiImChatScencegroupInteractivecardCallbackRegisterRequest req = new OapiImChatScencegroupInteractivecardCallbackRegisterRequest();req.setCallbackUrl(callBackUrl);req.setForceUpdate(forceUpdate);OapiImChatScencegroupInteractivecardCallbackRegisterResponse registerRespone = client.execute(req, getAccessToken());if (registerRespone.isSuccess()) {logger.info("互动卡片回调注册成功!");} else {logger.info("互动卡片回调注册失败,原因:" + registerRespone.getErrmsg());}} catch (ApiException e) {logger.info("互动卡片回调注册失败,原因是:" + e.getErrMsg());}}

步骤三:创建群模板
因为卡片消息是基于场景群发送的,所以我们要先创建一个群模板,群模板里面包括:群插件和群机器人,二者的介绍可以参考场景群的开发文档 https://developers.dingtalk.com/document/chatgroup在这里插入图片描述
创建群模板的流程钉钉给的已经很详细了,我这里就不多赘述了,但是要注意一点,创建完群模板要点一下灰度,这样才能使该群模板运用到其他场景群中。下图是创建好的模板
在这里插入图片描述
模板详情
步骤四:给场景群启用群模板
有两种方式,第一种是根据群模板ID创建一个新的场景群,适用于还没有场景群的情况;第二种是给已存在的群设置群模板,其中调用api启用群模板的时候需要一个open_conversation_id(群id),感觉这里钉钉文档写的有问题在这里插入图片描述
因为我们要查询已存在群的群id,按照提示,就只能调用查询群信息接口获取了对吧,但当我点进去发现在这里插入图片描述

后来我仔细研究api文档后找到了一个获取群id的方法:通过chatid获取群信息,这个接口里面可以查询到open_conversation_id,但是需要chatid(群会话的ID)作为参数,而这个chatid可以通过调用前端接口获取到。

至此准备工作完成!

二、发送互动卡片消息

1.发送卡片消息接口,需要注意的是如果两个卡片消息的outTrackId一样的话,只会发一次
在这里插入图片描述

    /*** 使用 Token 初始化账号Client* @return Client* @exception Exception*/public static Client createClient() throws Exception {Config config = new Config();config.protocol = "https";config.regionId = "central";return new Client(config);}public void sendInteractiveCardMessage(String cardTemplateId, String openConversationId, String outTrackId, Map<String, String> cardDataCardParamMap, Map<String, String> cardDataCardMediaIdParamMap) {try {Client client = DingServiceImpl.createClient();SendInteractiveCardHeaders sendInteractiveCardHeaders = new SendInteractiveCardHeaders();sendInteractiveCardHeaders.xAcsDingtalkAccessToken = getAccessToken();SendInteractiveCardRequest.SendInteractiveCardRequestCardData cardData = new SendInteractiveCardRequest.SendInteractiveCardRequestCardData().setCardMediaIdParamMap(cardDataCardMediaIdParamMap).setCardParamMap(cardDataCardParamMap);SendInteractiveCardRequest sendInteractiveCardRequest = new SendInteractiveCardRequest().setCardTemplateId("消息模板id").setOpenConversationId("接收卡片消息的群id").setOutTrackId(outTrackId).setRobotCode("群模板里的群机器人id").setConversationType(1).setCardData(cardData);client.sendInteractiveCardWithOptions(sendInteractiveCardRequest, sendInteractiveCardHeaders, new RuntimeOptions());sendToWebHook("互动卡片消息发送成功", ApiUrlConstant.WEB_HOOK_TEST);} catch (Exception e) {logger.error("互动卡片消息发送失败", e);sendToWebHook("互动卡片消息发送失败,请查看日志", ApiUrlConstant.WEB_HOOK_TEST);}}

2.在业务代码里面调用上述接口,代码里面写的参数一定要和消息模板的参数对应

private void sendInteractiveCardMessage(IntegralApplicationDO integralApplicationDO) {// 消息的参数Map<String, String> cardDataParamMap = new HashMap<>(16);cardDataParamMap.put("applyContent", integralApplicationDO.getApplyContent());UserInfoDO applyUser = userInfoService.getUserByUserId(integralApplicationDO.getApplyUserId());if (Objects.nonNull(applyUser)) {cardDataParamMap.put("userName", applyUser.getUserName());}String interestGroupName = "-";Long interestGroup = integralApplicationDO.getInterestGroup();if (interestGroup != null) {InterestGroupDO interestGroupDO = interestGroupDao.getById(interestGroup);if (Objects.nonNull(interestGroupDO)) {interestGroupName = interestGroupDO.getGroupName();}}cardDataParamMap.put("interestGroup", interestGroupName);cardDataParamMap.put("applyTime", DateUtils.formatDate("yyyy-MM-dd HH:mm:ss", integralApplicationDO.getGmtCommit()));String applyType = "积分类型";cardDataParamMap.put("applyType", applyType);Map<String, String> cardDataMediaIdParamMap = new HashMap<>(16);// 这里是因为我们卡片消息里面要放图片String applyImagesUrl = integralApplicationDO.getApplyImagesUrl();if (StringUtils.isNotEmpty(applyImagesUrl)) {String[] applyImagesUrlArr = applyImagesUrl.split(",");for (int i = 1; i <= applyImagesUrlArr.length; i++) {String imageName = "image" + i;String mediaId = dingService.getUploadMediaId(applyImagesUrlArr[i - 1], "image");cardDataMediaIdParamMap.put(imageName, mediaId);}}String cardTemplateId = "消息模板id";String openConversationId = "接收卡片消息的群id";dingService.sendInteractiveCardMessage(cardTemplateId, openConversationId, integralApplicationDO.getId().toString() + "-" + UUID.randomUUID().toString().replace("-", ""), cardDataParamMap, cardDataMediaIdParamMap);}

这样卡片消息就会发到对应的群里面啦!

三、更新互动消息卡片

更新就比较简单啦,部分代码如下,其中outTrackId就是发送卡片消息的时候的那个唯一标识。

public void updateInteractiveCardMessage(Map<String, String> cardDataCardParamMap, String outTrackId) {try {Client client = DingServiceImpl.createClient();logger.info("cardDataCardParamMap: " + cardDataCardParamMap + ",outTrackId: " + outTrackId);UpdateInteractiveCardHeaders updateInteractiveCardHeaders = new UpdateInteractiveCardHeaders();updateInteractiveCardHeaders.xAcsDingtalkAccessToken = getAccessToken();UpdateInteractiveCardRequest.UpdateInteractiveCardRequestCardOptions cardOptions = new UpdateInteractiveCardRequest.UpdateInteractiveCardRequestCardOptions().setUpdateCardDataByKey(true);UpdateInteractiveCardRequest.UpdateInteractiveCardRequestCardData cardData = new UpdateInteractiveCardRequest.UpdateInteractiveCardRequestCardData().setCardParamMap(cardDataCardParamMap);UpdateInteractiveCardRequest updateInteractiveCardRequest = new UpdateInteractiveCardRequest().setOutTrackId(outTrackId).setCardOptions(cardOptions).setUserIdType(1).setCardData(cardData);client.updateInteractiveCardWithOptions(updateInteractiveCardRequest, updateInteractiveCardHeaders, new RuntimeOptions());} catch (Exception e) {logger.error("互动卡片消息更新失败", e);sendToWebHook("互动卡片消息更新失败,请查看日志", ApiUrlConstant.WEB_HOOK_TEST);}}

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

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

相关文章

PHP-钉钉扫码登录对接第三方网站

这个小功能对于企业内部的一些自用后台网站还是很常用的&#xff0c;对接也相对简单&#xff0c;记录下对接流程。 开发文档&#xff1a;扫码登录第三方网站 - 钉钉开放平台 1.先登录钉钉开发者后台&#xff0c;创建扫码登录应用授权 开发者后台统一登录 - 钉钉统一身份认证 …

TED1984-2019全部中英对照演讲稿集 学习英文演讲写作的好帮手

TED1984-2019全部中英对照演讲稿集 学习英文演讲写作的好帮手 一、TED简介&#xff1a; TED&#xff08;指Technology, Entertainment, Design在英语中的缩写&#xff0c;即技术、娱乐、设计&#xff09;是美国的一家私有非营利机构&#xff0c;该机构以它组织的TED大会著称&…

那些会讲ppt的技术人有多爽?演讲的6个步骤

一场好的技术分享&#xff0c;可以用“有趣有料”四个字来形容&#xff0c;那么如何才能做到有趣又有料呢&#xff1f;结合我的经历&#xff0c;做了一些总结。 2015年&#xff0c;我出版《技术管理之巅》以后&#xff0c;先后收到QCon、CSDN、IT168等业界知名技术大会的邀请担…

关于计算机的英语演讲ppt模板,英语演讲ppt模板

目录 一、英语演讲ppt素材 ①.要简单点的 内容不限 但最好是寓言或者能给人点启示的东西 有意思就行 背景。 ②.要简单点的 内容不限 但最好是寓言或者能给人点启示的东西 有意思就行 背景。 ③.时间3-5分钟&#xff0c;主题无所谓&#xff0c;liuxiaoxuan89tom.com ④.Mans li…

自定义Msgbox密码登录

背景&#xff1a;虽然Excel是自带密码功能的&#xff0c;但是设置了密码以后&#xff0c;打开excel&#xff0c;是看不到excel的内容的。 如果想让使用者打开excel&#xff0c;能大概看到excel的内容 &#xff0c;但是会有弹窗&#xff0c;导致没法选择和更改数据&#xff0c;就…

Linux 系统密码策略设置

目录 Linux主要密码安全需求 1. 禁止使用旧密码 2.设置密码最短长度 3.设置密码复杂度 4.设置密码过期期限 Linux密码策略理论知识&#xff1a; 1、使用配置文件/etc/pam.conf 2、使用配置目录/etc/pam.d/ 讲怎么使用&#xff0c;后面有理论教程&#xff0c;先知其然再…

远程计算机guest密码更改了,怎么给guest设置密码

我们一般是在控制面板 - 用户帐户下启用来宾帐户&#xff0c;但我们可以在guest(供来宾访问计算机或访问域的内置帐户)下新建用户名和设置密码&#xff0c;方法简单&#xff0c;操作容易。下面是学习啦小编给大家整理的一些有关给guest设置密码的方法&#xff0c;希望对大家有帮…

计算机知识科普讲解大赛,谁是科普达人?2020年成都市科普讲解大赛拉开帷幕...

生活中无处不在的电磁波是怎样产生的呢&#xff1f; 被称为“汉代计算机”的一钩多综式提花织机与成都有什么关系&#xff1f; …… 近日&#xff0c;成都博物馆&#xff0c;40余家单位的70余名选手&#xff0c;通过4分钟参赛视频&#xff0c;亮相2020年成都市科普讲解大赛预赛…

chatgpt赋能python:Python预测分析:什么是预测分析?

Python预测分析&#xff1a;什么是预测分析&#xff1f; 随着数字化时代的到来&#xff0c;数据越来越多&#xff0c;数据分析的需求也随之增加。预测分析就是一种基于数据分析的技术&#xff0c;可以通过数据分析并应用统计模型&#xff0c;来预测未来发生的事件或趋势&#…

度盘搜失效?这款网盘搜索神器万万别错过!

奶糖猫来啦&#xff01;资源搜索一直以来都是需求非常大的一方面&#xff0c;总会有伙伴问我有没有这方面比较好用的软件。 之前很火的度盘搜失效了&#xff0c;后面也出现了一系列的资源搜索工具&#xff0c;但总存在一个致命的问题&#xff0c;资源普遍太老了&#xff0c;不能…

好用的网盘搜索引擎

最近&#xff0c;我们见到了许多安利网盘搜索引擎的推文&#xff0c;安利了很多网址和论坛。但经过答主亲测&#xff0c;许多被提到的网站&#xff0c;不是打不开链接&#xff0c;就是进去发现是广告&#xff0c;早已经被封停了&#xff0c;所以我们亲自测试了一些这方面的内容…

百度云盘搜索助手 V1.2(可查询提取码,带5个搜索引擎)

介绍&#xff1a; 云盘搜索助手功能强大&#xff0c;操作简单&#xff0c;使用后可以帮助用户更轻松快捷的搜索云盘资源。软件内置5个搜索引擎供您查资源&#xff0c;另外内置查询提取码功能。 网盘下载地址&#xff1a; http://www.bytepan.com/bNjeq9AKuVC 图片&#xff1a…

百度网盘_SEARCH

需求分析 我有一些资源网站&#xff0c;但是每次我需要资源的时候需要打开他们的网页&#xff0c;搜索再筛选我需要的网盘资源&#xff0c;这样的操作非常麻烦使用python模拟这些搜索操作&#xff0c;然后爬取我需要的百度网盘信息用python的Gui编程开发一个简单的界面 实现 …

使用ChatGPT进行个性化学习

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 在这篇文章中&#xff0c;您将发现 ChatGPT 作为机器学习和数据科学爱好者的个人导师的好处。特别是&#xff0c;您将学习 如何让ChatGPT引导你学习抽象代数如何让 ChatGPT 帮助您…

【对话ChatGPT】如何使用ChatGpt来学习和提问?

ChatGPT的不断发展和进步&#xff0c;我们需要工作中很多时候会用到ChatGPT&#xff0c;那么如何使用ChatGPT来解决我们工作中的问题呢&#xff1f; Q1 如何向ChatGPT提问&#xff0c;从而更快解决我们的问题&#xff1f; ChatGPT&#xff1a;以下是向ChatGPT提问的一些提示&am…

chatgpt赋能python:Python收费介绍

Python收费介绍 什么是Python? Python是一种高级的、解释性、面向对象、纯粹的动态语言&#xff0c;多用于快速应用程序开发、脚本编写、系统管理任务等。它有一个简单直观优美的语法&#xff0c;非常容易学习。 Python的收费形式 Python语言本身是免费的&#xff0c;任何…

微信「订阅号助手」 App 正式上线,请尽情吐槽!

说了一年&#xff0c;有可能做了更久。 现在微信「订阅号助手」 App 终于上线了&#xff0c;结果竟是这个。 打开微信订阅号助手 app&#xff0c;目前有邮箱登录和微信登陆两种方式&#xff0c;对于微信运营者来说&#xff0c;微信登陆无需输入账号密码&#xff0c;无疑是最省事…

易媒助手是自媒体一键式发布平台吗?

自媒体领域发展迅速&#xff0c;在当前这个大环境中&#xff0c;小伙伴们必须提高自己的内容发布效率&#xff0c;增加作品曝光量&#xff0c;才能在这个行业站得住脚。那么这里就要用到一些自媒体工具&#xff0c;比如像易媒助手这样的自媒体工具是一键发布内容平台吗&#xf…

自媒体营销工具-绑定自媒体账号一键分发到媒体平台,让运营高效省心

一、什么是自媒体营销 自媒体营销就是利用社会化网络、在线社区、博客、百科、短视频、微博、微信、今 日头条、百度、搜狐、凤凰、UC 等平台或者其他互联网协作平台和媒体来传播和发布 资讯&#xff0c;从而形成的营销、销售、公共关系处理和客户关系服务维护及开拓的一种方 …

模拟微信自动化发送(微信公众号文章自动点击)

大家好&#xff0c;我是烤鸭&#xff1a; 分享个微信自动化发送的新方式&#xff0c;仅技术分享。 本来是公众号文章抓取相关的&#xff0c;审核一直不过&#xff0c;将就看吧。 需要的工具 Java&#xff08;jdk1.8&#xff09; Fiddler Python&#xff08;3.8&#xff09;…