本文說明參考架構,說明如何使用 Google Cloud 適用的 ABAP SDK 的內部部署或任何雲端版本,為 SAP 建構 Google Chat 應用程式。您可以透過 Chat 應用程式,將 SAP 程序和工作流程導入 Google Chat,讓使用者在 Google Workspace 中接收警報回報、工作流程快訊、系統快訊和工作完成更新等通知。
本文件的目標對象包括 ABAP 開發人員、SAP 解決方案架構師和雲端架構師。本文假設您熟悉 Google Workspace 提供的即時通訊應用程式。
架構
下圖顯示 SAP 單向 Chat 應用程式的參考架構,可從 SAP ERP 系統傳送訊息至 Chat 聊天室:
這個參考架構包含下列元件:
# | 元件 | 詳細資料 |
---|---|---|
1 | SAP 程序或交易 | 任何需要傳送使用者通知的 SAP 程序或交易。這是透過 Google Chat 觸發通訊的起點。 |
2 | ABAP SDK for Google Cloud | 可做為 SAP 系統和 Google Cloud之間的橋樑,讓您透過 Google Chat API 進行安全的 HTTPS 通訊。 |
3 | Google Chat 應用程式專案 | Google Cloud 您已啟用 Google Chat API 並設定 Chat 應用程式的專案。 |
4 | Chat 聊天室 | Google Chat 中的專屬聊天室,可讓 SAP 系統與使用者進行通訊。 Chat 應用程式會位於這個空間,透過 Google Chat API 提供來自 SAP 系統的即時資訊串流。 |
使用的產品
這個參考架構使用下列 Google 產品:
- ABAP SDK for Google Cloud:協助您開發 ABAP 應用程式,將 SAP 系統連結至 Google 聊天等 Google Cloud 服務。
- Google Chat:協助您建立互動式 Chat 應用程式,提升溝通和工作效率。
用途
單向 Chat 應用程式不具互動性,可讓您傳送訊息給 Chat 聊天室使用者,但使用者無法回覆 Chat 應用程式。下圖說明單向即時通訊應用程式的即時通訊模式:
以下列出 Google Chat for SAP 的幾種用途:
工作流程事件通知:您可以針對工作流程程序中的不同步驟,向 Chat 應用程式傳送訊息,以便通知 Chat 聊天室中的特定使用者。例如,使用者核准或拒絕採購單。
系統快訊:您可以將快訊傳送至系統管理員的 Chat 空間,提醒他們系統達到各種系統門檻。例如磁碟空間使用量、長時間執行作業、快取鎖定或授權到期。
工作狀態更新:您可以將長時間執行的自訂工作更新內容傳送給一組使用者,讓他們等待這些工作完成,並執行後續處理作業。
設計須知
當您為用途設計 Chat 應用程式時,有幾個因素可能會影響設計決策。本節提供指引,協助您使用這個參考架構開發架構,以滿足安全性、隱私權、法規遵循和成本方面的特定需求。
Google Chat 應用程式設定
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 的內部部署或任何雲端版本,但您也可以使用 ABAP SDK for Google Cloud 的 SAP BTP 版本,獲得類似的結果。您可以調整提供的資源,在 SAP BTP 環境中建立類似的解決方案。
事前準備
在根據這個參考架構導入解決方案之前,請確認您已完成下列先決條件:
您擁有可存取 Google Chat 的 Google Workspace Business 或 Enterprise 帳戶。
您擁有 Google Cloud 帳戶和專案。每個 Chat 應用程式都需要專屬的 Google Cloud 專案。也就是說,您只能在一個 Google Cloud 專案中設定單一 Chat 應用程式。
專案已啟用計費功能。如要瞭解如何確認專案已啟用計費功能,請參閱「驗證專案的帳單狀態」。
Google Cloud 專案已啟用 Google Chat API。
設定 Google Chat 應用程式
在 Google Cloud 控制台搜尋「Google Chat API」,然後依序點選「Google Chat API」和「管理」。
按一下「設定」,然後設定 Google Chat 應用程式:
- 在「應用程式名稱」中輸入
Quickstart SAP App
。 - 在「顯示圖片網址」中輸入
https://developers.google.com/chat/images/quickstart-app-avatar.png
。 - 在「Description」中輸入
Quickstart app for SAP
。
- 在「應用程式名稱」中輸入
停用互動功能。
按一下 [儲存]。
設定 Google Chat 應用程式的驗證機制
您可以透過兩種方式驗證 Google Chat 應用程式:以應用程式本身或使用者身分。
如果應用程式需要執行自動化工作 (例如在沒有使用者直接互動情況下傳送系統通知),就會使用服務帳戶。如果您希望應用程式可代表使用者執行操作,例如以特定使用者身分傳送訊息,就必須進行使用者驗證。這種雙重驗證方法可讓您彈性控管應用程式與 Google Chat 的互動方式。
您可以使用 Google Cloud 適用的 ABAP SDK 設定這兩種驗證機制。如要瞭解如何設定 Google Chat 應用程式的驗證機制,請參閱:
- 以 Google Chat 應用程式身分進行驗證:使用存取權杖進行驗證或使用 JSON Web Token 進行驗證
- 以 Google Chat 使用者身分驗證及授權:使用 OAuth 2.0 用戶端憑證驗證 Google Workspace API
如要瞭解 Google Chat API 方法及其支援的授權範圍,請參閱「驗證及授權 Chat 擴充應用程式和 Google Chat API 要求」。
本文件說明的參考架構會將驗證做為 Chat 應用程式使用,並使用存取權杖進行驗證。
如要將驗證方法設為 Chat 應用程式,請執行下列步驟:
- 在 Google Cloud 控制台中設定 OAuth 同意畫面並選擇範圍。
- 在 Google Cloud 控制台中建立服務帳戶。
- 選用:將角色指派給服務帳戶,授予對 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 專案 ID 指定 Google Cloud 專案 ID,該專案包含已啟用的 Google Chat API。 指令名稱 請將這個欄位留空。 授權類別 視情況指定授權類別:
- 如要使用存取權杖進行驗證:
/GOOG/CL_AUTH_GOOGLE
- 使用 JWT 進行驗證:
/GOOG/CL_AUTH_JWT
權杖快取 此標記可決定是否要將從 Google Cloud 擷取的存取權權杖儲存至快取。
建議您在完成設定並測試與 Google Cloud的連線後,啟用權杖快取功能。如要進一步瞭解權杖快取,請參閱「啟用權杖快取」。
權杖重新整理秒數 存取權權杖到期並必須重新整理前的時間長度 (以秒為單位)。預設值為 3500
。授權參數 1 請將這個欄位留空。 授權參數 2 請將這個欄位留空。 - 如要使用存取權杖進行驗證:
如要瞭解設定驗證作業的詳細步驟,請參閱「使用存取權憑證進行驗證」或「使用 JSON Web Token 進行驗證」。
將 Google Chat 應用程式加入聊天室
- 開啟 Google Chat 或 Gmail 應用程式。
- 將 Chat 應用程式新增至 Chat 聊天室。如要瞭解如何執行這項操作,請參閱「將應用程式加入對話或聊天室」。
透過 ABAP 環境傳送訊息
Google 即時通訊和即時通訊應用程式使用以 JSON 為基礎的訊息格式,每則訊息都包含使用者 ID、樣式和內容等詳細資料。即時通訊應用程式可以傳送下列類型的訊息:
- 簡訊:簡訊包含純文字內容,用於傳達基本資訊。
- 資訊卡訊息:資訊卡訊息可定義在聊天室中顯示的資訊卡格式、內容和行為。舉例來說,資訊卡訊息可以包含含有連結的按鈕,開啟對話方塊以便向使用者收集資訊。
如要進一步瞭解 Google Chat 訊息,請參閱「Google Chat 訊息總覽」。
如要使用 Google Cloud 的 ABAP SDK 將訊息從 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,如以下螢幕截圖所示:
傳送卡片訊息
資訊卡可提供視覺效果出色且具互動性的資訊呈現方式,進而改善整體使用者體驗。這些訊息可包含標題、圖片、按鈕等元素,讓使用者直接在即時通訊介面中與內容互動。舉例來說,採購單工作流程資訊卡可能會包含以下資訊:
- 訂購單編號
- 文件日期
- 文件類型
- 供應商
- 運送類型
如要使用 ABAP SDK for Google Cloud 開發資訊卡,請使用 GitHub 存放區中的自訂介面 ZGOOG_IF_CHAT_CARDS_V2
。這個自訂介面包含建立資訊卡所需的 ABAP 類型。您可以建立資訊卡,例如下列訂單工作流程範例資訊卡:
如要進一步瞭解如何設計資訊卡訊息,請參閱「為 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,如以下螢幕截圖所示:
後續步驟
如要以最少的付出部署本指南中說明的範例解決方案,請使用 GitHub 提供的程式碼範例。
如要瞭解 Google Workspace 產品,請參閱「選購 Google Workspace 時的常見問題」。
除了將 SAP 通知傳送至 Google Chat,如果您需要透過 Google Chat 與 SAP 工作流程互動,請參閱參考架構「透過 Google Chat 與 SAP 工作流程互動」。
如需協助解決 ABAP SDK for Google Cloud 的問題,請按照下列步驟操作:
- 請參閱 ABAP SDK for Google Cloud 疑難排解指南。
- 在 Cloud 論壇上向社群提問,並討論 ABAP 適用的 Google Cloud SDK。
- 收集所有可用的診斷資訊,然後聯絡 Cloud 客戶服務團隊。如要瞭解如何與 Customer Care 聯絡,請參閱「取得 SAP 支援 Google Cloud」一文。
貢獻者
作者:Satish Inamdar | SAP 應用程式工程師
其他協作者: Vikash Kumar | 技術撰稿人