首先需要在微信公众平台 - 基础设置 - 设置服务器地址
配置服务器地址时可能出现“参数错误,。。。。”的情况,可能是因为域名被拦截,不能使用。
如果前端人员进行测试,可以使用ngrok,花生壳等工具实现内网穿透,将ip暴露出去,本人觉得花生壳相对稳定,推荐使用,但是需要花钱开通……
配置好服务器地址等信息,提交成功,点击启用完成服务器配置
接入接口 实际上是微信公众平台get请求填写的地址,并传signature, timestamp, nonce, echostr 四个参数,node接收到四个参数,需要对signature进行校验,并且原样返回echostr参数内容,即可接入完成。
// 简单接入,没有进行校验
router.get('/', async (ctx, next) => {
var query = ctx.request.query;
var echostr = query.echostr ? query.echostr : '';
ctx.body = echostr
})
回复消息,分为关注后自动回复以及粉丝向公众号发消息时的回复等等情况
实际上都是微信服务器post请求配置好的服务器地址,并传入xml格式的数据,格式如下:
// 关注后的xml格式
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType>< ![CDATA[event] ]></MsgType>
<Event>< ![CDATA['subscribe'] ]></Event>
<MsgId>1234567890123457</MsgId>
</xml>
// 接受消息时的xml格式
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType>< ![CDATA[text] ]></MsgType>
<Content>< ![CDATA[粉丝发送的消息] ]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
后台接收xml格式的数据,完成相应操作即可。
但node本身并不能处理xml格式的文件,所以使用koa-xml-body来解析xml,在app.js中配置如下即可使用:
const xmlParser = require('koa-xml-body');
app.use(xmlParser());
{
xml:{
ToUserName:[' '],
FromUserName: [' '],
....
}
}
router.post('/', async (ctx, next) => {
const xml = ctx.request.body;
const createTime = Date.parse(new Date());
const msgType = xml.xml.MsgType[0];
const toUserName = xml.xml.ToUserName[0];
const toFromName = xml.xml.FromUserName[0];
const event = xml.xml.Event ? xml.xml.Event[0] : '';
if(msgType == 'event' && event == 'subscribe'){ //关注后
ctx.body = `<xml>
<ToUserName><![CDATA[${toFromName}]]></ToUserName>
<FromUserName><![CDATA[${toUserName}]]></FromUserName>
<CreateTime>${createTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[欢迎关注陈小皮公众号,下面请开始你的表演!]]></Content>
</xml>`;
}else{//其他情况
ctx.body = `<xml>
<ToUserName><![CDATA[${toFromName}]]></ToUserName>
<FromUserName><![CDATA[${toUserName}]]></FromUserName>
<CreateTime>${createTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[啊~啊~啊~你在发什么消息?]]></Content>
</xml>`;
}
});