采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
有道友有一样的问题吗?
文档在这里:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453&token=&lang=zh_CN
看了下,应该是微信第一次的 post 信息,你没回复,它就重复推送了一次。
什么意思呢,我们以 点出菜单的 弹出系统拍照为例,点击了拍照。它会 post 过来一个 Image 的事件,需要对这个事件作出响应,如果不响应,它就会 post 过来第二次。
reply.js 里面,就要这样处理:
if(message.MsgType === 'image'){ this.body = '哈哈你需要对各种 MsgType 单独处理' } else if(message.MsgType === 'event'){ if(message.Event === 'subscribe'){ if(message.EventKey){ console.log('扫二维码进来'+message.EventKey + ' '+ message) }
其他的也是同理,对于是 event 的,要加一个 else 处理,无论怎样的 post 消息,都要给予回复,回复的内容可以自己定义。不然都会出现这个重复推送
为什么贴上来的代码是格式是乱的呢?
到 wechat.js 里面,找到 75 行的样子:
Wechat.prototype.fetchAccessToken = function(data){ var that =this if(this.access_token && this.expires_in){ if(this.isValidAccessToken(this)){ return Promise.resolve(this) } } this.getAccessToken()
在 this.getAccessToken() 前面加上 return 试试
g.js 'use strict' var sha1 = require('sha1') var getRawBody = require('raw-body') var Wechat = require('./wechat') var util = require('./util') module.exports = function(opts,handler){ var wechat = new Wechat(opts) return function* (next){ 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 }) //console.log(data.toString()) var content = yield util.parseXMLAsync(data) console.log(content) var message = util.formatMessage(content.xml) console.log(message) this.weixin = message yield handler.call(this,next) wechat.reply.call(this) } } } util.js 'use strict'var xml2js = require('xml2js')var Promise = require('bluebird')var tpl =require('./tpl')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 = formatMessageexports.tpl = function(content,message){ var info = {} var type = 'text' var fromUserName = message.FromUserName var toUserName = message.ToUserName if(Array.isArray(content)){ type = 'news' } type = content.type||type info.content = content info.createTime = new Date().getTime() info.msgType = type info.toUserName = fromUserName info.fromUserName = toUserName return tpl.compiled(info)}
登录后可查看更多问答,登录/注册