当前的互联网行业高速发展,各种社交软件,网络服务层出不穷,极大的丰富和便利了人们的生产和生活,SAP 作为传统的 ERP 软件,需要跟随时代的脚步,充分利用互联网的开放自由,多元化等优势,不再拘泥于企业内网限制,与多元化的互联网软件和服务相结合,实现 SAP Anywhere。
SAP 云平台 (SAP Cloud Platform 或 SCP) 是 SAP 当前和未来战略上主推的云产品解决方案,在未来,所有的客户应用程序都将依赖于云平台,部署在其上。SCP 底层使用当前市场上主流且成熟稳定的 Cloud Foundry 开源云平台作为其托管平台,能够做到应用程序的全生命周期管理,并支持多种框架、语言和运行时环境,如: GO、Ruby、Python、Nodejs、Java、ABAP、PHP 等,可以实现应用程序的快速部署。
今天我们以国内主流的企业微信为例,讲讲 SAP ERP 如何通过 SAP Cloud Platform 与企业微信相结合,实现采购订单的移动化审批,为企业的数字化之路添砖加瓦。
在这篇文章中,我们将逐步为大家讲解具体的实现细节。鉴于篇幅受限,上篇主要涵盖创建自定义审批模板、验证回调服务器、编写回调验证 API、编写订单审批状态接收 API、安装 SCC 5 个步骤,其余操作我们将在下篇中再为您细细道来。
SCP 云平台与企业微信集成的架构图
创建自定义审批模板
为了实现企业微信的审批调用,我们首先需要通过企业微信官网 (https://work.weixin.qq.com/) 注册一个企业微信公司账号,之后根据公司的实际需求,创建一个自定义的审批模板,依次点击 “应用管理”->“应用”->“审批” 进入审批应用程序管理页面,如下图:
在管理页面启用审批功能并添加自定义模板,如下图:
自定义模板样例如下图:
验证回调服务器
创建自定义审批模板之后,为了使企业微信能够与 SCP 进行交互,我们需要开启企业微信审批应用的 API 功能并配置接收审批事件的服 (SCP 上的应用程序),当模板审批申请状态发生变化时,企业微信将以事件形式推送相关信息到该服务,这是企业微信与 SCP 集成的桥梁。
在管理页面点击 API 图标,可以展开 API 配置页面 (请记住 AgentId 和 Secret,以备后续使用)。
对于第一次注册接收审批事件服务器的情况,企业微信要求对我们的服务进行验证,以确认我们的服务是可以状态,同时可以正确解析企业微信传递的信息。
编写回调验证 API
按照以下步骤在 SCP 上创建我们的回调验证 API 服务:
第一步:在本机安装 Nodejs 库和 Cloud Foundry CLI 命令行工具;我们的整个应用使用 Nodejs 进行开发,使用 CLI 进行部署;
第二步:在本地新建一个名为 workwx 的文件夹,这是我们的项目目录;
第三步:命令行进入我们的项目目录,执行 npm init 命令初始化我们的项目 (使用默认选项);
第四步:默认情况下我们的 Nodejs 项目入口文件为 index.js,在项目目录下创建一个 index.js 文件并打开,准备编写代码。
企业微信回调验证规则如下:
企业微信使用 HTTPS Get 方法对回调 API 进行验证
Get 方法包含以下参数
Msg_signature: 加密消息的 SHA1校验码
Timestamp: 时间戳
Nonce: 言值
Echostr: 加密消息将参数 timestamp、nonce、echostr 和企业微信管理页面中预留的 Token 组成数组,并对其进行排序,排序后对结果进行 SHA1 加密,将加密后的结果与参数校验码 msg_signature 进行比较,如果相同,这说明加密消息完整,没有被篡改,如果不同,说明加密消息可能被解惑更改了。
在消息未被篡改的前提下,对在企业微信管理页面中预留的 EncodingAESKey 进行 Base64 解码,在此之后通过将解码结果作为密钥,对 echostr 加密字串进行 AES 对称加密算法的解码工作,企业微信 AES 使用 CBC 模式,PKCS7 填充。
将解密后的字符串结果去除多余无用的字符后响应给HTTPS Get请求完成回调 验证工作
在了解了上述验证规则后,使用 npm install 命令为我们的项目下载安装必要的功能库文件,并在 index.js 中引用它们:
之后按照企业微信的要求完成回调验证 API 的编写 (代码如下):
第五步:API 编写完成后,在项目目录的上一层目录创建 manifest.yaml 文件,内容如下:
Memory 和 disk_quota 表示为项目分配的资源,buildpacks 表示项目使用的运行时环境包,command 对应项目的启动命令,routes 下则是用来为项目分配网络服务地址 (Url)。保存文件,在当前目录使用 cf login 命令登录 SCP 云平台:
登录成功后,使用 cf push 命令将 workwx 项目推送并部署到云平台:
成功之后我们即可在 SCP 云平台上看到部署的应用程序:
回到企业微信审批 API 配置页面,点击接收事件服务器后的 “设置”,会进入到具体服务器地址的配置页面:
在点击保存按钮之前,我们需要维护 URL 地址,可以将刚刚编写的 manifest.yaml 文件中 routes 下分配的网络地址和回调 API 的服务路径 (例子中的服务路径为/callback) 组合填写到 URL 框内,然后点击保存,如果一切正常,企业微信 API 会发起验证请求来验证我们的服务,一旦成功返回解密后的字符串,则企业微信验证成功,可以允许保存当前页面信息。
编写订单审批状态接收 API
应用程序已编写的 HTTP Get 方法只是完成了对回调服务的验证,而真正需要接收处理审批状态变化信息的是 HTTP Post 方法,当企业微信端的任意审批申请发生状态变化时(新建,承认,拒绝等),企业微信将通过 HTTP Post 请求将状态信息以 XML 的格式发送到与验证服务相同的服务路径,对于其中敏感的数据部分将进行加密。了解了以上信息后,我们将完善我们的应用程序,为其添加 Post 方法来接收状态数据,同时对其进行解密,具体代码如下,完成后暂时不要重新部署该项目:
Aprmessage 函数用于接收,校验和解密消息:
安装 SCC
归根结底,我们的应用程序是为后端 ERP 系统服务的,每次接收到审批状态的变化信息而不将其同步到后端 ERP 系统,则失去了应用程序存在的意义,所以我们需要再为应用程序增加一个功能,当接收到审批状态信息的时候将其发送给后端 ERP 系统,更新对应的业务单据。
由于我们的 SCP 云平台在公网,而后端的 ERP 系统在局域网,在企业的网关和防火墙的限制下,它们是互不通信的,为了解决这个问题,我们需要通过一个叫做 SAP Cloud Connector (简称SCC) 的产品将两者联系起来,SCC 是一个由 SAP 开发的反向代理服务器 (通过Java虚拟机执行),需要安装在一台可以面向公网也能够连接后端 ERP 的机器上,通过它我们的 SCP 云平台可以主动使用加密通道访问后端 ERP 暴露的服务,将信息推送给后端系统,搭建系统间的桥梁。
要使用 SCC 首先需要在 SAP 工具网站上 (https://tools.hana.ondemand.com/#cloud) 找到适合自己的 SCC 版本进行下载:
下载完成后,安装 (或解压) SCC,在程序目录中通过 go.bat 文件启动服务器,如果一切顺利我们将在控制台看到服务器的入口地址:
通过浏览器访问该地址,会看到以下初始页面:
初始的用户名/密码为: Administrator/manage 登录后需要修改密码,之后进入主操作页面,在该页面将 SCC 绑定到指定地区的 SCP 平台和账号。
Region: SCP云平台的地区
Subaccount: 子账号的 ID,可以在云平台上查看获取
Login E-Mail: 登录 SCP 云平台的账号
Password: 登录 SCP 云平台的密码
保存后如果没有其它已经部署的 SCC 的话,页面会提示以下信息表示成功。
目前我们已经成功的将 SCC 与云平台连接,下面我们需要将 SCC 与本地 ERP 系统进行连接,在 “Cloud To On-Premise” 页签下选择添加按钮并做以下设置:
Internal Host 为后端 ERP 系统的地址。
Internal Port 为后端系统网络服务的端口号,HTTP 协议下的默认端口号为 “80+实例编号”。
Virtual Host 为在云平台上显示和使用的后端系统别名 (安全考虑)。
Virtual Port 为在云平台上显示和使用的后端端口别名 (安全考虑)。
完成后我们可以看到 SCC 已经成功与后端 ERP 系统连接,但是出于安全考虑,此时的 SCC 并不能访问后端的系统资源,为了能够正常访问资源我们需要为 SCC 指定可以访问的后端资源路径,点击添加按钮并进行资源路径配置。
保存后我们的前后端系统就都已经可以正常连接了,SCC 的配置至此告一段落。
关于更详细的 SCC 配置和操作可以访问下面地址:
https://help.sap.com/viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/en-US/e6c7616abb5710148cfcf3e75d96d596.html
至此,我们已经完成了 SCC 的配置工作,我们将在《SAP 云平台与企业微信审批集成方案 (下)》一文中与您分享接下来的实现细节,包括: 编写推送订单状态信息到本地 ERP 系统函数、编写 ERP 端 OData 服务处理后端与 SCP 的信息交互、ERP 端通过增强抓取订单状态变化信息、编写抽取 ERP 系统订单状态信息到 SCP 的 API、编写作业调度服务用于周期抽取 ERP 系统订单状态信息,敬请期待。
罗斯
埃森哲大中华区企业创新技术事业部
项目副经理
如果您或者您身边的技术大牛也想要分享与 SAP 云平台有关的开发内容和实用技巧,欢迎您积极投稿或者推荐。我们会进行适当筛选,并随后与作者沟通联系。投稿邮箱:gavin.du@sap.com
jiahui.zou01@sap.comkate.shen02@sap.com
往期回顾
- SAP 云平台实用技巧之 Cloud Connector 篇
- 通过 SAP CPI 实现 SAC 与 Ariba 的数据连接
- 使用 SAP 云平台 Runtime 集成 Ariba 与企业微信
- 基于 SAP 云平台的云应用授权管理 (上)
- 使用 SAP Cloud Platform Custom Domain Service 设置个性化域名
- 基于 SAP Cloud Application Programming Model 快速构建 MTA 工程
- SCP 开发技巧 | 使用 SAP 云平台 Mobile Service 开发移动应用
- SCP 技术干货 | 使用 SAP Cloud Platform IAS 安全策略做权限管理
- 基于 SAP 云平台的云应用授权管理 (下)
- 利用 SAP XSUAA 安全模块快速实现 Python 应用的认证和授权