【案例总结】震撼巨作——SAP连接钉钉WEBHOOK

【案例总结】震撼巨作——SAP连接钉钉WEBHOOK

目录

前言:

一、钉钉配置

1、AI表格创建

2、自动化流程设置

3、webhook接口参数:

二、SAP开发

1、接口开发

2、接口测试

三、一些经验

四、BUG解决


前言:

蛐蛐:这个人又在拟一些夸张的标题试图吸引读者。

最近公司全面开始使用钉钉,用户想要将SAP的消息推送到钉钉,可以推送消息给公司的具体某个人,也可以推送消息到某个群聊。

做出来的效果如下:

今天就来分享一下,我具体是怎么实现的吧,老样子,文末有代码分享~

一、钉钉配置

因为钉钉有上线一个新功能,叫做AI表格,功能也是蛮强大的,这次我就使用了AI表格中的自动化流程中的webhook接口。(PS:这个和钉钉的机器人连接方式有区别哦,请注意我这里是AI表格-自动化-webhook!webhook连接要比机器人API连接要简单一点)。

1、AI表格创建

问题来了,要是钉钉没有AI表格怎么办,emmm有可能是版本没升级^_^

首先我们创建一个自己使用的AI表格,我这里使用的是空白模板,我们在表格里面可以设置一些字段,就和EXCEL差不多的,这个表格等会儿可以当作后台表来存放我们从SAP传过来的一些数据,类似于SAP的后台日志表一样的功能。

我是像下面这样设置的,比较简单:

2、自动化流程设置

设置好日志表的字段后,我们的视线上移,可以看到这里有个“自动化”,我们点击自动化,进入自动化流程配置:

进入后,可以进行一些自动化配置,功能非常完善,我的自动化流程配置如下:

配置完成之后,就相当于在钉钉系统增加了一个接口,SAP可以调用这个接口,给钉钉系统发送数据,钉钉成功接收数据之后,可以利用这些数据自行做后面一系列的操作,类似于给某人发送消息、给某个群聊发送消息、给某人增加待办等等操作,这是钉钉里面的操作了,这里就不做细讲,钉钉也有专门出过一些教程,大家有兴趣可以直接进钉钉里面查看。

3、webhook接口参数:

接着我们开始来讲webhook,这是我今天的重点哈哈,webhook其实就相当于一个API、一个接口,那接口的话,传输数据肯定是需要参数字段的撒,我的参数设置如下:

附上钉钉的官方操作文档连接:https://wolai.dingtalk.com/oDZLkD5ifBR9eU9DEwT7ie

二、SAP开发

我们就像连接其他别的API/restful接口一样,连接钉钉的webhook接口就可以了,注意,我这里是将这个接口封装起来了,我只需要在程序中调用封装的这个接口就可以了。

调用效果如下:

1、接口开发

让我们我们直击接口内部,走进代码现场。

对于接口参考,我最在乎的是参数设置,我这样设置的:是我将文本字段设置成了一个结构

下面红框里面的代码就是实现webhook的参数结构的代码:

整体代码如下:

