首先实现这个功能有2种方法:
1、微信公众号管理员直接在后台设置自动回复(这个只能设置固定的回复);
2、如果我们需要根据用户发送的消息查询动态的数据并回复,就只能通过代码实现自定义的回复了;
测试:我们首先需要一个测试微信测试账号(微信测试账号看开通请看:申请微信测试账号)
其次我们需要有个能让外网访问的地址(我这边使用的是内网穿透工具,natapp,详细请点击这边)
1、我们已经通过natapp将地址进行了如下映射:http://g5awc9.natappfree.cc -> 127.0.0.1:8084
2、配置服务器地址
接下来我们需要在微信管理平台中配置这个域名(官网教程https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html):
node代码实现如下:
import sha1 from 'node-sha1';
let token = 'wechat';
const {signature, timestamp, nonce, echostr} = req.query;
// 将token、timestamp、nonce三个参数进行字典序排序
const arrSort = [token, timestamp, nonce];
arrSort.sort();
// 将三个参数字符串拼接成一个字符串进行sha1加密,npm install --save sha1
const str = arrSort.join('');
const shaStr = sha1(str);
// 获得加密后的字符串可与signature对比,验证标识该请求来源于微信服务器
if (shaStr === signature) {
// 确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效
res.send(echostr);
} else {
// 否则接入失败。
res.send('no');
}
3、定义自定义回复
当客户跟微信公众号交互时我们,微信会将消息转发到我们上面配置的服务器上,用户消息(post请求,认证:get请求)官网说明:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html
我们要解析微信的数据,我们需要安装这个包npm install xml2js
let dataStr = '';
req.on('data', function (str) {
dataStr = dataStr + str;
}).on('end', function () {
xml2js.parseString(dataStr, {trim: true}, (err, content) => {
res.send(JsonToXml(content.xml));
});
});
收到的文本消息示例(content.xml)
图片消息表示例(content.xml):
这边暂时做的一个自动回复,直接回复用户发送的信息:(只处理了文本信息与图片信息,其他的类似)
let JsonToXml = function (json) {
if (json.MsgType.join('') === 'text') { // 文本
return `<xml>
<ToUserName><![CDATA[${json.FromUserName[0]}]]></ToUserName>
<FromUserName><![CDATA[${json.ToUserName[0]}]]></FromUserName>
<CreateTime>${json.CreateTime[0]}</CreateTime>
<MsgType><![CDATA[${json.MsgType}]]></MsgType>
<Content><![CDATA[${json.Content.join(',')}]]></Content>
</xml>`;
} else if (json.MsgType.join('') === 'image') { // 图片
return `<xml>
<ToUserName><![CDATA[${json.FromUserName[0]}]]></ToUserName>
<FromUserName><![CDATA[${json.ToUserName[0]}]]></FromUserName>
<CreateTime>${json.CreateTime[0]}</CreateTime>
<MsgType><![CDATA[${json.MsgType}]]></MsgType>
<Image>
<MediaId><![CDATA[${json.MediaId.join('')}]]></MediaId>
</Image>
</xml>`;
}
};