本文說明參考架構,說明如何使用 Google Cloud 適用的 ABAP SDK 地端部署或任何雲端版本,為 SAP 建構互動式 Google 聊天應用程式。使用者除了可透過互動式 Chat 應用程式接收通知,還可直接在 Google Workspace 中採取 SAP 工作流程的動作,例如核准或拒絕要求。
本文件的目標對象包括 ABAP 開發人員、SAP 解決方案架構師和雲端架構師。本文假設您熟悉 Google Workspace 提供的即時通訊應用程式。
架構
下圖顯示 SAP 互動式 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 系統的即時資訊串流。 |
5 | Apps Script 專案 | 您實作 Chat 應用程式邏輯以接收及處理訊息的 Apps Script 專案。 |
6 | Pub/Sub | Apps Script 專案會將使用者動作 (例如核准或拒絕) 做為訊息發布至 Pub/Sub 主題。 Google Cloud 專用的 ABAP SDK 會使用 Pub/Sub 訂閱項目,從主題中提取這些訊息。這樣一來,SAP 系統就能處理這些動作,並觸發業務流程的必要更新。 |
使用的產品
這個參考架構使用下列 Google 產品:
- ABAP SDK for Google Cloud:協助您開發 ABAP 應用程式,將 SAP 系統連結至 Google 聊天等 Google Cloud 服務。
Google Chat:協助您建立互動式 Chat 應用程式,提升溝通和工作效率。
Apps Script:可讓您整合 Google 產品中的各項工作,並將工作自動化。
Pub/Sub:可讓您在不同應用程式之間收發訊息。
用途
互動式 Chat 應用程式可讓您針對 SAP 工作流程採取行動,例如核准或拒絕要求。下圖說明採購單 (PO) 和銷貨單 (SO) 核准工作流程的互動式即時通訊模式:
下列清單列出互動式 Chat 應用程式 (適用於 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 定價」。
連線設定選項
為處理 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 Chat 的 Google Workspace Business 或 Enterprise 帳戶。
您擁有 Google Cloud 帳戶和專案。每個 Chat 應用程式都需要專屬的 Google Cloud 專案。也就是說,您只能在一個 Google Cloud 專案中設定單一 Chat 應用程式。
您已為專案啟用計費功能。如要瞭解如何確認專案已啟用計費功能,請參閱「驗證專案的帳單狀態」。
Google Cloud 專案已啟用 Google Chat API。
設定 Apps Script 專案
如要接收及處理訊息,請在 Apps Script 專案中實作 Chat 應用程式邏輯。Apps Script 提供後端邏輯和自動化功能。您可以使用這項功能編寫程式碼,處理事件,例如擷取使用者訊息、處理按鈕點擊,以及觸發後續動作。
如要設定 Apps Script 專案,請執行下列步驟:
- 前往「應用程式指令碼」。
建立指令碼來處理 Chat 應用程式邏輯,以便接收及處理訊息。如要瞭解如何建立指令碼,請參閱 Google Apps Script 快速入門。
舉例來說,您需要編寫 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 Script 專案。如要瞭解如何連結專案,請參閱「連結 Google Cloud 專案」。
為指令碼建立部署。如要瞭解如何部署指令碼,請參閱「建立及管理部署作業」。
記下部署作業 ID。如要瞭解如何查看部署 ID,請參閱「查看部署 ID」。
如要進一步瞭解如何設定 Apps Script 專案,請參閱 Google Apps Script Chat 應用程式快速入門指南。
設定 Google Chat 應用程式
如要設定 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
。
- 在「應用程式名稱」中輸入
在「連線設定」下方,選取「Apps Script」。
在「設定 Apps Script 專案」一節中,輸入您建立的指令碼部署 ID。
按一下 [儲存]。
設定 Google Chat 應用程式的驗證機制
您可以透過兩種方式驗證 Google Chat 應用程式:以應用程式本身或使用者身分。
如果應用程式需要執行自動化工作 (例如在沒有使用者直接互動情況下傳送系統通知),就會使用服務帳戶。如果您希望應用程式可代表使用者執行操作,例如以特定使用者身分傳送訊息,就必須進行使用者驗證。這種雙重驗證方法可讓您彈性控管應用程式與 Google Chat 的互動方式。
您可以使用 ABAP SDK for Google Cloud 設定這兩種驗證方式。如要瞭解如何為 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 控制台中建立服務帳戶。
- 選用:為服務帳戶指派 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 專案 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 聊天室。如要瞭解如何將應用程式新增至 Chat 聊天室,請參閱「將應用程式新增至對話或聊天室」一文。
設計互動式資訊卡,讓使用者採取行動
資訊卡可提供視覺效果出色且具互動性的資訊呈現方式,進而改善整體使用者體驗。可加入標題、圖片、按鈕等元素,讓使用者直接在 Chat 介面中與內容互動。舉例來說,採購單工作流程資訊卡可能會包含以下資訊:
- 訂購單號碼
- 文件核發日期
- 文件類型
- 供應商
- 運送類型
- 連結可在 SAP Fiori 應用程式中開啟訂購單顯示畫面,以及核准訂購單的按鈕
如要使用 Google Cloud 的 ABAP SDK 設計互動式資訊卡,請使用 GitHub 存放區中的自訂介面 ZGOOG_IF_CHAT_CARDS_V2
。這個自訂介面包含建立資訊卡所需的 ABAP 類型。您可以建立資訊卡,例如下列訂單工作流程範例資訊卡:
如要進一步瞭解如何設計資訊卡訊息,請參閱「為 Google Chat 應用程式建構資訊卡」。
如要使用 Google Cloud 的 ABAP SDK 將訊息從 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 = VALUE zgoog_if_chat_cards_v2=>ty_header(
title = 'Purchase Order Workflow - Level 2 Approval Alert!'
subtitle = 'PO Number: 8700000035'
image_url = 'https://developers.google.com/chat/images/quickstart-app-avatar.png' ).
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_button = VALUE #( text = 'Display Purchase Order'
color = VALUE zgoog_if_chat_cards_v2=>ty_color( alpha = '1'
blue = '1'
green = '0'
red = '1' ) ).
" Replace this with URL for Fiori Application
ls_button-on_click-open_link-url = 'https://developers.google.com/workspace/chat'.
ls_widget-button_list-buttons = VALUE #( BASE ls_widget-button_list-buttons
( ls_button ) ).
CLEAR ls_button.
ls_button = VALUE #( text = 'Approve Purchase Order'
on_click-action-function = 'onCardClick'
color = VALUE zgoog_if_chat_cards_v2=>ty_color( alpha = '1'
blue = '0.2'
green = '0.4'
red = '0' ) ).
ls_param-key = 'functionToCall'.
ls_param-value = 'sendToPubSub'. " Replace this with function name on AppsScript
ls_button-on_click-action-parameters = VALUE #( BASE ls_button-on_click-action-parameters
( ls_param ) ).
CLEAR ls_param.
ls_param-key = 'action'.
ls_param-value = 'approved'. " Indicate approval action has taken place
ls_button-on_click-action-parameters = VALUE #( BASE ls_button-on_click-action-parameters
( ls_param ) ).
CLEAR ls_param.
ls_widget-button_list-buttons = VALUE #( BASE ls_widget-button_list-buttons
( ls_button ) ).
CLEAR ls_button.
ls_button = VALUE #( text = 'Reject Purchase Order'
on_click-action-function = 'onCardClick'
color = VALUE zgoog_if_chat_cards_v2=>ty_color( alpha = '1'
blue = '0'
green = '0'
red = '0.7' ) ).
ls_param-key = 'functionToCall'.
ls_param-value = 'sendToPubSub'. " Function name on AppsScript
ls_button-on_click-action-parameters = VALUE #( BASE ls_button-on_click-action-parameters
( ls_param ) ).
CLEAR ls_param.
ls_param-key = 'action'.
ls_param-value = 'rejected'. " Indicate reject action has taken place
ls_button-on_click-action-parameters = VALUE #( BASE ls_button-on_click-action-parameters
( ls_param ) ).
CLEAR ls_param.
ls_widget-button_list-buttons = VALUE #( BASE ls_widget-button_list-buttons
( ls_button ) ).
CLEAR ls_button.
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,如以下螢幕截圖所示:
設計替代方案
如果您在 Google Cloud上代管 SAP S/4 HANA 或 ECC 系統,可以考慮使用下列替代參考架構來設計互動式 Chat 應用程式:
這個參考架構的設計考量如下:
- 負責向使用者傳送訊息的原始 SAP 程序或交易。
- Google Cloud 適用的 ABAP SDK 會透過呼叫 Google Chat API 方法
spaces.messages.create
傳送訊息。 - Google Chat API 會將訊息傳送至對應的 Chat 聊天室。
- 使用者在空間中收到通知,然後回覆並採取行動,例如點選按鈕。
- 使用者動作會叫用 Apps Script 專案,以便處理對應事件。
- Apps Script 專案會叫用 Pub/Sub API 來發布訊息。
- Cloud Run 函式會使用 Eventarc 觸發條件處理訊息並發布事件。
- Cloud Run 函式會透過無伺服器虛擬私有雲連接器呼叫 SICF 節點。
- SAP 系統會根據定義的業務邏輯處理事件,並觸發後續動作。
這個參考架構需要在三個層級中實作邏輯:
- 用於建立即時通訊訊息、處理事件和後續業務程序的 ABAP 層。
- 用於處理 Chat 空間中事件的 Apps Script 層,以及將訊息發布至 Pub/Sub 主題。
- 接收 Pub/Sub 訂閱訊息的 Cloud Run 函式。您可以選擇格式化訊息,並透過 VPC 連接器呼叫在 SAP 系統上代管的 SICF 服務。
後續步驟
如要以最少的付出部署本指南中說明的範例解決方案,請使用 GitHub 提供的程式碼範例。
如要進一步瞭解如何偵錯及排解即時通訊應用程式錯誤,請參閱「疑難排解總覽」。
如要瞭解 Google Workspace 產品,請參閱「選購 Google Workspace 時的常見問題」。
如果您只想將 SAP 通知傳送至 Google Chat,請參閱「將 SAP 通知傳送至 Google Chat」的參考架構。
如需協助解決 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 | 技術撰稿人