这是Jerry 2020年的第85篇文章,也是汪子熙公众号总共第267篇原创文章。
本系列的英文版Jerry写作于2017年,这个教程总共包含十篇文章,发表在SAP社区上。
系列目录
(1) 微信开发环境的搭建
(2) 如何通过微信公众号消费API
(3) 微信用户关注公众号之后,自动在SAP C4C系统创建客户主数据
(4) 如何将SAP C4C主数据变化推送给微信公众号(本文)
(5) 如何将SAP UI5应用嵌入到微信公众号菜单中
(6) 如何通过OAuth2获取微信用户信息并显示在SAP UI5应用中
(7) 使用Redis存储微信用户和公众号的对话记录
(8) 微信公众号的地图集成
(9) 如何将微信用户发送到微信公众号的消息保存到SAP C4C系统
(10) 如何在SAP C4C系统直接回复消息给微信公众号的订阅者
最近有不少朋友在微信上向我咨询SAP系统和微信公众号集成的问题,因此我把当时写的英文版翻译成中文,重新发布在我的公众号上。
需要注意的是,时隔三年,微信公众号的开发流程可能有所变化,请大家自行鉴别。和微信公众号集成的系统,我三年前选择的是SAP Cloud for Customer.
这个系列的前一篇文章,微信用户关注公众号之后,自动在SAP C4C系统创建客户主数据,我们已经实现了这样一个场景:微信用户关注公众号之后,在SAP Cloud for Customer(以下简称C4C)系统里自动创建一个客户主数据,并把该数据的Last Name字段设置成关注者的Wechat id.
成功创建的C4C客户主数据的id也会通过微信消息发送到关注者的微信app上。
在C4C系统查看通过OData API创建的客户主数据:
这个场景的数据交互流,微信app是消息的发送方,而SAP C4C系统是消息接收方,消息通信通过nodejs开发的微信消息服务器完成。
本文我们实现一个新的场景,当C4C的客户主数据发生变化时,C4C主动通知微信关注者。在这个场景里,C4C是消息的发送方,而微信app是消息的接收方。
具体实现步骤
前一篇文章里,我选用C4C Account BO标准的LastName字段来存储微信关注者的Wechat id:
这个客户主数据的明细页面如下:
本文我选择在Customer BO上创建一个名为WechatID的扩展字段,专门存放微信关注者的Wechat id.
在C4C系统中创建一个新的OData服务,选中新建的扩展字段WechatID,将其暴露到OData API中:
将新建的C4C OData服务重命名为zindividualcustomer,在Postman里测试,确保使用OData filter操作符时,能够读取包括这个扩展字段在内的客户主数据的值。
测试url:
https://<此处填入C4C系统的hostname>/sap/c4c/odata/cust/v1/zindividualcustomer/CustomerCommonCollection?$filter=ParentObjectID%20eq%20%2700163E20C9511EE7B8975BD4AB3F60C0%27
ParentObjectID字段后面红色高亮值是Customer BO实例的guid.
我们期望的行为是,一旦客户主数据在C4C系统被修改后,C4C系统会自动发送一个notification(通知)给微信消息服务器,后者收到通知后,调用微信消息API将该通知转发给微信关注者。
一个好消息是,上面红色高亮的行为描述,是C4C系统一个开箱即用的功能:OData Event Notification. Jerry曾经成功地使用这个功能完成过很多原型开发,比如这篇文章里介绍的一个案例:
一些SAP Partners能够通过二次开发实现打通C/4HANA和S/4HANA的方法介绍
下图的设置含义是,一旦名称为CUSTOMER的BO数据发生变化时,发生变化的具体数据,通过下图蓝色高亮字段指定的OData服务,zindividualcustomer, 发送到绿色高亮字段指定的事件监听者去。这个事件监听者的endpoint通过url标识,即本系列部署在heroku云平台上的微信消息服务器:https://wechatjerry.herokuapp.com/c4c
现在修改一个C4C客户主数据并保存,C4C系统会调用我们之前配置好的zindividualcustomer,通过HTTP POST的方式发送下列格式的数据到微信消息服务器:
上图标号1代表发生变化的BO名称,标号2代表发生变化的BO实例的guid,标号3代表OData服务endpoint,我们在微信消息服务器里访问该endpoint,即可获取包含WechatID扩展字段在内的BO数据。有了WechatID之后,我们即可调用微信消息发送API,将BO发生变化的情况发送给微信公众号的关注者。
在微信消息服务器里,响应来自C4C系统的HTTP POST请求,从请求中解析出发生变化的Customer BO实例的guid,存储在第42行代码的变量AccountBOguid里,紧接着在第43行代码的notifyWechatUser里,根据AccountBOguid调用C4C OData拿到扩展字段WechatID的值,然后向该WechatID标识的微信用户推送消息。
这里我调用sendMessage函数,发送给微信关注者的文本是一段硬编码的文字:
_getAccount的具体实现在我的Github上:
https://github.com/wangzixi-diablo/wechat-sap-integration/blob/main/jerryapp/service/getAccountinC4C.js
最后,将前一篇文章介绍的场景联合起来测试。首先关注微信公众号,这个行为会在C4C系统自动创建一个客户主数据1000443:
在C4C系统打开这条主数据,修改之后保存:
然后在我的微信app上收到了一条推送信息,即之前在微信消息服务器里硬编码的一条文本:
下一篇文章,我们会了解如何将SAP UI5应用嵌入到微信公众号里访问。
感谢阅读。
系列目录
(1) 微信开发环境的搭建
(2) 如何通过微信公众号消费API
(3) 微信用户关注公众号之后,自动在SAP C4C系统创建客户主数据
(4) 如何将SAP C4C主数据变化推送给微信公众号(本文)
(5) 如何将SAP UI5应用嵌入到微信公众号菜单中
(6) 如何通过OAuth2获取微信用户信息并显示在SAP UI5应用中
(7) 使用Redis存储微信用户和公众号的对话记录
(8) 微信公众号的地图集成
(9) 如何将微信用户发送到微信公众号的消息保存到SAP C4C系统
(10) 如何在SAP C4C系统直接回复消息给微信公众号的订阅者
更多Jerry的原创文章,尽在:“汪子熙”: