本文档介绍了一种参考架构,可用于使用本地版本或任何云版本的 ABAP SDK for Google Cloud 为 SAP 构建互动式 Google Chat 应用。借助交互式 Chat 应用,用户除了接收通知外,还可以直接在 Google Workspace 中对 SAP 工作流执行操作,例如批准或拒绝请求。
本文档的目标受众群体包括 ABAP 开发者、SAP 解决方案架构师和云架构师。本文档假定您熟悉 Google Workspace 中提供的Chat 应用。
架构
下图展示了为 SAP 实现 Interactive Chat 应用的参考架构:
此参考架构包括以下组件:
# | 组件 | 详细信息 |
---|---|---|
1 | SAP 流程或事务 | 需要向用户发送消息的任何 SAP 进程或事务。 这是通过 Google Chat 触发通信的起点。 |
2 | ABAP SDK for Google Cloud | 充当 SAP 系统和 Google Cloud 之间的桥梁,支持与 Google Chat API 进行安全的 HTTPS 通信。 |
3 | Google Chat 应用项目 | 您已启用 Google Chat API 并配置 Chat 应用的 Google Cloud 项目。 |
4 | Chat 聊天室 | Google Chat 中的专用聊天室,您的 SAP 系统可在此与用户进行通信。 Chat 应用位于此聊天室中,可通过 Google Chat API 提供来自 SAP 系统的实时信息流。 |
5 | Apps 脚本项目 | 您用于实现 Chat 应用逻辑以接收和处理消息的 Apps 脚本项目。 |
6 | Pub/Sub | Apps Script 项目会将用户操作(例如批准或拒绝)作为消息发布到 Pub/Sub 主题。 ABAP SDK for Google Cloud 使用 Pub/Sub 订阅从主题中拉取这些消息。这样,您的 SAP 系统便可处理这些操作,并触发对业务流程的任何必要更新。 |
使用的产品
此参考架构使用以下 Google 产品:
- ABAP SDK for Google Cloud:可帮助您开发 ABAP 应用,将 SAP 系统连接到 Google Cloud 服务(例如 Google Chat)。
Google Chat:帮助您创建互动式协作 Chat 应用,提升沟通效率和工作效率。
Apps 脚本:可让您与 Google 产品集成并自动执行跨 Google 产品的任务。
Pub/Sub:可让您在独立的应用之间发送和接收消息。
使用场景
借助交互式 Chat 应用,您可以对 SAP 工作流执行操作,例如批准或拒绝请求。下图展示了采购订单 (PO) 和销售订单 (SO) 审批工作流的互动式聊天模式:
以下列表展示了适用于 SAP 的交互式 Chat 应用的一些用例:
工作流事件管理:您可以与 Chat 应用互动来管理工作流。例如,如果有采购订单需要您关注,您可以通过 Chat 应用执行以下操作:
- 批准订单
- 拒绝订单
- 请求更多详细信息
系统提醒:您可以向系统管理员专用的 Chat 聊天室发送提醒,以便在达到各种系统阈值时提醒他们。例如,磁盘空间用量、长时间运行的操作、缓存锁定或许可证过期。
作业状态更新:您可以向一组正在等待这些作业完成并执行后处理操作的用户发送长时间运行的自定义作业的更新。
设计考虑事项
在根据您的应用场景设计 Chat 应用时,有几个因素可能会影响您的设计决策。本部分提供的指导可帮助您使用此参考架构开发满足特定安全性、隐私性、合规性和费用要求的架构。
Google Chat 应用配置
聊天应用名称:为 Chat 应用提供清晰且有意义的名称。为确保用户获得顺畅的体验,请确保 Chat 应用的名称准确反映其功能或其集成的服务。
时区:Chat 聊天室可供位于不同时区的成员共享。因此,请务必将 Chat 应用配置为在对聊天室所有用户都方便的时间传输消息。或者,对于重要提醒或通知,您可以将成员指定为与您共用时区的 Chat 聊天室,并构建逻辑来确定 Chat 应用可以向哪个聊天室发送消息。
安全性、隐私权和合规性
为了保持机密性,请务必在 Chat 室内严格控制敏感信息(例如客户详细联系信息、IBAN 或其他需要了解的数据)的共享。此外,在添加了 Chat 应用的 Chat 聊天室中添加新用户时,请务必制定明确的规定,以确保对此类活动进行适当管理。
您还可以考虑使用 Cloud Data Loss Prevention (DLP) API 来去敏化邮件内容。如需了解如何使用 DLP API 保护 SAP 中的敏感企业数据,请参阅使用 DLP API 在 SAP 中保护数据。
为保障安全,请确保 Google Workspace 管理员遵循 Google 推荐的最佳实践。
配额和限制
Google Chat API 是一项共享服务,因此适用配额和限制。如果您超出了配额,则会收到 429: Too many requests
HTTP 状态代码响应。如需详细了解配额和限制,请参阅使用限制。
Google Chat API 本身不收取任何使用费用,但 Google Chat 是一款 Google Workspace 产品。Google Workspace 是一套捆绑的高效办公工具,包含 Gmail、文档、表格、幻灯片、Google Chat 等应用。其定价结构是整体性的,这意味着您无法选择和购买各个组件。如需详细了解价格,请参阅 Google Workspace 价格。
连接设置选项
为了处理 Google Chat 中的互动,此参考架构使用 Apps Script 作为后端。托管在 Apps Script 项目中的代码必须使用 JavaScript 编写。
或者,您也可以使用 Cloud Run 函数或 App Engine 与 HTTP 端点搭配使用,构建交互式 Chat 应用。如需了解如何将 Cloud Run 函数用于 Google Chat,请参阅构建 HTTP Google Chat 应用。如需在 Cloud Run 函数中构建 Chat 应用逻辑,您可以使用 Cloud 库,并从多种语言(例如 Node.js、Java 或 Python)中进行选择。部署 Cloud Run 函数后,在 Chat 应用配置的连接设置下,选择 HTTP 端点网址,然后为 Cloud Run 函数触发器提供网址。
准备工作
在根据此参考架构实现解决方案之前,请确保您已完成以下前提条件:
您拥有商务版或企业版 Google Workspace 账号,并且有权使用 Google Chat。
您拥有一个 Google Cloud 账号和项目。每个 Chat 应用都需要有自己的 Google Cloud 项目。也就是说,您只能在一个 Google Cloud 项目中配置一个 Chat 应用。
您已为项目启用结算功能。如需了解如何确认您的项目是否已启用结算功能,请参阅验证项目的结算状态。
您的 Google Cloud 项目中已启用 Google Chat API。
设置 Apps 脚本项目
如需接收和处理消息,您需要在 Apps 脚本项目中实现 Chat 应用逻辑。Apps 脚本提供后端逻辑和自动化功能。借助它,您可以编写代码来处理事件,例如提取用户消息、处理按钮点击和触发下游操作。
如需设置 Apps 脚本项目,请执行以下步骤:
- 前往 Apps 脚本。
创建一个脚本来处理 Chat 应用逻辑,以接收和处理消息。如需了解如何创建脚本,请参阅 Google Apps 脚本快速入门。
例如,您需要编写 JavaScript 代码来处理各种函数类型。以下示例代码展示了如何处理
OnCardClicked
事件:function onCardClick(event) { console.info(event); let message = 'Button Clicked'; // Get the function name from parameter var functionToCall = event.action.parameters[0].value; // Get the action name from parameter var actionTaken = event.action.parameters[1].value; // Call the function dynamically if (this[functionToCall]) { this[functionToCall](actionTaken); } else { // Handle invalid function name console.log('Function not found:', functionToCall); } return { "text": message }; }
此示例代码会执行以下函数:
- 读取按钮点击:用于确定用户点击的按钮和用户的预期操作。
- 查找要运行的正确代码:它会使用按钮点击操作中的信息,在 Chat 应用中查找匹配的代码段。
- 运行代码:运行匹配的代码以执行用户请求的操作。
- 处理错误:如果找不到匹配的代码,则会显示错误消息。
将您的 Google Cloud 项目与 Apps 脚本项目相关联。 如需了解如何关联项目,请参阅关联 Google Cloud 项目。
为您的脚本创建一个部署。如需了解如何部署脚本,请参阅创建和管理部署。
记下部署 ID。如需了解如何查找部署 ID,请参阅查找部署 ID。
如需详细了解如何设置 Apps 脚本项目,请参阅 Google Apps 脚本 Chat 应用快速入门。
配置 Google Chat 应用
如需配置 Google Chat 应用,请执行以下步骤:
在 Google Cloud 控制台中,搜索“Google Chat API”,点击 Google Chat API,然后点击 Manage(管理)。
点击配置,然后设置 Google Chat 应用:
- 在应用名称中,输入
Quickstart SAP App
。 - 在头像网址中,输入
https://developers.google.com/chat/images/quickstart-app-avatar.png
。 - 在说明中,输入
Quickstart app for SAP
。
- 在应用名称中,输入
在连接设置下,选择 Apps 脚本。
输入您在设置 Apps Script 项目部分中创建的脚本的部署 ID。
点击保存。
为 Google Chat 应用设置身份验证
您可以通过以下两种方式对 Google Chat 应用进行身份验证:作为应用本身或作为用户。
当应用需要执行自动化任务(例如在无需用户直接互动的情况下发送系统通知)时,它会使用服务账号。如果您希望应用代表用户执行操作(例如以特定用户身份发送消息),则需要进行用户身份验证。这种双重身份验证方法可让您灵活控制应用与 Google Chat 的互动方式。
借助 ABAP SDK for Google Cloud,您可以设置这两种身份验证。如需了解如何为 Google Chat 应用设置身份验证,请参阅:
- 以 Google Chat 应用的身份进行身份验证:使用访问令牌进行身份验证或使用 JSON Web 令牌进行身份验证
- 以 Google Chat 用户身份进行身份验证和授权:使用 OAuth 2.0 客户端凭据向 Google Workspace API 进行身份验证
如需了解 Google Chat API 方法及其支持的授权范围,请参阅对 Chat 扩展应用和 Google Chat API 请求进行身份验证和授权。
本文档中介绍的参考架构将身份验证用作 Chat 应用,并使用访问令牌进行身份验证。
如需将 Chat 应用设置为身份验证服务,请执行以下步骤:
- 在 Google Cloud 控制台中,配置 OAuth 权限请求页面并选择范围。
- 在 Google Cloud 控制台中,创建服务账号。
- 可选:向服务账号分配 IAM 角色,以授予对 Google Cloud 项目资源的访问权限。如需了解详情,请参阅管理对服务账号的访问权限。
在 SAP 系统中,使用以下详细信息配置客户端密钥:
字段 说明 Google Cloud 密钥名称 为客户端密钥配置指定名称。 例如 ABAP_SDK_CHAT
。Google Cloud 服务账号名称 指定您已授予 Google Chat API 访问权限的服务账号的名称。例如
sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com
。Google Cloud 范围 指定 API 访问权限范围: https://www.googleapis.com/auth/chat.bot
。Google Cloud 项目标识符 指定包含已启用的 Google Chat API 的 Google Cloud 项目的 ID。 命令名称 将此字段留空。 授权类 酌情指定授权类:
- 对于使用访问令牌进行身份验证:
/GOOG/CL_AUTH_GOOGLE
- 如需使用 JWT 进行身份验证,请执行以下操作:
/GOOG/CL_AUTH_JWT
令牌缓存 此标志用于确定是否已缓存从 Google Cloud 检索到的访问令牌。
我们建议您完成与 Google Cloud 的连接的配置和测试后启用令牌缓存。如需详细了解令牌缓存,请参阅启用令牌缓存。
令牌刷新秒数 访问令牌在多久后(以秒为单位)会到期并且必须刷新。默认值为 3500
。授权参数 1 将此字段留空。 授权参数 2 将此字段留空。 - 对于使用访问令牌进行身份验证:
如需详细了解设置身份验证的步骤,请参阅使用访问令牌进行身份验证或使用 JSON Web 令牌进行身份验证。
将 Google Chat 应用添加到聊天室
- 打开 Google Chat 应用或 Gmail 应用。
- 将 Chat 应用添加到 Chat 聊天室。如需了解如何将应用添加到 Chat 聊天室,请参阅将应用添加到对话或聊天室。
针对用户操作设计交互式卡片
卡片是一种视觉上富有吸引力且富有互动性的信息呈现方式,可提升整体用户体验。这些卡片可以包含标题、图片、按钮等元素,让用户能够直接在 Chat 界面中与内容互动。例如,采购订单工作流卡片可能包含以下信息:
- 采购订单编号
- 文档日期
- 文档类型
- 供应方
- 配送方式
- 用于在 SAP Fiori 应用中打开采购订单显示屏的链接,以及用于批准采购订单的按钮
如需使用 ABAP SDK for Google Cloud 设计交互式卡片,请使用 GitHub 代码库中的自定义界面 ZGOOG_IF_CHAT_CARDS_V2
。此自定义接口包含创建卡片所需的 ABAP 类型。您可以构建卡片,例如以下订单工作流程示例卡片:
如需详细了解如何设计卡片消息,请参阅为 Google Chat 应用构建卡片。
如需使用 ABAP SDK for Google Cloud 将消息从 SAP 系统发送到 Chat 聊天室,您可以使用 /GOOG/CL_CHAT_V1
类的 CREATE_MESSAGES
方法。
以下代码示例演示了如何将卡片消息从 SAP 系统发送到 Chat 聊天室:
REPORT zsend_interactive_card
DATA lv_client_key TYPE /goog/keyname.
DATA ls_input TYPE /goog/cl_chat_v1=>ty_072.
DATA lv_space_id TYPE string.
DATA ls_widget TYPE zgoog_if_chat_cards_v2=>ty_widget.
DATA ls_section TYPE zgoog_if_chat_cards_v2=>ty_sections.
DATA ls_card_v2 TYPE zgoog_if_chat_cards_v2=>ty_cards_v2.
DATA ls_card TYPE /goog/cl_chat_v1=>ty_012.
DATA ls_rb TYPE zgoog_if_chat_cards_v2=>ty_selection_item.
DATA ls_button TYPE zgoog_if_chat_cards_v2=>ty_button.
DATA ls_param TYPE zgoog_if_chat_cards_v2=>ty_action_parameters.
lv_client_key = 'CLIENT_KEY'.
lv_space_id = 'SPACE_ID'.
TRY.
DATA(lo_chat) = NEW /goog/cl_chat_v1( iv_key_name = lv_client_key ).
CATCH /goog/cx_sdk INTO DATA(lo_excp).
" Handle exception here
ENDTRY.
"Building the Cards Structure
ls_card_v2-header-title = 'Purchase Order Workflow - Level 2 Approval Alert!'.
ls_card_v2-header-subtitle = 'PO Number: 8700000034'.
ls_card_v2-header-image_url = 'https://developers.google.com/chat/images/quickstart-app-avatar.png'.
ls_section-header = 'Purchase Order Details'.
ls_widget-decorated_text-icon-known_icon = 'INVITE'.
ls_widget-decorated_text-text = 'Document Date: 2024-10-23'.
APPEND ls_widget TO ls_section-widgets.
CLEAR ls_widget.
ls_widget-decorated_text-icon-material_icon-name = 'category'.
ls_widget-decorated_text-text = 'Document Type: Standard PO'.
APPEND ls_widget TO ls_section-widgets.
CLEAR ls_widget.
ls_widget-decorated_text-icon-material_icon-name = 'conveyor_belt'.
ls_widget-decorated_text-text = 'Supplier: 5300000061 - Cymbal Industries'.
APPEND ls_widget TO ls_section-widgets.
CLEAR ls_widget.
ls_widget-decorated_text-icon-known_icon = 'TRAIN'.
ls_widget-decorated_text-text = 'Shipping Type: RAIL'.
APPEND ls_widget TO ls_section-widgets.
CLEAR ls_widget.
ls_button-text = 'Display Purchase Order'.
ls_button-color-alpha = '1'.
ls_button-color-blue = '1'.
ls_button-color-green = '0'.
ls_button-color-red = '0'.
ls_button-on_click-open_link-url = "Add url for fiori App
APPEND ls_button TO ls_widget-button_list-buttons.
CLEAR ls_button.
ls_button-text = 'Approve Purchase Order'.
ls_button-color-alpha = '1'.
ls_button-color-blue = '0.2'.
ls_button-color-green = '0.4'.
ls_button-color-red = '0'.
ls_button-on_click-action-function = 'onCardClick'.
ls_param-key = 'functionToCall'.
ls_param-value = 'sendToPubSub'. "Function name on Apps Script
APPEND ls_param TO ls_button-on_click-action-parameters.
CLEAR ls_param.
ls_param-key = 'action'.
ls_param-value = 'approved'. "Indicate approval action has taken place
APPEND ls_param TO ls_button-on_click-action-parameters.
CLEAR ls_param.
APPEND ls_button TO ls_widget-button_list-buttons.
CLEAR ls_button.
ls_button-text = 'Reject Purchase Order'.
ls_button-color-alpha = '1'.
ls_button-color-blue = '0'.
ls_button-color-green = '0'.
ls_button-color-red = '0.7'.
ls_button-on_click-action-function = 'onCardClick'.
ls_param-key = 'functionToCall'.
ls_param-value = 'sendToPubSub'. "Function name on Apps Script
APPEND ls_param TO ls_button-on_click-action-parameters.
CLEAR ls_param.
ls_param-key = 'action'.
ls_param-value = 'rejected'. "Indicate reject action has taken place
APPEND ls_param TO ls_button-on_click-action-parameters.
CLEAR ls_param.
APPEND ls_button TO ls_widget-button_list-buttons.
CLEAR ls_button.
APPEND ls_widget TO ls_section-widgets.
APPEND ls_section TO ls_card_v2-sections.
ls_card-card = REF #( ls_card_v2 ).
APPEND ls_card TO ls_input-cards_v2.
TRY.
mo_chat_client->create_messages( EXPORTING iv_p_spaces_id = CONV #( p_spc_id )
is_input = ls_input
IMPORTING es_output = DATA(ls_output)
ev_ret_code = DATA(lv_ret_code)
ev_err_text = DATA(lv_err_text)
es_err_resp = DATA(ls_err_resp) ).
CATCH /goog/cx_sdk INTO mo_excp.
"Handle exception here
ENDTRY.
IF mo_chat_client->is_error( lv_ret_code ).
"Handle error here
ELSE.
"Handle success here
ENDIF.
替换以下内容:
CLIENT_KEY
:为身份验证而配置的客户端密钥。SPACE_ID
:Chat 聊天室的唯一标识符 ID。 如需查找 Chat 聊天室 ID,请在网络浏览器中打开 Google Chat 聊天室。您可以在网址中找到该 ID,如以下屏幕截图所示:
设计替代方案
对于托管在 Google Cloud 上的 SAP S/4 HANA 或 ECC 系统,您可以考虑使用以下备选参考架构来设计交互式 Chat 应用:
此参考架构基于以下注意事项:
- 负责向用户发送消息的原始 SAP 进程或事务。
- ABAP SDK for Google Cloud 通过调用 Google Chat API 方法
spaces.messages.create
发送消息。 - Google Chat API 会将消息发送到相应的 Chat 聊天室。
- 用户在聊天室中收到通知,然后做出回应以执行操作,例如点击按钮。
- 用户操作会调用 Apps 脚本项目来处理相应事件。
- Apps 脚本项目会调用 Pub/Sub API 来发布消息。
- Cloud Run 函数使用 Eventarc 触发器处理消息并发布事件。
- Cloud Run 函数通过无服务器 VPC 连接器调用 SICF 节点。
- SAP 系统会处理事件,并根据定义的业务逻辑触发下游操作。
此参考架构需要在三个层中实现逻辑:
- 用于创建聊天消息、处理事件和后续业务流程的 ABAP 层。
- Apps Script 层,用于处理 Chat 聊天室中的事件并将消息发布到 Pub/Sub 主题。
- 用于接收 Pub/Sub 订阅消息的 Cloud Run 函数。(可选)您可以设置消息格式,并通过 VPC 连接器调用在 SAP 系统上托管的 SICF 服务。
后续步骤
如需尽可能轻松地部署本指南中介绍的示例解决方案,请使用 GitHub 上提供的代码示例。
如需详细了解如何调试和排查 Chat 应用错误,请参阅问题排查概览。
如需了解 Google Workspace 产品,请参阅考虑购买 Google Workspace 时的常见问题。
如果您在解决 ABAP SDK for Google Cloud 问题时需要帮助,请执行以下操作:
- 请参阅 ABAP SDK for Google Cloud 问题排查指南。
- 在 Cloud 论坛上提出问题并与社区讨论 ABAP SDK for Google Cloud。
- 收集所有可用的诊断信息,并与 Cloud Customer Care 联系。如需了解如何与 Customer Care 团队联系,请参阅获取 Google Cloud 上的 SAP 支持。
贡献者
作者: Satish Inamdar | SAP 应用工程师
其他贡献者: Vikash Kumar | 技术文档撰写者