JerryWang_SAP 阅读(482) 评论(0)

出于工作需要,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里手动创建一个销售订单,步骤可以说简单易懂。

外链网址已屏蔽

现在我们通过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上获得:

外链网址已屏蔽

注意本代码只用于演示目的,缺少健壮的出错处理,不能直接用于生产环境中。

下面的代码使用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服务同步模式和异步模式的讨论

外链网址已屏蔽

  1. OData服务的性能分析

外链网址已屏蔽

外链网址已屏蔽

  1. 基于SAP CDS view生成OData服务

外链网址已屏蔽

  1. OData的offline支持

5.1 外链网址已屏蔽

5.2 外链网址已屏蔽

5.3 外链网址已屏蔽

  1. 使用ABAP消费SAP C4C标准OData服务

外链网址已屏蔽

  1. SAP CRM,C4C和S/4HANA里OData服务实现的横向比较

外链网址已屏蔽

  1. 使用Java和jMeter对需要支持CSRF验证的OData服务进行高并发性能测试

外链网址已屏蔽

  1. 使用C4C OData + ABSL消费自定义BO的逻辑

外链网址已屏蔽

要获取更多Jerry的原创文章,请关注公众号"汪子熙":