FUNCTION ZTEST_API. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(I_BUDAT) TYPE BUDAT *" REFERENCE(I_TYPE) TYPE BAPI_MTYPE *" EXPORTING *" VALUE(E_MSEG) TYPE BAPI_MSG *" VALUE(E_TYPE) TYPE BAPI_MTYPE *" TABLES *" T_TAB STRUCTURE ZTXX_WEBHOOK *"------------------------------------------------------------------- DATA: LV_ECS_JSON_REQ TYPE STRING, LV_ECS_JSON_RES TYPE STRING, LV_URL TYPE STRING, LV_RESPONSE TYPE STRING. DATA: LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT. DATA: LO_EXCEPTION TYPE REF TO CX_ROOT. DATA: LV_ERROR_TEXT TYPE STRING. TYPES: TY_DETAILS TYPE STANDARD TABLE OF ZTXX_WEBHOOK WITH DEFAULT KEY. TYPES: BEGIN OF TY_REQUEST, BUDAT TYPE BUDAT, TYPE1 TYPE BAPI_MTYPE, TAB TYPE TY_DETAILS, END OF TY_REQUEST. TYPES: BEGIN OF TY_RESPONSE, DATA TYPE ABAP_BOOL, SUCCESS TYPE ABAP_BOOL, END OF TY_RESPONSE. DATA: LS_REQUEST TYPE TY_REQUEST, LS_RESPONSE TYPE TY_RESPONSE. * 1. 准备请求数据 LS_REQUEST = VALUE #( BUDAT = I_BUDAT TYPE1 = I_TYPE ). APPEND LINES OF T_TAB[] TO LS_REQUEST-TAB. * 2. 序列化请求数据 TRY. LV_ECS_JSON_REQ = /UI2/CL_JSON=>SERIALIZE( DATA = LS_REQUEST PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-LOW_CASE ). CATCH CX_ROOT INTO LO_EXCEPTION. E_MSEG = 'JSON序列化失败: ' && LO_EXCEPTION->GET_TEXT( ). E_TYPE = 'E'. RETURN. ENDTRY. * 3. 设置URL(固定地址,可以配置成后台表去读取) LV_URL = 'webhook地址'."要自己替换哈 * 4. 创建HTTP客户端 TRY. CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL EXPORTING URL = LV_URL IMPORTING CLIENT = LO_HTTP_CLIENT EXCEPTIONS ARGUMENT_NOT_FOUND = 1 PLUGIN_NOT_ACTIVE = 2 INTERNAL_ERROR = 3 OTHERS = 4. IF SY-SUBRC <> 0. E_MSEG = '创建HTTP客户端失败'. E_TYPE = 'E'. RETURN. ENDIF. CATCH CX_ROOT INTO LO_EXCEPTION. E_MSEG = '创建HTTP客户端异常: ' && LO_EXCEPTION->GET_TEXT( ). E_TYPE = 'E'. RETURN. ENDTRY. ** 5. 配置请求头 LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ). LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE( 'application/json' ). LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'OperationCode' VALUE = 'xxxx.webhook' )."要自己替换哈 LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'ClientId' VALUE = 'XXX' )."要自己替换哈 ** 设置请求数据 LO_HTTP_CLIENT->REQUEST->SET_CDATA( LV_ECS_JSON_REQ ). * 6. 发送请求 TRY. LO_HTTP_CLIENT->SEND( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1 HTTP_INVALID_STATE = 2 OTHERS = 3 ). IF SY-SUBRC <> 0. LV_ERROR_TEXT = '发送请求失败'. IF SY-SUBRC = 1. LV_ERROR_TEXT = 'HTTP通信失败'. ELSEIF SY-SUBRC = 2. LV_ERROR_TEXT = 'HTTP状态无效'. ENDIF. E_MSEG = LV_ERROR_TEXT. E_TYPE = 'E'. LO_HTTP_CLIENT->CLOSE( ). RETURN. ENDIF. CATCH CX_ROOT INTO LO_EXCEPTION. E_MSEG = '发送请求异常: ' && LO_EXCEPTION->GET_TEXT( ). E_TYPE = 'E'. LO_HTTP_CLIENT->CLOSE( ). RETURN. ENDTRY. * 7. 接收响应 TRY. LO_HTTP_CLIENT->RECEIVE( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1 HTTP_INVALID_STATE = 2 OTHERS = 3 ). IF SY-SUBRC <> 0. LV_ERROR_TEXT = '接收响应失败'. IF SY-SUBRC = 1. LV_ERROR_TEXT = 'HTTP通信失败'. ELSEIF SY-SUBRC = 2. LV_ERROR_TEXT = 'HTTP状态无效'. ENDIF. E_MSEG = LV_ERROR_TEXT. E_TYPE = 'E'. LO_HTTP_CLIENT->CLOSE( ). RETURN. ENDIF. CATCH CX_ROOT INTO LO_EXCEPTION. E_MSEG = '接收响应异常: ' && LO_EXCEPTION->GET_TEXT( ). E_TYPE = 'E'. LO_HTTP_CLIENT->CLOSE( ). RETURN. ENDTRY. * 8. 获取响应数据 LV_RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ). * 9. 关闭连接 LO_HTTP_CLIENT->CLOSE( ). * 10. 解析响应数据 TRY. /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_RESPONSE PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-LOW_CASE CHANGING DATA = LS_RESPONSE ). CATCH CX_ROOT INTO LO_EXCEPTION. E_MSEG = 'JSON反序列化失败: ' && LO_EXCEPTION->GET_TEXT( ). E_TYPE = 'E'. RETURN. ENDTRY. * 11. 处理响应结果 IF LS_RESPONSE-SUCCESS = ABAP_TRUE. E_TYPE = 'S'. E_MSEG = '接口调用成功'. ELSE. E_TYPE = 'E'. E_MSEG = '接口调用失败'. ENDIF. ENDFUNCTION. 

