微信公共平台消息接口服务中间件:wechat
jopen
10年前
微信公共平台消息接口服务中间件与API SDK
功能列表
- 自动回复(文本、图片、语音、视频、音乐、图文)
- 发送客服消息(文本、图片、语音、视频、音乐、图文)
- 菜单操作(查询、创建、删除)
- 二维码(创建临时、永久二维码,查看二维码URL)
- 分组操作(查询、创建、修改、移动用户到分组)
- 用户信息(查询用户基本信息、获取关注者列表)
- 媒体文件(上传、获取)
- 等待回复(用于调查问卷、问答等场景)
- 会话支持(创新功能)
- OAuth API(授权、获取基本信息)
- 群发消息(文本、图片、语音、视频、图文)
- 客服记录
- 群发消息
- 公众号支付(发货通知、订单查询)
- 微信小店(商品管理、库存管理、邮费模板管理、分组管理、货架管理、订单管理、功能接口)
详细参见API文档
Installation
npm install wechat
Use with Connect/Express
var wechat = require('wechat'); app.use(connect.query()); // Or app.use(express.query()); app.use('/wechat', wechat('some token', function (req, res, next) { // 微信输入信息都在req.weixin上 var message = req.weixin; if (message.FromUserName === 'diaosi') { // 回复屌丝(普通回复) res.reply('hehe'); } else if (message.FromUserName === 'text') { //你也可以这样回复text类型的信息 res.reply({ content: 'text object', type: 'text' }); } else if (message.FromUserName === 'hehe') { // 回复一段音乐 res.reply({ type: "music", content: { title: "来段音乐吧", description: "一无所有", musicUrl: "http://mp3.com/xx.mp3", hqMusicUrl: "http://mp3.com/xx.mp3" } }); } else { // 回复高富帅(图文回复) res.reply([ { title: '你来我家接我吧', description: '这是女神与高富帅之间的对话', picurl: 'http://nodeapi.cloudfoundry.com/qrcode.jpg', url: 'http://nodeapi.cloudfoundry.com/' } ]); } }));
备注:token在微信平台上申请
回复消息
当用户发送消息到微信公众账号,自动回复一条消息。这条消息可以是文本、图片、语音、视频、音乐、图文。详见:官方文档
回复文本
res.reply('Hello world!'); // 或者 res.reply({type: "text", content: 'Hello world!'});
回复图片
res.reply({ type: "image", content: { mediaId: 'mediaId' } });
回复语音
res.reply({ type: "voice", content: { mediaId: 'mediaId' } });
回复视频
res.reply({ type: "video", content: { mediaId: 'mediaId', thumbMediaId: 'thumbMediaId' } });
回复音乐
res.reply({ title: "来段音乐吧", description: "一无所有", musicUrl: "http://mp3.com/xx.mp3", hqMusicUrl: "http://mp3.com/xx.mp3" });
回复图文
res.reply([ { title: '你来我家接我吧', description: '这是女神与高富帅之间的对话', picurl: 'http://nodeapi.cloudfoundry.com/qrcode.jpg', url: 'http://nodeapi.cloudfoundry.com/' } ]);
WXSession支持
由于公共平台应用的客户端实际上是微信,所以采用传统的Cookie来实现会话并不现实,为此中间件模块在openid的基础上添加了Session支持。一旦服务端启用了connect.session
中间件,在业务中就可以访问req.wxsession
属性。这个属性与req.session
行为类似。
app.use(connect.cookieParser()); app.use(connect.session({secret: 'keyboard cat', cookie: {maxAge: 60000}})); app.use('/wechat', wechat('some token', wechat.text(function (info, req, res, next) { if (info.Content === '=') { var exp = req.wxsession.text.join(''); req.wxsession.text = ''; res.reply(exp); } else { req.wxsession.text = req.wxsession.text || []; req.wxsession.text.push(info.Content); res.reply('收到' + info.Content); } })));
req.wxsession
与req.session
采用相同的存储引擎,这意味着如果采用redis作为存储,这样wxsession
可以实现跨进程共享。
等待回复
等待回复,类似于电话拨号业务。该功能在WXSession的基础上提供。需要为等待回复预置操作,中间件将其抽象为List
对象,在提供服务前需要添加服务。
var List = require('wechat').List; List.add('view', [ ['回复{a}查看我的性别', function (info, req, res) { res.reply('我是个妹纸哟'); }], ['回复{b}查看我的年龄', function (info, req, res) { res.reply('我今年18岁'); }], ['回复{c}查看我的性取向', '这样的事情怎么好意思告诉你啦- -'] ]);
然后在业务中触发等待回复事务,如下示例,当收到用户发送list
后,调用res.wait('view')
进入事务view
中。
var app = connect(); app.use(connect.query()); app.use(connect.cookieParser()); app.use(connect.session({secret: 'keyboard cat', cookie: {maxAge: 60000}})); app.use('/wechat', wechat('some token', wechat.text(function (info, req, res, next) { if (info.Content === 'list') { res.wait('view'); } else { res.reply('hehe'); // 或者中断等待回复事务 // res.nowait('hehe'); } })));
用户将收到如下回复:
回复a查看我的性别 回复b查看我的年龄 回复c查看我的性取向
用户回复其中的a
、b
、c
将会由注册的方法接管回复。回复可以是一个函数,也可以是一个字符串:
List.add('view', [ ['回复{a}查看我的性别', function (info, req, res, next) { res.reply('我是个妹纸哟'); }], // 或者字符串 ['回复{c}查看我的性取向', '这样的事情怎么好意思告诉你啦- -'] ]);
如果用户触发等待回复事务后,没有按照{}
中的进行回复,那么将会由原有的默认函数进行处理。在原有函数中,可以选择调用res.nowait()
中断事务。nowait()
除了能中断事务外,与reply
的行为一致。