位置: IT常识 - 正文

关于飞书事件订阅功能的应用(飞书slogan)

编辑:rootadmin
此项目源码我也是站在巨人的肩膀上进行一个二次应用,感谢这位大神的共享 附上源码链接--Feishu-Event-Subscribe: 【实验】飞书的事件订阅 主要是通讯录发生变动-比如新增、编辑员工-将会将事件信息发送到指定的API接口。 (gitee.com) 本人修改后的源码链接--飞书订阅事件 ...

推荐整理分享关于飞书事件订阅功能的应用(飞书slogan),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:飞书解决什么问题,飞书slogan,飞书简介,飞书的发展历史,关于飞书消息输入的说法,飞书slogan,关于飞书消息输入的说法,飞书的案例,内容如对您有帮助,希望把文章链接给更多的朋友!

此项目源码我也是站在巨人的肩膀上进行一个二次应用,感谢这位大神的共享

附上源码链接--Feishu-Event-Subscribe: 【实验】飞书的事件订阅 主要是通讯录发生变动-比如新增、编辑员工-将会将事件信息发送到指定的API接口。 (gitee.com)

本人修改后的源码链接--飞书订阅事件

【实验】飞书的事件订阅

主要是通讯录发生变动-比如新增、编辑员工-将会将事件信息发送到指定的API接口。

参考文档事件订阅概述前情提要开发调试

飞书可以自己在pc客户端上创建一个自己的测试企业,用于开发调试。

飞书事件回调均使用Json交互,爽不爽? 爽 非常爽 配置注意点Encrypt Key是可选的,如果配了、就要对每个收到的请求消息解密使用飞书的事件订阅请求消息体目前有两个版本,有些同一个功能事件(比如用户更改)就有两种版本飞书事件推送全都推到同一个用户定义的URL上,而且都是POST JSON形式签名校验需要自己写配置请求网址和事件订阅

进入开发者后台,在开发者后台的应用列表中,点击需要配置应用,进入应用详情页。

在应用详情页中,点击左侧面板中 事件订阅 菜单。之后的配置均在该菜单页面下页面!

可选:配置 Encrypt Key ,可以不配,配的话就需要对飞书的消息进行解密了(是对每条飞书推送过来的事件都要进行解密),解密后得到的才是正确的json格式。解密代码样例(这个是飞书官方提供的):

