适用于 SAP 的 Google Chat 应用

本文档介绍了一种参考架构,用于使用本地版本或任何云版本的 ABAP SDK for Google Cloud 为 SAP 构建 Google Chat 应用。借助 Chat 应用,您可以将 SAP 流程和工作流引入 Google Chat,让用户能够在 Google Workspace 中接收警报报告、工作流提醒、系统提醒和作业完成更新等通知。

本文档的目标受众群体包括 ABAP 开发者、SAP 解决方案架构师和云架构师。本文档假定您熟悉 Google Workspace 中提供的Chat 应用

架构

下图展示了为 SAP 实现单向 Chat 应用的参考架构,该应用可以从 SAP ERP 系统向 Chat 聊天室发送消息:

适用于 SAP 的 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 系统的实时信息流。

使用的产品

此参考架构使用以下 Google 产品:

  • ABAP SDK for Google Cloud:可帮助您开发 ABAP 应用,将 SAP 系统连接到 Google Cloud 服务(例如 Google Chat)。
  • Google Chat:帮助您创建互动式协作 Chat 应用,提升沟通效率和工作效率。

使用场景

单向 Chat 应用无法互动,您可以向 Chat 聊天室用户发送消息,但用户无法回复 Chat 应用。下图展示了单向 Chat 应用的聊天模式:

Chat 应用模式

以下列表展示了 Google Chat for SAP 的一些用例:

  • 工作流事件通知:您可以向 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 价格

设计替代方案

虽然本文档重点介绍的是本地版本或任何云版本的 ABAP SDK for Google Cloud,但您也可以使用 SAP BTP 版本的 ABAP SDK for Google Cloud 实现类似的结果。您可以调整所提供的资源,以便在 SAP BTP 环境中构建类似的解决方案。

准备工作

在根据此参考架构实现解决方案之前,请确保您已完成以下前提条件:

配置 Google Chat 应用

  1. 搜索“Google Chat API”,然后点击 Google Chat API,接着点击管理

    前往 Chat API

  2. 点击配置,然后设置 Google Chat 应用:

    1. 应用名称中,输入 Quickstart SAP App
    2. 头像网址中,输入 https://developers.google.com/chat/images/quickstart-app-avatar.png
    3. 说明中,输入 Quickstart app for SAP
  3. 停用互动功能。

  4. 点击保存

为 Google Chat 应用设置身份验证

您可以通过以下两种方式对 Google Chat 应用进行身份验证:作为应用本身或作为用户。

当应用需要执行自动化任务(例如在无需用户直接互动的情况下发送系统通知)时,它会使用服务账号。如果您希望应用代表用户执行操作(例如,以特定用户身份发送消息),则需要进行用户身份验证。这种双重身份验证方法可让您灵活控制应用与 Google Chat 的互动方式。

借助 ABAP SDK for Google Cloud,您可以设置这两种身份验证。如需了解如何为 Google Chat 应用设置身份验证,请参阅:

如需了解 Google Chat API 方法及其支持的授权范围,请参阅对 Chat 扩展应用和 Google Chat API 请求进行身份验证和授权

本文档中介绍的参考架构将身份验证用作 Chat 应用,并使用访问令牌进行身份验证。

如需将 Chat 应用设置为身份验证服务,请执行以下步骤:

  1. 在 Google Cloud 控制台中,配置 OAuth 权限请求页面并选择范围
  2. 在 Google Cloud 控制台中,创建服务账号
  3. 可选:为您的服务账号分配角色,以授予对 Google Cloud 项目资源的访问权限。如需了解详情,请参阅管理对服务账号的访问权限
  4. 在 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 应用添加到聊天室

  1. 打开 Google Chat 应用或 Gmail 应用。
  2. 将 Chat 应用添加到 Chat 聊天室。如需了解具体步骤,请参阅将应用添加到对话或聊天室中

从 ABAP 环境发送消息

Google Chat 和 Chat 应用使用基于 JSON 的消息格式,每条消息都包含用户 ID、样式和内容等详细信息。Chat 应用可以发送以下类型的消息:

  • 短信:短信包含纯文本内容,文本格式有限。
  • 卡片消息:卡片消息用于定义要在聊天室中显示的卡片的格式、内容和行为。例如,卡片消息可以包含一个带有链接的按钮,该链接会打开一个对话框以从用户收集信息。

如需详细了解 Google Chat 消息,请参阅 Google Chat 消息概览

如需使用 ABAP SDK for Google Cloud 将消息从 SAP 系统发送到 Chat 聊天室,您可以使用 /GOOG/CL_CHAT_V1 类的 CREATE_MESSAGES 方法。

发送短信

以下代码示例展示了如何将文本消息从 SAP 系统发送到 Chat 聊天室:

REPORT zsend_text_message.

DATA lv_client_key TYPE /goog/keyname.
DATA ls_input      TYPE /goog/cl_chat_v1=>ty_072.
DATA lv_space_id   TYPE string.

lv_client_key = 'CLIENT_KEY'.
ls_input-text = 'TEXT_MESSAGE'.
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.

TRY.
    lo_chat->create_messages( EXPORTING iv_p_spaces_id = lv_space_id
                                        is_input       = ls_input
                              IMPORTING ev_ret_code    = DATA(return_code)
                                        ev_err_text    = DATA(error_text)
                                        es_err_resp    = DATA(err_resp) ).
  CATCH /goog/cx_sdk INTO lo_excp.
    " Handle exception here
