自动回复失败,命令行也看不到打印出的xml数据,(win10下QQ 浏览器代理调试端口)代码如下:

来源:

gyuntong

2016-06-01

'use strict'
//g.js
var sha1 = require('sha1');
var getRawBody = require('raw-body')
var Wechat = require('./wechat')
var util = require('./util')

module.exports = function(opts) {
	var wechat = new Wechat(opts)
	return function*(next) {
		console.log('this.query')
		var that = this
		var token = opts.token
		var signature = this.query.signature
		var nonce = this.query.nonce
		var timestamp = this.query.timestamp
		var echostr = this.query.echostr
		var str = [token, timestamp, nonce].sort().join('')
		var sha = sha1(str)

		if (this.method === 'GET') {

			if (sha === signature) {
				this.body = echostr + ''
			} 
			else {
				this.body = 'wrong'
			}
		} 
		else if (this.method === 'POST') {
			if (sha !== signature) {
				this.body = 'wrong'
				return false
			}

			var data = yield getRawBody(this.req, {
				length: this.length,
				limit: '1mb',
				encoding: this.charset
			})

			
			var content = yield util.parseXMLAsync(data)
			console.log(content)

			var message=util.formatMessage(content.xml)
			console.log(message)

			if (message.MsgType==='event') {
				if (message.Event==='subscribe') {
					var now = new Date().getTime()

					that.status =200
					that.type ='application/xml'
					that.body ='<xml>'+ 
								'<ToUserName><![CDATA['+message.FromUserName+']]></ToUserName>'+ 
								'<FromUserName><![CDATA['+message.ToUserName+']]></FromUserName>'+ 
								'<CreateTime>'+now+'</CreateTime>'+
								'<MsgType><![CDATA[text]]></MsgType>'+
								'<Content><![CDATA[你好!这里是慕课网]]></Content>'+ 
								
								'</xml>'
					return			 
				}
			}
		}
	}
}
'use strict'
//util.js
var xml2js = require('xml2js')
var Promise = require('bluebird')

exports.parseXMLAsync = function(xml) {
	return new Promise(function(resolve, reject) {
		xml2js.parseString(xml, {trim: true}, function(err, content) {
			if (err) reject(err)
			else reslove(content)
		})

	})
}

function formatMessage(result) {
	var message = {}

	if (typeof result === 'object') {
		var keys = object.keys(result)
		for (var i = 0; i < keys.length; i++) {
			var item = result[keys[i]]
			var key = keys[i]
			if (!(item instanceof Array) || item.length === 0) {
				continue
			}

			if (item.length === 1) {
				var val = item[0]
				if (typeof val ==='object') {
					message[key]=formatMessage(val)
				} 
				else {
					message[key] = (val||'').trim()
				}
			} 
			else {
				message[key] = []

				for (var j = 0,k = item.length; j < k;  j++) {
					message[key].push(formatMessage(item[j]))
				}
			}
		}
	}

	return message
}
exports.formatMessage = formatMessage

exports.formatMessage = function(xml) {
	return new Promise(function(resolve, reject) {
		xml2js.parseString(xml, {trim: true}, function(err, content) {
			if (err) reject(err)
			else reslove(content)
		})

	})
}
'use strict'
//wechat.js
var Promise = require('bluebird')
var request = Promise.promisify(require('request'))

var prefix = 'https://api.weixin.qq.com/cgi-bin/'
var api = {
	accessToken: prefix + 'token?grant_type=client_credential'
}

function Wechat(opts) {
	var that = this
	this.appID = opts.appID
	this.appSecret = opts.appSecret
	this.getAccessToken = opts.getAccessToken
	this.saveAccessToken = opts.saveAccessToken

	this.getAccessToken()
		.then(function(data) {
			try {
				data = JSON.parse(data)
			} catch (e) {
				return that.updateAccessToken()
			}

			if (that.isValidAccessToken(data)) {
				return Promise.resolve(data)
			} else {
				return that.updateAccessToken()

			}
		})
		.then(function(data) {
			that.access_token = data.access_token
			that.expires_in = data.expires_in
			that.saveAccessToken(data)
		})

}
Wechat.prototype.isValidAccessToken = function(data) {
	if (!data || !data.access_token || !data.expires_in) {
		return false
	}
	var access_token = data.access_token
	var expires_in = data.expires_in
	var now = (new Date().getTime())

	if (now < expires_in) {
		return true
	} else {
		return false
	}
}