import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Base64;public class NotifyDataDecrypter { private byte[] key; /** * @param encryptKey 飞书应用配置的 Encrypt Key */ public NotifyDataDecrypter(String encryptKey) { MessageDigest digest = null; try { digest = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e) { // won't happen } key = digest.digest(encryptKey.getBytes(StandardCharsets.UTF_8)); } /** * 解密 * @param encrypt 请求json encrypt的对应的值 */ public String decrypt(String encrypt) throws InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException { byte[] decode = Base64.getDecoder().decode(encrypt); Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING"); byte[] iv = new byte[16]; System.arraycopy(decode, 0, iv, 0, 16); byte[] data = new byte[decode.length - 16]; System.arraycopy(decode, 16, data, 0, data.length); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv)); byte[] r = cipher.doFinal(data); if (r.length > 0) { int p = r.length - 1; for (; p >= 0 && r[p] <= 16; p--) { } if (p != r.length - 1) { byte[] rr = new byte[p + 1]; System.arraycopy(r, 0, rr, 0, p + 1); r = rr; } } return new String(r, StandardCharsets.UTF_8); }}

设置Encrypt Key收到的请求消息体Json统一的格式都是,需要解密后才能使用:

// 收到的请求{ "encrypt": "ds3da3sj32421lkkld4s5ao" // 加密字符串} 关于飞书事件订阅功能的应用(飞书slogan)

配置 请求网址URL,就是说,后续飞书会将事件推送至改URL上,URL要求如下:

当应用订阅的事件触发时,开放平台会向该网址发送相应的 HTTP POST 请求。每个应用只能配置一个请求网址,该应用订阅的所有事件通知都会发送到该请求网址。

当在应用后台配置该 请求网址URL 的时候,飞书回向该URL发送一个POST请求进行URL校验,只有这个URL做出正确响应才能保存成功。URL校验会根据你是否配置了Encrypt Key发送不同的消息体Json。

未设置Encrypt Key发送的就是明文的Json:

// 收到的请求{ "challenge": "ajls384kdjx98XX", // 应用需要原样返回的值 "token": "xxxxxx", // Token的使用可参考文档“通过Token验证事件来源” "type": "url_verification" // 表示这是一个验证请求 }

设置Encrypt Key发送的就是加密的,解密之后的格式就是上面未设置Encrypt Key的明文Json格式:

// 实际收到的请求{ "encrypt": "ds3da3sj32421lkkld4s5ao" // 加密字符串} // 解密后{ "challenge": "ajls384kdjx98XX", // 应用需要原样返回的值 "token": "xxxxxx", // Token的使用可参考文档“通过Token验证事件来源” "type": "url_verification" // 表示这是一个验证请求 }

不管加密还是没加密,URL校验都要求用户服务器在1s内向飞书返回如下格式:

//响应内容如下{ "challenge": "ajls384kdjx98XX" // 应用需要原样返回的值 }

请求网址配置成功后,在下方你能看到可以订阅的事件列表,通过是否订阅的开关来 订阅 / 取消订阅事件。你想要什么类型的事件就在这里加什么事件,增加、取消后要进入 版本管理与发布重新进行应用的发布,让你订阅 / 取消的事件生效。

接受并响应事件

飞书通过HTTP POST发送Json格式时间数据到用户服务器中。用户服务器需要在1s内以HTTP 200状态码相应该请求(不需要返回什么Json数据什么的),否则视为此次事件推送失败,并以5s、5m、1h、6h的间隔重新推送事件,最多重试4次。

为了避免同一个事件处理了多次,你需要使用event_id(2.0版本事件)或者uuid(1.0版本事件)对事件的唯一性进行检查。如果你填写了Encrypt Key,在进行业务逻辑处理前请先参考这里进行解密。你可以检查 token (设置了Encrypt Key需要先解密,才能获取token)是否与开发者后台的 Verification Token 相同以确保这个事件的来源是飞书开放平台,而不是恶意的第三方伪造的事件。响应事件的版本

目前响应事件的数据格式有2个版本,现在新接入的事件都是采用2.0版本的格式。1.0版本就是返回一个用户Id给你然后你还要拿着用户Id在请求一次飞书接口;2.0版本就是直接把改动实体数据一次性全给你了,无需二次调用飞书接口。

事件返回包含schema字段,则是2.0版本;

如果接入了两个版本,会收到两种不同版本的事件!!!!!

// 2.0 版本示例{ "schema": "2.0", // 事件格式的版本。无此字段的即为1.0 "header": { "event_id": "f7984f25108f8137722bb63cee927e66", // 事件的唯一标识 "token": "066zT6pS4QCbgj5Do145GfDbbagCHGgF", // 即Verification Token "create_time": "1603977298000000", // 事件发送的时间 "event_type": "contact.user_group.created_v3", // 事件类型 "tenant_key": "xxxxxxx", // 企业标识 "app_id": "cli_xxxxxxxx", // 应用ID }, "event":{ ... // 不同事件此处数据不同 }}// 1.0 版本示例{ "ts": "1502199207.7171419", // 事件发送的时间,一般近似于事件发生的时间。 "uuid": "bc447199585340d1f3728d26b1c0297a", // 事件的唯一标识 "token": "41a9425ea7df4536a7623e38fa321bae", // 即Verification Token "type": "event_callback", // event_callback-事件推送,url_verification-url地址验证 "event":{ ... // 不同事件此处数据不同 }}事件顺序性

飞书见按照事件发生的顺序推送,对于相关数据的不同事件,将由开放平台保证推送顺序,只有前一个接收响应成功才会推送下一个消息。

有序事件的策略问:假如上一个事件相应飞书失败,且飞书重试4次(最多4次)之后均失败,后面的事件难道就卡住不动了?不会,重复推送直至失效就会推送下一个了。开放平台将基于开放业务选择对应的顺序规则如果有序事件消费失败,将对此事件重复推送直至失效后才会推送下一事件安全校验

事件安全校验是「可选」的,可以针对收到的http请求进行检验,以确认其合法性。

获取 encrypt_key:访问我的后台 -> 开发者后台 -> 点击应用 -> 事件订阅, 在事件订阅页面中查看 encrypt_key。校验请求来源:将请求头 X-Lark-Request-Timestamp、X-Lark-Request-Nonce 与 encrypt_key 拼接后 按照 encode('utf-8') 编码得到 byte[] b1,再拼接上 body, 得到一个 byte[] b。将 b 用 sha256 加密,得到字符串 s, 业务方校验 s 是否和请求头 X-Lark-Signature 一致。

参考代码

import org.apache.commons.codec.binary.Hex;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class FeishuSignatureUtils { /** * https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-security-verification * * @param timestamp Http请求头中的X-Lark-Request-Timestamp * @param nonce Http请求头中的X-Lark-Request-Nonce * @param encryptKey 飞书应用后台自己配置的encrypt key * @param bodyString 事件请求json串 */ public static String calculateSignature(String timestamp, String nonce, String encryptKey, String bodyString) throws NoSuchAlgorithmException { StringBuilder content = new StringBuilder(); content.append(timestamp).append(nonce).append(encryptKey).append(bodyString); MessageDigest alg = MessageDigest.getInstance("SHA-256"); return Hex.encodeHexString(alg.digest(content.toString().getBytes())); }}
本文链接地址:https://www.jiuchutong.com/zhishi/310783.html 转载请保留说明!

上一篇:织梦dede下拉菜单的实现方法-织梦下拉菜单的添加制作(织梦使用手册)

下一篇:WordPress忘记密码不能登陆怎么办,2种办法让你快速重置密码(wordpress账号密码忘记了)

  • 微信换背景图片在哪里设置(微信换背景图片怎么换)

    微信换背景图片在哪里设置(微信换背景图片怎么换)

  • 苹果手机根号怎么打(苹果手机根号怎么打出来在手机上)

    苹果手机根号怎么打(苹果手机根号怎么打出来在手机上)

  • 拼多多点击率多少正常(拼多多点击率多少才算爆款)

    拼多多点击率多少正常(拼多多点击率多少才算爆款)

  • 淘宝如何拉黑卖家不显示他店铺的东西(淘宝如何拉黑卖家店铺)

    淘宝如何拉黑卖家不显示他店铺的东西(淘宝如何拉黑卖家店铺)

  • 小米的其他文件是什么东西(小米的其他文件在哪里)

    小米的其他文件是什么东西(小米的其他文件在哪里)

  • 华为手机充电异常警告怎么去掉(华为手机充电异常怎么解决)

    华为手机充电异常警告怎么去掉(华为手机充电异常怎么解决)

  • 开机检测不到硬盘原因(开机检测不到硬盘重启又好了)

    开机检测不到硬盘原因(开机检测不到硬盘重启又好了)

  • 并排显示窗口快捷键(并排显示窗口快捷键用不了)

    并排显示窗口快捷键(并排显示窗口快捷键用不了)

  • 淘宝直播平台抽成多少(淘宝直播平台抽多少)

    淘宝直播平台抽成多少(淘宝直播平台抽多少)

  • 微信怎么删除部分聊天记录(微信怎么删除部分好友可见)

    微信怎么删除部分聊天记录(微信怎么删除部分好友可见)

  • 怎么把一页word放到另一个word里(怎么把一页word插到另一个word)

    怎么把一页word放到另一个word里(怎么把一页word插到另一个word)

  • 小米6充电器头多少w(小米充电器头可以充苹果手机吗)

    小米6充电器头多少w(小米充电器头可以充苹果手机吗)

  • 荣耀v30pro是多少w快充(荣耀v30pro是多少倍变焦)

    荣耀v30pro是多少w快充(荣耀v30pro是多少倍变焦)

  • 书旗网会自动续费吗(书旗小说自动扣费怎么关闭)

    书旗网会自动续费吗(书旗小说自动扣费怎么关闭)

  • 手机中bizimg能删除吗(手机中bizimg文件可以删除吗)

    手机中bizimg能删除吗(手机中bizimg文件可以删除吗)

  • 华为畅享10什么时候出(华为畅享10什么时候出的)

    华为畅享10什么时候出(华为畅享10什么时候出的)

  • 魅族手机是属于什么品牌(魅族手机是属于华为系列的吗)

    魅族手机是属于什么品牌(魅族手机是属于华为系列的吗)

  • 云闪付证件号与姓名不一致怎么办(云闪付证件号是什么)

    云闪付证件号与姓名不一致怎么办(云闪付证件号是什么)

  • 机械计算机用什么储存数据(机械计算机用什么电池好)

    机械计算机用什么储存数据(机械计算机用什么电池好)

  • 拼多多怎么图片搜衣服(拼多多怎么图片分享)

    拼多多怎么图片搜衣服(拼多多怎么图片分享)

  • 魔筷口令怎么获取(快手魔筷口令怎么获取)

    魔筷口令怎么获取(快手魔筷口令怎么获取)

  • 微信商家收款码可以取消吗(微信商家收款码收费标准2023)

    微信商家收款码可以取消吗(微信商家收款码收费标准2023)

  • 面对面建群管理员是谁(面对面建群管理员怎么弄)

    面对面建群管理员是谁(面对面建群管理员怎么弄)

  • p30pro双卡怎么装(华为p30pro怎么插双卡)

    p30pro双卡怎么装(华为p30pro怎么插双卡)

  • 4k手机有哪些(华为4k手机有哪些)

    4k手机有哪些(华为4k手机有哪些)

  • 主机电源风扇不转(主机电源风扇不转是什么原因)

    主机电源风扇不转(主机电源风扇不转是什么原因)

  • 充满电后不拔继续充会有什么危害(充满电不拔充电器会怎么样)

    充满电后不拔继续充会有什么危害(充满电不拔充电器会怎么样)

  • Linn of Quoich瀑布旁的碗状岩石洞,苏格兰阿伯丁郡 (© AWL Images/Danita Delimont)(fall 瀑布)

    Linn of Quoich瀑布旁的碗状岩石洞,苏格兰阿伯丁郡 (© AWL Images/Danita Delimont)(fall 瀑布)

  • 税务机关的义务是依法征管
  • 预提费用税务处理
  • 商品开票是什么意思
  • 建筑公司没有资质可以施工吗
  • 计提残疾人保障金会计分录
  • 应收账款未收到回函的替代程序
  • 行政性罚款可以扣除吗
  • 车间领用材料应填制什么凭证
  • 物业公司收取供热管道内网的维护费用合理吗
  • 长期待摊费用摊销表
  • 用友如何取消月末结转
  • 融资租赁首付款支付给供应商
  • 企业去年
  • 应交增值税明细科目如何结转
  • 劳务费增值税专用发票虚开一万元怎么补救
  • 其他应收款如何调平分录
  • 管理费用月末结账
  • 滴滴打车怎么整
  • 环卫公司增值税税率
  • 工程施工余额怎么处理
  • 水产类账目怎么做
  • 违约方能否要求返还价款
  • 赠与合同任意撤销与法定撤销的区别
  • win10电脑输入法不见了怎么恢复
  • 电脑管家使用教程
  • linux环境什么意思
  • 发票明细与实际不符是什么行为
  • vue3+ts写法
  • 实物资产的管理
  • 即征即退进项税转出
  • 劳务公司成本票不够怎么办
  • 股权置换和股权转让
  • 前端 原生
  • 增值税已认证抵扣
  • 增值税普通发票和电子普通发票的区别
  • 资产负债表不平衡能结账吗
  • 预算会计年末怎么结账
  • 公司缴纳社保应该怎么做账
  • 收到房租不开票账务处理
  • 公司车辆固定资产管理办法
  • 老板出差司机住哪
  • 进出口企业需要英文公章吗
  • sqlserver修改数据库密码
  • 一般纳税人可以给小规模开专票吗
  • 工程分包合同协议书
  • 建筑企业的安全技术措施
  • 预提费用多提了怎么办
  • 简易计税方法缴纳城建税和教育税
  • 计件工资怎么算公式
  • 小微企业取得的进项税能不能抵扣
  • 帮其他公司交水费税差
  • 汽车折旧费谁出
  • 银行的结息怎么做会计分录
  • 旅行社代订机票便宜吗
  • 应收账款转让会计分录 未实际收到对价
  • 印花税征税范围2021
  • mysqli查询
  • MySQL利用大数据技术进行回归模型的构建流程
  • linux如何用
  • centosip配置
  • 怎样升级智慧中小学版本软件
  • ibm笔记本开机进不去系统
  • Linux系统安全管理的内容包括
  • service.exe是什么
  • linux如何操作数据库
  • win10安装autocad2016错误
  • linux系统文件修复命令
  • android app启动过程
  • cocos2dx4.0教程
  • opengl
  • 动态规划之矩阵连乘
  • js最简单的代码
  • js 返回上一页面并刷新
  • jquery插件是干什么的
  • unity shader saturate
  • javascript面向对象编程指南第三版
  • 打印个人住房信息查询记录需要什么资料
  • 甘肃增值税发票查验平台官网
  • 一般纳税人开具的增值税普通发票和专用发票的区别
  • 北京地税app
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设