SAP C/4HANA Sales Cloud使用OData服務和第三方系統整合的一個具體例子
出於工作需要,Jerry寫了這篇文章,給某些Partner做參考。
以前Jerry曾經介紹過SAP C/4HANA的五朵雲到底包含哪些具體產品,其實在SAP官網上有更權威的中文解釋:
其中明確提到銷售雲包含SAP Cloud for Customer(C4C),SAP Revenue Cloud和Callidus Cloud。
有Partner詢問有沒有更詳細的步驟介紹,關於如何在第三方系統裡呼叫SAP C4C暴露出的Restful API進行整合。本文就給出一個具體的例子,將SAP C4C銷售訂單的建立功能透過自定義的OData服務暴露出來,然後Partner可以根據專案需要選擇合適的程式語言(本文選擇JavaScript)來消費。
Jerry以前釋出過一個影片,演示瞭如何在SAP C4C裡手動建立一個銷售訂單,步驟可以說簡單易懂。
https://v.qq.com/x/page/d0809f4tswl.html
現在我們透過OData的方式將銷售訂單的建立功能暴露出來,就能在第三方系統或者應用裡完成C4C的訂單建立。
大家如果對SAP OData還不太瞭解,可以先讀一讀我這篇文章開頭的部分:
下面是詳細步驟。
登入C4C系統,訪問工作中心Administrator,工作中心檢視OData Service Explorer,這裡可以在SAP釋出的標準OData服務和客戶自定義的OData服務之間切換。
因為客戶自定義OData服務能夠允許客戶自行決定從哪一個Business Object的哪一些節點,選擇哪一些欄位來生成OData模型,透過這種靈活的方式可以避免Business Object上客戶業務場景裡不需要的欄位出現在OData模型中。
點選New按鈕新建一個OData服務:
給Work Center View欄位指定一個用來做許可權控制的檢視,只有分配了這個檢視的使用者才有許可權訪問這個OData服務。
點選Select Business Object從彈出對話方塊中選擇基於哪一個Business Object建立OData模型。
下圖就是一個已經建立好並處於Active狀態的OData服務。左邊顯示的是CustomerQuote這個BO的Root節點的所有欄位,每個欄位都有一個可以勾選或取消的Select屬性,勾選則該BO欄位會出現在右側的OData模型裡。
除了Root節點之外,BO的其他子節點上的欄位當然也是可以出現在OData模型裡的,比如我上圖右邊OData模型的子節點CustomerQuoteItem, CustomerQuoteParty和CustomerQuoteText等,就是分別從左邊BO的同名節點選中後自動帶到右邊的OData模型中去的。
理論上,完成基於BO模型進行OData模型的建立並啟用後,這個OData服務就可以使用了,這體現了SAP C4C OData服務自定義框架的強大之處。然而我也收到了一些朋友從後臺給我提的一些問題,羅列如下。
問題1: 仍然以本文銷售訂單建立這一場景為例,假設我希望我建立的OData服務能夠允許消費者呼叫時指定External Reference的值,但是我找遍整個BO列表,也沒發現銷售訂單的BO上有叫這個名稱的欄位啊?
Jerry答: External Reference是UI文字,不是BO欄位的技術名稱。
給C4C系統在瀏覽器裡的url新增引數 debugMode=true , 然後重新整理頁面,按住Ctrl鍵再單擊External Reference欄位,
就能看到這個UI欄位繫結到UI模型上哪一個欄位了。
在這個UI模型欄位上再點選Show Model,就能看到這個UI模型欄位繫結到的BO欄位名稱為BuyerID。
所以我們在OData開發工具裡,只需把BO欄位BuyerID選中,移動到右邊的OData模型裡即可。
問題2:我想讓我的OData服務支援行專案資料的建立,比如指定產品ID,描述和購買數量等等。我怎麼知道哪些BO節點上的欄位需要新增到OData模型中去?
Jerry答: 現在我們換一種方法,開啟Cloud Application Studio的UI Designer,定位到銷售訂單建立頁面的UI模型COD_SALESORDER_QC, 找到Product ID欄位,在它的Properties皮膚裡即可看到這個Product ID欄位繫結的BO欄位的名稱和完整路徑:
Root-.ItemProposal- ProductUUID- content
因此我們需要將BO對應路徑下面的ProductUUID欄位新增到OData模型中去。這裡能觀察到ProductID的Create和Update是沒有勾選上的,而ProductUUID則支援Create和Update,這個行為和C4C銷售訂單行專案建立的標準實現有關——消費者需要提供待建立行專案包含的產品UUID,然後C4C會根據UUID到系統中查詢出對應的產品,顯示其ID到UI上。如果消費者在呼叫OData服務時,沒有指定ProductUUID,則行專案建立邏輯不會執行。
OData模型建立好之後,在用程式語言消費之前,我們可以先用工具Postman(或者C4C自帶的測試工具)進行測試。
因為SAP C4C後臺對 Cross-site request forgery(跨站請求偽造) 這種攻擊採取的防禦實現和SAP CRM,SAP S/4HANA一樣,採取的是 CSRF token驗證 機制,因此我們在呼叫OData服務進行銷售訂單建立時,需要將一個合法的CSRF token一併傳遞給C4C系統。
如何得到一個合法的CSRF token呢?在Postman裡構造一個HTTP GET請求,頭部欄位名為
x-csrf-token , 值為fetch:
傳送這個HTTP GET請求,伺服器端會生成一個CSRF token,透過HTTP響應結構頭部欄位x-csrf-token返回給消費者:
sNwnYC9cV4xeGSYZmJ8Dtw==
下面我們再在Postman裡新建一個HTTP Post請求,將之前透過HTTP GET拿到的CSRF token,以HTTP Post請求頭部欄位的方式傳送給C4C系統。
關鍵在於HTTP Post請求的請求體。下圖高亮部分是我在HTTP Post請求裡指定的建立銷售訂單的輸入資料:
在Postman裡傳送這個Post請求,幾秒鐘後得到C4C的響應,訂單建立成功,ID為9000000451:
為了方便大家對比,下面是我用Postman消費我建立的OData服務生成的銷售訂單在系統裡的顯示。欄位1~6對應的Postman輸入欄位可以在前文找到。
藍色區域高亮顯示的欄位,我在Postman裡構造的輸入裡並沒有維護,而是透過SAP C4C系統的各種determination配置,自動決定出來的。最典型的有SAP老司機們天天打交道的Partner determination,Organization determination,Pricing determination等。
Postman裡測試透過後,就可以寫程式碼消費了。
如果想直接複製貼上我下面列出的程式碼,可以從我的github上獲得:
注意本程式碼只用於演示目的,缺少健壯的出錯處理,不能直接用於生產環境中。
下面的程式碼使用nodejs提供的request模組向C4C請求CSRF token。注意第3行的url和第11行的Authorization頭部的值,我都是用的虛假值,請大家替換成自己實際使用的C4C url和認證資訊。
Token拿到之後,將其放入第41行構造的HTTP Post請求的頭部結構中,作為欄位x-csrf-token的值。第47行傳送該POST請求,C4C響應的資料存放於JavaScript變數data中。
最後我透過簡單的console.log列印出建立成功的銷售訂單ID:
在命令列裡用node執行這個js檔案,會列印出從C4C獲取到的CSRF token,以及成功建立的訂單ID。
我們再回顧一下用SAP C/4HANA Sales Cloud中的C4C OData同外部系統做整合的三個主要步驟:
1. 在C4C的OData模型編輯頁面裡,根據業務需要,從對應的BO節點裡選擇合適的欄位,新增到OData模型中。
2. 用Postman或者C4C自帶的OData測試工具對OData模型進行測試,確保其正常工作。
3. 根據專案需要選擇合適的程式語言消費OData服務。
如果對於SAP C4C OData有更多的問題需要討論,歡迎留言。感謝閱讀。
Jerry關於OData的更多文章
-
OData服務同步模式和非同步模式的討論
- OData服務的效能分析
https://blogs.sap.com/2016/01/13/measure-the-performance-of-your-odata-service/
- 基於SAP CDS view生成OData服務
- OData的offline支援
5.3 https://blogs.sap.com/2016/08/05/how-is-odata-offline-store-opened-in-android-platform/
- 使用ABAP消費SAP C4C標準OData服務
https://blogs.sap.com/2017/08/04/consume-standard-c4c-odata-service-via-abap-code/
- SAP CRM,C4C和S/4HANA裡OData服務實現的橫向比較
https://blogs.sap.com/2017/08/07/odata-service-backend-implementation-in-c4c-crm-and-s4-hana/
- 使用Java和jMeter對需要支援CSRF驗證的OData服務進行高併發效能測試
- 使用C4C OData + ABSL消費自定義BO的邏輯
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2472103/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 SAP Cloud SDK 連線 OData 服務Cloud
- OData服務在SAP CRM,Cloud for Customer和S/4HANA上的實現比較Cloud
- 使用SAP Cloud Application Programming模型開發OData的一個實際例子CloudAPP模型
- 通過一個具體的例子,講解 SAP Cloud Platform Integration(CPI) 的使用方法CloudPlatform
- SAP S/4HANA Cloud 系統整合的一些場景介紹Cloud
- 使用 SAP UI5 系統測試工具 UIVeri5 的一個具體例子UI
- SAP C4C Opportunity和SAP ERP Sales流程的整合Unity
- SAP UI5 使用 Smart Control 的一個具體例子UI
- SAP Spartacus SplitViewComponent Migration 的一個具體例子View
- SAP Cloud for Customer和SAP Fiori系統裡的OData測試工具Cloud
- SAP C4C OData服務的filter,客戶端分頁和排序的使用方式Filter客戶端排序
- Angular Reactive Form 的一個具體使用例子AngularReactORM
- 使用 Angular Transfer State 的一個具體例子Angular
- SAP Cloud for Customer裡Sales Order和Sales Quote的建模方式Cloud
- 一個典型的加了 SAP 註解的 OData 服務明細分析
- 打通C/4HANA和S/4HANA的一個原型開發:智慧服務創新案例原型
- SAP Cloud Platform上Destination屬性為odata_gen的具體用途CloudPlatform
- 如何在SAP gateway系統配置路由到後臺系統的OData服務路徑Gateway路由
- SAP CRM WebClient UI cross component跳轉的一個具體例子WebclientUIROS
- SAP ABAP 寫時拷貝(Copy on Write)策略的一個具體例子
- Media Query 在 CSS 中使用的一個具體例子CSS
- 如何使用 ABAP 程式消費 SAP ABAP OData 服務
- SAP ABAP OData 服務的 $count 和 $inlinecount 兩個操作的區別inline
- 使用url引數傳遞SAP Analytics Cloud filter的一個例子CloudFilter
- RxJS CombineLatest operator 的一個具體使用例子JS
- 下一代智慧雲端ERP系統:SAP S/4HANA CloudCloud
- SAP ABAP OData 服務的 $count 操作實現
- SAP S/4HANA OData Mock Service 介紹Mock
- SAP SEGW 事物碼裡的 ABAP 型別和 EDM 型別對映的一個具體例子型別
- SAP人工智慧服務Recast.AI的一個簡單例子人工智慧ASTAI單例
- 通過一個具體的例子,講解 SAP BDC 技術的使用步驟試讀版
- 使用 Postman 工具高效管理和測試 SAP ABAP OData 服務試讀版Postman
- 使用OData服務將SAP C4C自定義BO的TextCollection暴露給外部消費者
- 電子郵件系統具體安全服務
- 在做和sap系統整合的一點心得
- 如何用 SAP BTP 平臺上的圖形建模器建立一個 OData 服務
- SAP Business Application Studio 裡建立一個基於 CAP 模型的 OData 服務APP模型
- 淺談SAP Cloud for Sales 自動化Cloud