egg开发微信公众号的时候,发现post接收不到数据;最后发现传过来的content-type = text/xml,那我们如何才能获取xml数据呢
接收xml
// 覆盖egg自带的配置 使支持接收xml参数
config.bodyParser = {
enable: true,
encoding: 'utf8',
formLimit: '100kb',
jsonLimit: '100kb',
strict: true,
// @see https://github.com/hapijs/qs/blob/master/lib/parse.js#L8 for more options
queryString: {
arrayLimit: 100,
depth: 5,
parameterLimit: 1000
},
enableTypes: ['json', 'form', 'text'],
extendTypes: {
text: ['text/xml', 'application/xml']
}
};
然后就可以正常获取到xml数据了
改了以后,post提交的xml数据,通过ctx.request.body就能拿到
处理微信公众号发来的xml
关注、取消关注相关的业务逻辑代码。这里我使用了xml2js将xml转成对象和js-sha1来生成sha1加密字符串
const XMLJS = require('xml2js');
const sha1 = require('js-sha1');
// 解析URL里的参数
const params = this.ctx.request.query;
// 微信传来的加密字符串
const signature = params.signature;
// 根据传来的其他值计算加密字符串
const timestamp = params.timestamp;
const nonce = params.nonce;
const token = 'weixin'; // 这是在公众平台上自己设置的
const array = [ token, timestamp, nonce ];
array.sort();
const scyptoString = sha1(array.join(''));
// 比对两个加密字符串是否相等,相等则为微信官方传来的信息
if (scyptoString === signature) {
// 获取请求内的xml参数
let data = ctx.request.body;
// 将xml解析
XMLJS.parseString(data.toString(), (err, result) => {
if (result) {
const event = result.xml.Event[0];
if (event === 'subscribe') {
// 订阅,获取用户基本信息存入订阅表,建议使用非同步写法以加快response
this.ctx.service.wechat.saveSubscibeUser(result.xml.FromUserName[0]);
} else if (event === 'unsubscribe') {
// 取消订阅
this.ctx.service.wechat.deleteSubscibeUser(result.xml.FromUserName[0]);
}
}
});
}
// 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试
if (params.echostr) {
// 用于通过微信验证
this.ctx.body = params.echostr;
} else {
this.ctx.body = '';
}
自动回复微信xml格式数据
const XMLJS = require('xml2js');
var obj = {
ToUserName: result.xml.FromUserName[0],
FromUserName: result.xml.ToUserName[0],
CreateTime: Number.parseInt(new Date().getTime() / 1000),
MsgType: 'text',
Content: '你好'
};
var builder = new XMLJS.Builder();
var xml = builder.buildObject(obj);
xml = xml.replace(/root/g,'xml');
this.logger.info(xml);
ctx.set('content-type', 'text/xml');
this.ctx.body = xml;
微信的其他事件推送:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454