注释都在代码里面,复制就可以使用,但是要注意url等参数更改为自己的钉钉webbhook地址

2、接口测试

当我们把接口开发完之后,就可以测试了,和我们平时测试接口的方式一样,就填写数据,然后访问webhook,看是否请求成功就可以了。不过测试的时候要注意哟,我们连接的是钉钉的正式环境哟,不要发很多奇奇怪怪的消息哈。

按照上述的步骤,应该是可以成功的,不过还有一些经验要分享。如果你到这一步骤已经成功了,那就恭喜你啦,真棒!如果到这一步骤你还没有成功,别急,我最开始也失败了,我们来接着看,我有一些经验要继续分享~

三、一些经验

1、上面分享的代码是已经成功联通钉钉的代码,从上面的代码可以看出,我们没有去调用钉钉的接口获取token,所以当你的SAP连接钉钉webhook接口联不通的时候,不用怀疑token的问题,因为连接钉钉webhook是不需要获取token的。

2、请求头的设置,正常只需要设置post方法和application/json格式就可以了,也不用怀疑请求头,不过如果你写了的话,一定要保证是正确的哦。

3、我在测试时的致命bug是,同样的参数、格式、请求头,我使用POSTMAN调用webhook就是成功的,但是我使用SAP去调用webhook就失败了。

四、BUG解决

由于这一部分内容太多,单独拎出来做成一小节单独讲解。

不知道你是不是很困惑,反正我是很困惑了。因为我们公司没有basis顾问,所以我请教了我们运维网络的同事:

我和文老师从服务器、网络、网络权限、代理等各个地方都排查了一遍,最后在SAP系统使用SMICM监测后,发现是安全证书的问题!(可以把报错复制下来问AI,红色的就是数据本身带的颜色,很明显,但是数据量太大了,有可能一滑就过了就不容易发现,这个人刚刚好像说了一个病句,没关系,能够找到问题就是了)

我自己从网页上下载的是好像什么G2证书,这里面有提示是说要提供R3证书,所以校验还是不通过的。

下面是文老师和AI的分析:

因为我确实找不到R3根证书,所以我去我们钉钉实施顾问那里反馈了,她是三方外包的团队,也没有办法解决这种问题,但是她非常热心地帮我向钉钉官方提交了一个问题工单,邀请了钉钉官方的技术顾问帮忙解决。

但是!官方技术顾问拒绝了提供R3根证书给我,并回答我这个证书涉及安全问题,不能提供。所以也没有办法再要求人家什么了(这一part没有截图,因为问题无解,然后工单结束了,然后群聊解散了哈哈)

就在我一度快要放弃的时候!嗯哼~灵机一动,我突然想到了我们的中间系统。

我必须画个图来体现一下,上图:

左边没有使用中间系统,失败;右边使用了中间系统,成功

ESB 即企业服务总线(Enterprise Service Bus),是一种企业级的软件架构模式和中间件技术。 从架构层面看,它是一个在企业信息系统环境中用于集成各种不同应用程序、服务和系统的通信中枢。 这个中枢提供了一个统一的通信平台,使企业内部(如不同部门的业务系统)和外部(如与合作伙伴的系统)的软件组件能够相互交互,就像城市中的公共交通系统,各个地点(软件系统)通过公交网络(ESB)连接起来。(就是类似数据中台、日志系统这种)

总的来说就是,SAP系统和ESB系统之间是可以联通的;而钉钉和ESB系统也是联通的。所以,通过ESB转发一下请求,SAP和钉钉就可以绕开安全证书的检验而连接上了,好啦~大功告成!

看一下钉钉的webhook后台记录吧!

只要数据成功从SAP到了钉钉系统,那么剩余的事情就好办了,利用钉钉AI表格里面自带的自动化功能,数据想怎么使用就怎么使用,存表、发到群聊、单独发给某人、给某人添加待办事项、做数据分析等等都可以,这里面就是钉钉的功能了,我就不过多介绍啦。

那么,事已至此,告辞!

Read more

计算机Java毕设实战-基于Spring Boot的教育机构师资资源管理系统设计与实现基于Web的师资管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Java毕设实战-基于Spring Boot的教育机构师资资源管理系统设计与实现基于Web的师资管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

