开发微信公众号【3】接收消息

如题所述

第1个回答  2022-07-01

当普通微信用户向公众号发送消息的时候,微信服务器将POST消息的XML数据包发到开发者填写的URL上,所以我们之前设置的用来验证服务器是否是我们的那个URL便成了服务器与微信通信的唯一接口,不过它这次不用GET方法,而是用POST,并且发送的是XML,且要求我们回复XML

之前用的是body-parser,尝试直接使用req.body获取不到相应的数据包,原因是body-parser只对req.body 为json格式的做解析,所以对于xml格式的,解析后就req.body就变成空对象了
通过百度查询找到了两个xml转化模块,一个是xml2js,一个是express-xml-bodyparser
两个模块都可以转化xml为js对象,笔者因为使用了express框架,而且只需要在请求中调用转换,因此选择了后者,如果你想在其他地方使用到转化或者前端框架不是express的化,那么前者则是更好的选择。
然后在路由中调用:
<pre><code>
var xmlparser = require('express-xml-bodyparser');

app.post('你设置的公众号URL', xmlparser({trim: false, explicitArray: false}), function(req, res) {

console.log(req.body);

})
</code></pre>

返回xml格式需要在res中提前设置Content-Type为application/xml
<pre><code>
var xmlparser = require('express-xml-bodyparser');

app.post('你设置的公众号URL', xmlparser({trim: false, explicitArray: false}), function(req, res) {

console.log(req.body);

data = '<xml><ToUserName>chenjsh36</ToUserName></xml>';

res.writeHead(200, {'Content-Type': 'application/xml'});

res.end(data);

})
</code></pre>
好了,有了接收普通消息的接口后,便可以实现很多有趣的功能,如问答机器人、字典翻译等,网上也有很多已经实现好的模块供大家去直接调用。

笔者调用一个免费开源的问答机器人,它提供了对应的接口,笔者将微信服务器发送过来的数据包解析后,提取content转发给问答机器人,得到回复后再转发给微信服务器,具体转发方法请参考上面的格式,便简单的实现一个智能机器人(本来想自己实现一个,发现人工智能太弱了。。。)

遇到的坑 :一开始是直接转发content的内容,发现问答机器人很不智能,刚好早上看到一位前端老师的课程ppt,刚好讲到了字符集和字符编码的内容,简直是太巧了,瞬间意识到了可能是中文没有编码导致的问题,使用encodeURI解决了这个bug,机器人瞬间智能了!(我要谢谢那位发ppt给我的教导员T T)

实现消息接收和回复的主要坑是之前没有接触过xml的接收和传递,导致开始拿到的body为空的情况。记住这个坑就可以了。

作为个人开发者公众号,开放的 会话功能 只有接收消息、接收事件推送、接收语音识别结果(暂时不知道是什么鬼)、自动回复这些接口
一些好玩的接口如获取用户列表、获取用户地理位置、素材管理、微信支付、分享接口等都没有开发给个人运营者

相似回答