在公众号对话页面与用户进行消息交互是必不可少的操作,学习一波。在上文进行了 开发者验证 后,我们在后台已经可以通过验证的接口拿到用户发送过来的消息了(post请求)。
get it
接收消息的代码如下:
router.post('/', (req, res) => {
let xml = ''
// req.on监听data事件,收集微信传送过来的每一个数据包
req.on('data', chunk => xml += chunk)
// 接收完成即触发end事件
req.on('end', () => {
console.log(xml)
res.send('')
})
})
//xml打印信息:
<xml>
<ToUserName><![CDATA[gh_51541af0b45e]]></ToUserName>
<FromUserName><![CDATA[oIQtJ1LKg4JkVnW_CACOIGazXWRw]]></FromUserName>
<CreateTime>1566468745</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[1]]></Content>
<MsgId>22426441405010976</MsgId>
<Encrypt><![CDATA[2l887J/bJzaZMywNPazFYMzeMw7iKf1Z+HkHYys7raO1YCeasW13sZCRIu56vxb8X4rKjVa9sySUvSudTFRN63mZYl64cjDreeJXPGthAiGO15+ckZLBTtQT1d5S02tVZKKSHU6hxVU0oSc3qmCevWpMIOXifG+vmuAlw4SIC4b5jME9fxT3Nzh8UdtxhY88lVD97RYh4t0qc8hV0f1dQfjdscNpS7+ilqRumgEkkwFmuTh0iCw2Pha5BqOhKMQ25wAoO0pAbYSaDJ5aYkEWwZgkA23nQMt3Ivigl0AwUXe8KhyOCfIeIifVE60HnkBuMvIq8f1abBaBhA9jChoZ1PrwHcJfR5Xxk08RVoEDbZ1y7ik4gK7YjIG4KY3vN8muaXSFZdrUOdP/4WSX5dUCHWvzTOUhpNFW+mwWzMG5+vY=]]></Encrypt>
</xml>
使用xml2js库将xml文本转换为js对象
router.post('/', (req, res) => {
let xml = ''
// req.on监听data事件,收集微信传送过来的每一个数据包
req.on('data', chunk => xml += chunk)
// 接收完成即触发end事件
req.on('end', () => {
console.log(xml)
xml2js(xml, (err, xmlInfo) => {
if(err) return res.send('')
console.log(xmlInfo)
res.send('')
})
})
})
// xml打印信息:
{ xml:
{ ToUserName: [ 'gh_51541af0b45e' ],
FromUserName: [ 'oIQtJ1LKg4JkVnW_CACOIGazXWRw' ],
CreateTime: [ '1566469267' ],
MsgType: [ 'text' ],
Content: [ '1' ],
MsgId: [ '22426448456329148' ],
Encrypt:
[ 'FngV/F+uel+fiFmkw7hXCiEpHgFwMq/lAx/urkCbwkgGEMJsALECIpRJ1G9HY4HEoHEqE7yZbG5qPN4oobBgrSderAE1wntmXQGNULoviY4XJFzLhyR+wBKLrqKaxyXIT3WsN2LSXPSsmrgV0cJ0VlflgIuBVjbr/2MMuHnxS3J3u1GHj2fS/9RX9PJ1jGNyKxEl5XgH2XNxsMMtDwKQ1kuxE15UJLchRsHz913v1LDsdbgzxgFtybsnaD6pQOCexYlhHgDztK5bC7UmcGPUOjM/74wOr7SMRPb1dZt/C8hSEPpbzfow6WzdwMqJVONBmYhsqWEYNvSSz/g+jlvefiiIfYNnATuEQDqzNbLt5Vh3obsPqpDTRu3P5vZWRVQFRuIXgQ+fM9ndmlQxQQz+U36aYyhQIp6IG0Y2xthk3mM=' ] } }
进一步改进,回复用户消息:
这里有一个巨坑要注意一下:ToUserName与FromUserName这两个字段注意使用场景,在我们后端开发ToUserName是接收到的FromUserName,反之FromUserName填写的是ToUserName!!!
其他坑参考链接:https://blog.csdn.net/fanrenxiang/article/details/80877600
router.post('/', (req, res) => {
let xml = ''
// req.on监听data事件,收集微信传送过来的每一个数据包
req.on('data', chunk => xml += chunk)
// 接收完成即触发end事件
req.on('end', () => {
xml2js(xml, (err, xmlInfo) => {
if(err) return res.send('')
console.log(xmlInfo)
let {ToUserName, FromUserName, CreateTime, MsgType} = xmlInfo.xml
console.log(ToUserName[0], FromUserName[0], parseInt(CreateTime[0]), MsgType[0])
res.send(`
<xml>
<ToUserName><![CDATA[${FromUserName[0]}]]></ToUserName> // 巨坑
<FromUserName><![CDATA[${ToUserName[0]}]]></FromUserName> // 巨坑
<CreateTime>${parseInt(CreateTime[0])}</CreateTime>
<MsgType><![CDATA[${MsgType[0]}]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
`)
})
})
})









网友评论