java毕业设计-基于springboot的(源码+LW+部署文档+全bao+远程调试+代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围::小程序、SpringBoot、SSM、JSP、Vue、PHP、Java、python、爬虫、数据可视化、大数据、物联网、机器学习等设计与开发。 主要内容:免费开题报告、任务书、全bao定制+中期检查PPT、代码编写、🚢文编写和辅导、🚢文降重、长期答辩答疑辅导、一对一专业代码讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。 特色服务内容:答辩必过班 (全程一对一技术交流,帮助大家顺利完成答辩,

Linux网络 | 理解Web路径 以及 实现一个简单的helloworld网页

Linux网络 | 理解Web路径 以及 实现一个简单的helloworld网页

前言:本节内容承接上节课的http相关的概念, 主要是实现一个简单的接收http协议请求的服务。这个程序对于我们理解后面的http协议的格式,报头以及网络上的资源的理解, 以及本节web路径等等都有着重要作用。 可以说我们就用代码来理解这些东西。 那么废话不多说, 现在开始我们的学习吧。         ps:本节内容建议先看一下上一篇文章http的相关概念哦:linux网络 | 深度学习http的相关概念-ZEEKLOG博客 目录  准备文件  makefile HttpServer.hpp 类内成员 封装sockfd start  ThreadRun  全部代码 运行结果 响应书写 Web路径  准备文件         首先准备文件: 这里面Httpserver.cc用来运行接收http请求的服务。 HttpServer.hpp用来定义http请求。Log.hpp就是一个打印日志的小组件, Socket.hpp同样是套接字的组件。 到使用直接调用相关接口即可。(Log.hpp和Socket.hpp如何实现不讲解, 如果想要知道

前端八股文面经大全:字节前端一面(2026-2-1)·面经深度解析

前端八股文面经大全:字节前端一面(2026-2-1)·面经深度解析

前言 大家好,我是木斯佳。 在这个春节假期,当大家都在谈论返乡、团圆与休息时,作为一名技术人,我的思考却不由自主地转向了行业的「冬」与「春」。 相信很多人都感受到了,在AI浪潮的席卷之下,前端领域的门槛在变高,纯粹的“增删改查”岗位正在肉眼可见地减少。曾经热闹非凡的面经分享,如今也沉寂了许多。但我们都知道,市场的潮水退去,留下的才是真正在踏实准备、努力沉淀的人。学习的需求,从未消失,只是变得更加务实和深入。 正值春节,也是复盘与规划的好时机。结合ZEEKLOG这次「春节代码贺新年」活动所提倡的“用技术视角记录春节、复盘成长”,我决定在这个假期持续更新专栏,帮助年后参加春招的同学。 这个专栏的初衷很简单:拒绝过时的、流水线式的PDF引流贴,专注于收集和整理当下最新、最真实的前端面试资料。 我会在每一份面经和八股文的基础上,尝试从面试官的角度去拆解问题背后的逻辑,而不仅仅是提供一份静态的背诵答案。无论你是校招还是社招,目标是中大厂还是新兴团队,只要是真实发生、有价值的面试经历,我都会在这个专栏里为你沉淀下来。 温馨提示:市面上的面经鱼龙混杂,

无需编程!Fun-ASR WebUI界面手把手操作教程

无需编程!Fun-ASR WebUI界面手把手操作教程 你是不是也遇到过这些情况:会议录音堆在文件夹里没时间听,客户语音留言转文字总出错,培训音频想整理成笔记却要花半天?别再复制粘贴到网页版工具、别再折腾Python环境、更别担心“CUDA out of memory”报错——今天这篇教程,专为完全不写代码的人准备。 Fun-ASR WebUI 是钉钉联合通义实验室推出的语音识别系统,由开发者“科哥”深度优化并封装成开箱即用的图形界面。它不是命令行里的冰冷指令,也不是需要配置10个参数才能跑起来的实验项目,而是一个像微信一样点点就能用的本地语音转文字工具。全程不需要安装Python包、不用改配置文件、不用查GPU型号——只要你会打开浏览器,就能把一段30分钟的采访音频,5分钟内变成带标点、分段清晰、数字自动规整的可编辑文本。 下面我将带你从零开始,像教朋友一样,一步步操作每一个按钮、解释每一处设置、避开所有新手踩坑点。你不需要懂“VAD”是什么,也不用知道“ITN”怎么拼,只需要跟着做,就能立刻上手。 1. 启动与访问:两步打开你的语音助手