这是Jerry 2020年的第84篇文章,也是汪子熙公众号总共第266篇原创文章。
本系列的英文版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.
本文实现的场景是:我申请了一个用于测试的微信公众号,用户点击“关注”按钮:
在微信app上收到了一条微信消息服务器发送的提示关注成功的自定义消息:
同时,微信消息服务器调用SAP Cloud for Customer(以下简称SAP C4C) OData API,在C4C系统创建了一条客户主数据,类型为Individual Customer. 成功创建的C4C客户主数据id,1000441,也一并发送到微信app上:
根据这个id,即可在C4C系统查询到微信用户关注公众号之后自动生成的客户主数据:
下面是这个场景的实现细节。在动手编码之前,请确保你已经完成了这个系列之前两篇文章里提到的步骤:
(1) 微信开发环境的搭建
(2) 如何通过微信公众号消费API
具体实现步骤
我们需要在nodejs实现的微信消息服务器里调用SAP C4C OData API,因此需要在nodejs应用里指定C4C OData API的endpoint. 创建一个config.js文件,实现config module:
第二行创建C4C客户主数据的OData url,可以在SAP官方github的C4C OData开发指南仓库里找到,链接如下。
而第五行的accessToken作用是什么呢?
回忆前一篇文章 SAP系统和微信集成的系列教程之二:如何通过微信公众号消费API 描述的场景,当时用户在微信app里给微信公众号发送消息,然后以同步的方式收到回复。
而本文试图实现的场景,微信用户关注公众号之后,触发SAP C4C客户主数据的创建,这个创建通过C4C OData API完成,是一个异步操作。客户主数据创建成功后,微信消息服务器会主动给微信用户推送一条创建成功的消息。
这个主动推送消息的行为,必须满足两个前提条件才能成功:
(1) 推送消息的接收方,必须已经关注了微信消息服务器绑定的微信公众号。
(2) 调用微信推送消息的API时,必须使用基于微信消息服务器的app id和app secret换取的Access Token.
为了简单起见,我事先调用换取Access Token的微信API,传入app id和app secret,拿到token,然后硬编码到config.js里。当然因为该token默认2小时后就会过期,所以也可以采用编程的方式,调用微信API获取,实现代码在这个链接里。
当微信用户点击“关注”按钮关注公众号之后,微信消息服务器会收到一个HTTP POST请求,event key为"subscribe". 微信消息服务器从请求里解析出微信用户的Wechat ID.
代码实现如下:
其中第18行,如果event变量值为subscribe,说明用户点击了“关注”按钮,进入对应的if分支处理。
第19行的replyxml,包含了一条硬编码的消息,即用户关注公众号之后,在微信app里收到的欢迎消息。
第20行的变量fromUserName,储存的是包含在HTTP POST请求里的关注者Wechat ID. 后续微信消息服务器主动给关注者推送C4C客户主数据创建成功的消息时,调用微信消息推送API,会用到这个Wechat ID.
第21行的createAccount方法,调用C4C OData API创建客户主数据。
下面是createAccount的实现源代码,在这个链接里能找到。
因为涉及到C4C数据的创建操作,需要使用HTTP POST,因此在真正调用C4C客户主数据创建API(上图第64行)之前,需要先调另一个API,拿到XSRF token(上图第62行的getToken).
我们需要建立一个简单的映射机制,把微信关注者和C4C系统里创建的客户主数据关联起来。这里我采取的逻辑是,把C4C创建的客户的FirstName字段硬编码成Wechat,而LastName存储成微信关注者的Wechat ID:
从下面C4C系统截图,能看到公众号关注者的Wechat ID已经存储到创建的客户主数据的Name字段上了。
C4C客户主数据创建成功之后,微信消息服务器调用工具方法postWCMessage, 主动推送一条创建成功的消息给点击了“关注”按钮的微信用户:
函数postWCMessage的实现源代码链接.
主动推送消息给微信用户的API可以在Postman等工具里方便地进行测试:
消息推送成功后,被推送消息的用户在微信app上收到的消息如图:
本系列的第四篇文章,我们会实现另一个场景:当SAP C4C系统的客户主数据发生变化之后,主动推送消息给关注了微信公众号的微信用户。
感谢阅读。
系列目录
(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的原创文章,尽在:"汪子熙":