SAP C/4HANA Sales Cloud使用OData服务和第三方系统集成的一个具体例子

出于工做须要,Jerry写了这篇文章,给某些Partner作参考。javascript

之前Jerry曾经介绍过SAP C/4HANA的五朵云到底包含哪些具体产品,其实在SAP官网上有更权威的中文解释:html

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

其中明确提到销售云包含SAP Cloud for Customer(C4C),SAP Revenue Cloud和Callidus Cloud。node

有Partner询问有没有更详细的步骤介绍,关于如何在第三方系统里调用SAP C4C暴露出的Restful API进行集成。本文就给出一个具体的例子,将SAP C4C销售订单的建立功能经过自定义的OData服务暴露出来,而后Partner能够根据项目须要选择合适的编程语言(本文选择JavaScript)来消费。android

Jerry之前发布过一个视频,演示了如何在SAP C4C里手动建立一个销售订单,步骤能够说简单易懂。git

https://v.qq.com/x/page/d0809f4tswl.htmlgithub

如今咱们经过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的原创文章,请关注公众号"汪子熙":

相关文章
相关标签/搜索