1. 程式人生 > >SAP C/4HANA Sales Cloud使用OData服務和第三方系統集成的一個具體例子

SAP C/4HANA Sales Cloud使用OData服務和第三方系統集成的一個具體例子

android 取消 ogr 業務場景 能夠 sta gic 彈出對話框 obj

出於工作需要,Jerry寫了這篇文章,給某些Partner做參考。

以前Jerry曾經介紹過SAP C/4HANA的五朵雲到底包含哪些具體產品,其實在SAP官網上有更權威的中文解釋:

https://www.sap.com/china/products/crm-commerce/c4-hana-cx-suite.html

技術分享圖片

其中明確提到銷售雲包含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還不太了解,可以先讀一讀我這篇文章開頭的部分:

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上獲得:

https://github.com/i042416/KnowlegeRepository/blob/master/ABAP/C4COData/create_SalesOrder.js

註意本代碼只用於演示目的,缺少健壯的出錯處理,不能直接用於生產環境中。

下面的代碼使用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的更多文章

1. SAP OData編程指南

2. OData服務同步模式和異步模式的討論

https://blogs.sap.com/2015/06/19/a-test-on-fiori-odata-request-synchronous-mode-vs-asynchronous-mode/

3. OData服務的性能分析

https://blogs.sap.com/2015/07/01/how-to-find-odata-performance-trace-and-payload-trace-functionality/

https://blogs.sap.com/2016/01/13/measure-the-performance-of-your-odata-service/

4. 基於SAP CDS view生成OData服務

https://blogs.sap.com/2016/03/12/my-cds-view-self-study-tutorial-part-4-how-does-annotation-odatapublish-work/

5. OData的offline支持

5.1 https://blogs.sap.com/2016/08/04/how-is-odata-request-routed-to-offline-data-store-by-odata-offline-plugin/

5.2 https://blogs.sap.com/2016/08/04/how-is-javascript-code-in-odata-offline-plugin-delegated-to-native-java-code-in-android/

5.3 https://blogs.sap.com/2016/08/05/how-is-odata-offline-store-opened-in-android-platform/

6. 使用ABAP消費SAP C4C標準OData服務

https://blogs.sap.com/2017/08/04/consume-standard-c4c-odata-service-via-abap-code/

7. SAP CRM,C4C和S/4HANA裏OData服務實現的橫向比較

https://blogs.sap.com/2017/08/07/odata-service-backend-implementation-in-c4c-crm-and-s4-hana/

8. 使用Java和jMeter對需要支持CSRF驗證的OData服務進行高並發性能測試

https://blogs.sap.com/2017/08/28/odata-service-parallele-performance-measurement-how-to-deal-with-xsrf-token-in-java-program-and-jmeter/

9. 使用C4C OData + ABSL消費自定義BO的邏輯

https://blogs.sap.com/2017/12/07/expose-custom-bo-logic-implemented-by-absl-via-custom-odata-service/

要獲取更多Jerry的原創文章,請關註公眾號"汪子熙":

技術分享圖片

SAP C/4HANA Sales Cloud使用OData服務和第三方系統集成的一個具體例子