用 Node.js 开发微信墙简明教程

这是一个简单的用Node.js开发微信墙的教程,在这个教程中,包括以下几部分内容:

  • 验证服务器有效性
  • 接收用户通过微信订阅号发给服务器的消息
  • 解析收到的XML文本消息格式为JSON
  • 用模板构造应答用户的XML文本消息
  • 将接收到的消息通过WebSocket服务广播
  • 获取消息发送人的用户基本信息(名字和头像)

微信服务大体上分为两类,一类是消息服务,一类是数据服务。

消息服务是由用户在微信服务号中发送消息,然后微信服务讲消息推送给开发者服务器,因此它是由微信主动发起,开发者服务器被动接收的。

微信主动发起

消息服务的数据体格式是XML,微信服务与开发者服务器之间通过约定token保证数据传输的真实和有效性。

事实上,token验证仅用来给开发者服务器验证消息来源确实是微信,而不是伪造的(因为别人不知道具体的token),作为消息发起方的微信并不要求必须验证,也就是说,开发者也可以偷懒不做验证(后果是别人可以模仿微信给服务post请求)。

 

将微信服务号的服务器配置为开发服务器的URL,就可以接收到微信服务号的消息了

注意:其实理论上一个服务器可以接受和处理多个服务号/订阅号的消息,可以通过消息体的ToUserName来加以区别这个消息是发给哪个微信号的

接收到的消息大概格式如下:

由于消息体是一段XML文本,我们可以将它解析成更容易操作的JSON格式数据:

我们可以回复消息给微信服务,它将这个应答消息转给对应的发消息的用户,格式同样是一段XML,我们可以通过简单的模板来生成应答消息:

将这个消息作为response返回,用户就能在服务号里面收到应答的消息了:

接下来我们创建一个简单的 WebSocket 服务器,它只有一个广播模式:

我们可以将收到的消息用 WebSocket 服务推送:

这样我们就可以在页面上接收微信消息了。

不过……

因为消息应答体中并没有发送者的用户信息,比如姓名、性别、头像等等,因此我们需要获取这些信息,这就要用到微信的第二种服务:数据服务。

数据服务是由开发者服务器主动调用微信服务API获得信息的服务,包括用户管理、素材管理、智能接口、客服接口等等,这类服务从开发者服务器向微信服务主动发起,微信需要验证请求的合法性,采用了与消息服务不同的鉴权机制。

数据服务的请求是https的,返回数据格式通常是JSON。

开发者调用微信数据接口,需要先获取接口调用凭据 access_token。接口调用凭据有效期为2小时,超时或重复获取将导致上次获取的access_token失效。每天每个服务号不能请求超过2000个access_token,因此我们需要自己缓存获取到的access_token。

在这里我们用最简单的文件缓存,如在分布式的和高并发的情况下,我们可以选择其他任意的持久化存储。

获取到有效的 access_token,就可以进一步获取用户基本信息了:

这里面就一个注意点,getUserInfo方法的参数用户的openID,实际上就是消息体XML里面的FromUserName

所以我们将用户基本信息获取出来,附加到 WebSocket 推送的消息中:

最后我们可以得到一段完整的程序,它可以将用户发送给某个微信服务号的文本消息通过 WebSocket 推送到网页,这样我们就实现了一个功能完整的“微信墙”的服务端程序。

以下是完整程序:

以上就是微信开发的基本原理,是不是很简单呢?上面讲解的所有的代码在:

https://github.com/akira-cn/wxdev

有兴趣的同学可以注册一个微信订阅号,配置好服务器,自己尝试一下~

1 9 收藏 1 评论

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部