跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言SaaSAI

SAP 对接钉钉 Webhook 实现方案及证书问题排查

SAP 系统通过 Webhook 接口对接钉钉 AI 表格,实现消息推送与数据记录。档涵盖钉钉侧自动化流程配置、SAP ABAP 接口开发细节,以及解决 HTTPS 证书校验失败的 ESB 中间件代理方案。重点解析了无需 Token 验证的机制及网络层安全证书问题的排查思路。

HadoopMan发布于 2026/4/10更新于 2026/7/1040 浏览
SAP 对接钉钉 Webhook 实现方案及证书问题排查

SAP 对接钉钉 Webhook 实现方案及证书问题排查

前言

近期公司全面启用钉钉,业务需求是将 SAP 系统的消息推送到钉钉,支持推送给特定人员或群聊。本文分享具体的实现路径:利用钉钉 AI 表格的自动化流程作为接收端,通过 SAP ABAP 接口发送数据。

钉钉消息效果示例

一、钉钉配置

本次方案采用钉钉 AI 表格的自动化功能中的 Webhook 接口。相比传统的机器人 API,这种方式在参数传递和后续处理上更为灵活。

1. AI 表格创建

若未看到 AI 表格选项,请确认钉钉版本是否已更新。创建一个空白模板表格,设置好字段结构。该表格将作为 SAP 数据的存储后端,类似于日志表的功能。

AI 表格字段设置

2. 自动化流程设置

在表格编辑界面找到'自动化'入口,配置触发条件为'收到 Webhook 请求'。

自动化流程配置

配置完成后,系统会生成一个唯一的 Webhook 地址。SAP 调用该地址即可触发后续操作,如发送消息、添加待办等。

3. Webhook 接口参数

Webhook 本质是一个 API 接口,需定义传输的数据结构。建议将文本字段封装为结构体,便于解析。

参数结构定义

参考官方文档进行详细配置:钉钉开发者文档

二、SAP 开发

接入逻辑与其他 RESTful 接口类似,建议在 SAP 中封装标准函数模块,便于复用。

1. 接口开发

核心在于 HTTP 客户端的构建与 JSON 序列化。以下是完整的 ABAP 代码示例,包含请求头设置、异常处理及响应解析。

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.

2. 接口测试

开发完成后,使用测试数据调用接口。注意生产环境请勿频繁发送无效数据。

接口测试截图

三、经验总结

  1. Token 验证:直接调用 Webhook 接口通常无需获取 Access Token,联调失败时不必优先排查认证环节。
  2. 请求头设置:默认只需 POST 方法和 application/json 类型。若自定义 Header,务必确保格式正确。
  3. 工具差异:Postman 测试成功但 SAP 内部调用失败的情况较为常见,通常指向网络层或证书校验问题。

四、BUG 解决:HTTPS 证书校验失败

在排查过程中发现,虽然 Postman 能通,但 SAP 系统调用时报错,且无法获取 R3 根证书。经分析,这是 SSL 证书信任链问题。

报错信息

由于无法在 SAP 侧直接安装受信任的根证书,最终采用中间件代理方案解决。通过企业服务总线(ESB)转发请求,SAP 先与 ESB 建立安全连接,再由 ESB 转发至钉钉,从而绕过证书校验限制。

架构对比图

此方案下,SAP 与 ESB 互通,ESB 与钉钉互通,实现了数据的安全流转。

钉钉后台记录

至此,数据已成功从 SAP 到达钉钉系统。后续可利用钉钉 AI 表格的自动化能力,实现存表、群通知、待办提醒等功能。

目录

  1. SAP 对接钉钉 Webhook 实现方案及证书问题排查
  2. 前言
  3. 一、钉钉配置
  4. 1. AI 表格创建
  5. 2. 自动化流程设置
  6. 3. Webhook 接口参数
  7. 二、SAP 开发
  8. 1. 接口开发
  9. 2. 接口测试
  10. 三、经验总结
  11. 四、BUG 解决:HTTPS 证书校验失败
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 后量子密码算法(PQC):NIST 标准、核心算法与落地趋势
  • 字节跳动开源 Seed-OSS-36B:512K 上下文推理新突破
  • 人工智能应用技术核心内容与学习路径
  • Spring Boot 调用 WebService 的两种实现方式:动态与静态调用
  • Mac 前端开发环境配置指南
  • Qwen3-Embedding-4B 基于 llama.cpp 的集成部署教程
  • Docker Compose UI: 无需命令行管理容器及远程访问配置指南
  • VR 音游音符轨道系统开发实录与原理解析
  • 基于 Trae IDE 与 MCP Server 实现 Figma 设计稿转前端代码
  • Stable-Diffusion-3.5 运行慢?FP8 量化 GPU 优化实战方案
  • AI 产品经理入门指南与进阶路线图
  • Hadoop 安装与使用指南:Ubuntu Kylin 环境下的单机及伪分布式部署
  • Ubuntu 22.04 桌面版安装与 LVM 配置
  • cv_resnet50_face-reconstruction 嵌入 Deepfake 检测预处理环节
  • C++ 设计模式在面向对象开发中的应用
  • AI Agent 自动化工作流系统架构与实现
  • Spring Boot 集成 Eclipse Mosquitto MQTT 实战
  • 银发族的 AI 助手:AIGC 如何陪伴父母防骗解闷
  • 大模型时代人工智能核心技术书籍精选
  • 哈希表经典算法题整理

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online