ENDTRY.

IF /goog/cl_chat_v1=>is_success( iv_code = return_code ) = abap_true.
  " Handle success here
ELSE.
  " Handle error here
ENDIF.

替换以下内容:

  • CLIENT_KEY:为身份验证而配置的客户端密钥。
  • TEXT_MESSAGE:要发送到 Chat 聊天室的文本消息。
  • SPACE_ID:Chat 聊天室的唯一标识符 ID。 如需查找 Chat 聊天室 ID,请在网络浏览器中打开 Google Chat 聊天室。您可以在网址中找到该 ID,如以下屏幕截图所示:

    Chat 扩展应用聊天室 ID

发送贺卡消息

卡片是一种视觉上富有吸引力且富有互动性的信息呈现方式,可提升整体用户体验。这些内容可以包含标题、图片、按钮等元素,让用户能够直接在聊天界面中与内容互动。例如,采购订单工作流卡片可能包含以下信息:

  • 采购订单编号
  • 文档日期
  • 文档类型
  • 供应方
  • 配送方式

如需使用 ABAP SDK for Google Cloud 开发卡片,请使用 GitHub 代码库中的自定义接口 ZGOOG_IF_CHAT_CARDS_V2。此自定义接口包含创建卡片所需的 ABAP 类型。您可以构建卡片,例如以下订单工作流程示例卡片:

Chat 扩展应用聊天室 ID

如需详细了解如何设计卡片消息,请参阅为 Google Chat 应用构建卡片

以下代码示例演示了如何将卡片消息从 SAP 系统发送到 Chat 聊天室:

REPORT zsend_card_message.

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 Card Structure

" Set the header
ls_card_v2-header = VALUE zgoog_if_chat_cards_v2=>ty_header(
                              title     = 'Purchase Order Workflow - Level 2 Approval Alert!'
                              subtitle  = 'PO Number: 8700000034'
                              image_url = 'https://developers.google.com/chat/images/quickstart-app-avatar.png' ).

" Create sections
ls_section-header = 'Purchase Order Details'.

ls_widget-decorated_text = VALUE zgoog_if_chat_cards_v2=>ty_decorated_text(
                                     icon = VALUE zgoog_if_chat_cards_v2=>ty_icon( known_icon = 'INVITE' )
                                     text = 'Document Date: 2024-10-23' ).
ls_section-widgets = VALUE #( ( ls_widget ) ).
CLEAR ls_widget.

ls_widget-decorated_text = VALUE zgoog_if_chat_cards_v2=>ty_decorated_text(
    icon = VALUE zgoog_if_chat_cards_v2=>ty_icon(
                     material_icon = VALUE zgoog_if_chat_cards_v2=>ty_material_icon( name = 'category' ) )
    text = 'Document Type: Standard PO'  ).

ls_section-widgets = VALUE #( BASE ls_section-widgets
                              ( ls_widget ) ).
CLEAR ls_widget.

ls_widget-decorated_text = VALUE zgoog_if_chat_cards_v2=>ty_decorated_text(
    icon = VALUE zgoog_if_chat_cards_v2=>ty_icon(
                     material_icon = VALUE zgoog_if_chat_cards_v2=>ty_material_icon( name = 'conveyor_belt' ) )
    text = 'Supplier: 5300000061 - Cymbal Industries'  ).

ls_section-widgets = VALUE #( BASE ls_section-widgets
                              ( ls_widget ) ).
CLEAR ls_widget.

ls_widget-decorated_text = VALUE zgoog_if_chat_cards_v2=>ty_decorated_text(
                                     icon = VALUE zgoog_if_chat_cards_v2=>ty_icon( known_icon = 'TRAIN' )
                                     text = 'Shipping Type: RAIL' ).
ls_section-widgets = VALUE #( BASE ls_section-widgets
                              ( ls_widget ) ).
CLEAR ls_widget.

ls_widget-decorated_text = VALUE zgoog_if_chat_cards_v2=>ty_decorated_text( text = 'Approved By: User-Name' ).
ls_section-widgets = VALUE #( BASE ls_section-widgets
                              ( ls_widget ) ).
CLEAR ls_widget.

ls_section-widgets = VALUE #( BASE ls_section-widgets
                              ( ls_widget ) ).

ls_card_v2-sections = VALUE #( ( ls_section ) ).

ls_card-card = REF #( ls_card_v2 ).
ls_input-cards_v2 = VALUE #( (  ls_card ) ).

TRY.
    lo_chat->create_messages( EXPORTING iv_p_spaces_id = lv_space_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 lo_excp.
    " Handle exception here
ENDTRY.

IF lo_chat->is_error( lv_ret_code ).
  " Handle error here
ELSE.
  " Handle success here
ENDIF.

替换以下内容:

  • CLIENT_KEY:为身份验证而配置的客户端密钥。
  • SPACE_ID:Chat 聊天室的唯一标识符 ID。 如需查找 Chat 聊天室 ID,请在网络浏览器中打开 Google Chat 聊天室。您可以在网址中找到该 ID,如以下屏幕截图所示:

    Chat 扩展应用聊天室 ID

后续步骤

贡献者

作者: Satish Inamdar | SAP 应用工程师

其他贡献者: Vikash Kumar | 技术文档撰写者