写点什么

SAP 系统和微信集成的系列教程之一:微信开发环境的搭建

作者:Jerry Wang
  • 2022 年 9 月 06 日
    四川
  • 本文字数:2256 字

    阅读完需:约 7 分钟

系列目录


(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 系统和微信公众号集成的问题,因此笔者把以前自己做过的系统集成项目的一些经验,分享到 InfoQ 社区上,希望对相关从业者有所帮助。


和微信公众号集成的 SAP 系统,我三年前选择的是 SAP Cloud for Customer.

搭建开发环境的前置条件

(1) 去微信公众平台申请一个微信公众号。(2) 这个教程里的微信消息服务器是用 nodejs 开发的,所以需要对 nodejs 的开发有一个基本的了解。

具体环境搭建流程

登录微信公众平台, 进入公众号管理控制台:


Development->Basic configuration



在下图的 URL 字段里,维护你的微信消息服务器地址。当我们使用微信 app 往某个微信公众号发送消息时,微信 app 会把该消息转发给微信公众号绑定到的微信消息服务器去。该消息服务器处理完毕后,将处理结果推送回微信 app.



上图中我的微信消息服务器部署在 heroku 云平台上,当然你也可以把自己用 nodejs 开发的微信消息服务器,部署在其他的云平台,比如阿里云,腾讯云,SAP 云平台等均可。


仅仅简单地将云平台上的微信消息服务器的 url 维护在上图的 URL 字段是不够的,我们必须遵循微信公众号开发指南里定义的一个校验流程,从而让消息服务器同微信公众号真正地建立绑定关系。


校验流程文档如下:



点击下图的 submit 按钮之后,微信公众平台会发送一个 HTTP 请求到我们开发的微信消息服务器去:



HTTP 请求的 url 格式如下:


https://<your server url>/?signature=096abd439b41f9610aeabe2d7534084fd8dafa20&echostr=16168327802220428137&timestamp=1512810825&nonce=384289189


我们的微信消息服务器,收到这个请求后,将微信公众号的账号令牌, HTTP 请求里包含的时间戳和 nonce 字段作为输入,按照微信开发指南里的说明计算一个输出值,如果该输出值和 HTTP 请求传入的签名值(signature)相等,则该微信消息服务器通过验证,后续可以接收来自微信 app 的用户请求。


如果计算的输出值不等于 HTTP 请求传入的签名值,则验证失败,错误消息:Token authentication failed.



使用 nodejs 开发微信消息服务器的简要步骤:


(1) 新建一个 nodejs 应用,package.json 里定义依赖如下。定义启动脚本 start 执行的命令行为:


node server.js



(2) 实现 server.js, 主要逻辑是接收前文描述的 submit 按钮点击之后,发送给微信消息服务器的 HTTP 验证请求,从请求中提取出时间戳(下图第 17 行)和 nonce 字段(下图第 19 行),使用 SHA-1 散列算法计算出一个哈希值(下图第 29 行),然后同 HTTP 请求传入的签名值比较(第 31 行). 如果两个值相等,在第 32 行将 HTTP 请求传入的 echostr 返回给微信公众平台,验证通过。



之前有一些 SAP 从业者们,吐槽微信公众平台上给出的代码示例是基于 Python 的,而不是 SAP 生态圈内的朋友们更常用的 Java 或者 JavaScript. 笔者为此写了一份 Node.js 版本的 server.js:

var express = require('express');var routesEngine = require('./index.js'); var app = express();routesEngine(app);
app.listen(process.env.PORT || 3000, function () { console.log('Listening on port, process.cwd(): ' + process.cwd() );});In implementation of index.js, now we need to implement verification process:var request = require('request');var jsSHA = require('jssha');
module.exports = function (app) { app.route('/').get(function(req,res){ var token="jerry"; // replace it with your own token var signature = req.query.signature, timestamp = req.query.timestamp, echostr = req.query.echostr, nonce = req.query.nonce; oriArray = new Array(); oriArray[0] = nonce; oriArray[1] = timestamp; oriArray[2] = token; oriArray.sort(); var original = oriArray.join('');
var shaObj = new jsSHA("SHA-1", 'TEXT'); shaObj.update(original); var scyptoString = shaObj.getHash('HEX'); console.log("calculated string: " + scyptoString); if (signature == scyptoString) { res.send(echostr); } else { res.send('bad token'); } });};
复制代码


最后,将这个 nodejs 应用部署到云平台上,比如腾讯云,阿里云,SAP 云平台等。


笔者当时做项目的时候,选择的是 heroku 云平台,部署应用的详细步骤参考我这篇文章:


Step by step to host your UI5 application in Heroku


消息服务器部署到云平台之后,点击微信公众号后台控制台的 submit 按钮,从 heroku 的控制台上,能看到 nodejs 应用里用 console.log 打印出的日志,其中 HTTP 请求传入的签名值和 nodejs 应用里计算出的哈希值一致,所以验证通过。



验证通过后,微信公众号控制台的服务器配置字段,能看到 is enabled 的提示,说明该消息服务器已经能够接受用户使用微信 app 给微信公众号发送的消息了。



本系列的下一篇文章,笔者会介绍如何在微信消息服务器中接收用户用微信 app 发送给微信公众号的消息,处理之后如何推送回微信 app.


感谢阅读。

发布于: 刚刚阅读数: 3
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
SAP系统和微信集成的系列教程之一:微信开发环境的搭建_系统集成_Jerry Wang_InfoQ写作社区