egg 微信公众号开发之,接收text/xml数据

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值