Wechat.prototype.updateAccessToken = function() {
	var appID = this.appID
	var appSecret = this.appSecret
	var url = api.accessToken + '&appid=' + appID + '&secret=' + appSecret

	return new Promise(function(resolve, reject) {
		request({
			url: url,
			json: true
		}).then(function(response) {
			//
			var data = response.body
			var now = (new Date().getTime())
			var expires_in = now + (data.expires_in - 20) * 1000

			data.expires_in = expires_in

			resolve(data)

		})
	})
}

module.exports = Wechat;
'use strict'
//app.js
var Koa = require('koa');
var path = require('path')
var wechat = require('./wechat/g')
var util = require('./libs/util')
var wechat_file = path.join(__dirname,'./config/wechat.txt')

var config = {
	wechat:{
		appID:'wx4b9d6607322760b8',
		appSecret:'1d7bac3f84cc53e3cdb455a1c657172d',
		token:'qbtest',

		getAccessToken:function(){ 
			return util.readFileAsync(wechat_file) 
		},
	    saveAccessToken: function(data){
	    	data = JSON.stringify(data)
		return util.writeFileAsync(wechat_file,data)
	    }
    }	
}

var app = new Koa();

app.use(wechat(config.wechat))

app.listen(4040)
console.log('listening:4040')


写回答

3回答

Scott

2016-06-01

第一个错误,resolve 拼错了,拼成了  reslove

exports.parseXMLAsync = function(xml) {
    return new Promise(function(resolve, reject) {
        xml2js.parseString(xml, {trim: true}, function(err, content) {
            if (err) reject(err)
            else reslove(content)
        })
 
    })
}

第二个错误,util.js 里面,多写了一个 formatMessage 把上面的给覆盖了。


exports.formatMessage = formatMessage
exports.formatMessage = function(xml) {
    return new Promise(function(resolve, reject) {
        xml2js.parseString(xml, {trim: true}, function(err, content) {
            if (err) reject(err)
            else reslove(content)
        })
    })
}


第三个错误,object.keys(result) 的 object 是大写了 Object,写错成了小写


function formatMessage(result) {
    var message = {}
    if (typeof result === 'object') {
        var keys = object.keys(result)


1
0

gyuntong

提问者

2016-06-01

改正了几个错误后还是没有解决问题,真的不知道是什么原因了

'use strict'
//util.js
var xml2js = require('xml2js')
var Promise = require('bluebird')

exports.parseXMLAsync = function(xml) {
	return new Promise(function(resolve, reject) {
		xml2js.parseString(xml, {trim: true}, function(err, content) {
			if (err) reject(err)
			else resolve(content)
		})

	})
}

function formatMessage(result) {
	var message = {}

	if (typeof result === 'object') {
		var keys = Object.keys(result)
		for (var i = 0; i < keys.length; i++) {
			var item = result[keys[i]]
			var key = keys[i]
			if (!(item instanceof Array) || item.length === 0) {
				continue
			}

			if (item.length === 1) {
				var val = item[0]
				if (typeof val ==='object') {
					message[key]=formatMessage(val)
				} 
				else {
					message[key] = (val||'').trim()
				}
			} 
			else {
				message[key] = []

				for (var j = 0,k = item.length; j < k;  j++) {
					message[key].push(formatMessage(item[j]))
				}
			}
		}
	}

	return message
}
exports.formatMessage = formatMessage


0
1
gyuntong
刚刚弄好了,这个用qq浏览器的服务器端调试功能就看不出回复的效果了,用localtunnel和ngrok都没问题
2016-06-02
共1条回复

gyuntong

提问者

2016-06-01

我真是太粗心了。谢谢老师

0
0

7天搞定Node.js微信公众号

Koa框架、ES2015新特性、MongoDB,开发微信公众号

1742 学习 · 787 问题

查看课程