前言:
学校有个小比赛,然后有个微信的东西,准备用nodejs搞一搞。原以为很简单,结果坑了。朴灵大大,写了wechat的API模块,其实是两个wechat和wechat-api,wechat主要是回复消息,wechat-api则是其他接口的封装。
参考开发模块:
GitHub (wechat): https://github.com/node-webot/wechat
Nodejs 微信API库(wechat-api):http://doxmate.cool/node-webot/wechat-api/api.html
开始:
首先申请了一个API这里有个token,按照官方的方法需要先验证这个东西,至于验证方法…原生的是
var crypto = require('crypto'); function sha1(str) { var md5sum = crypto.createHash('sha1'); md5sum.update(str); str = md5sum.digest('hex'); return str; } exports.tocked=function(req, res, next) { //微信得到返回后会通过你的认证 var query = req.query; var signature = query.signature; var echostr = query.echostr; var timestamp = query['timestamp']; var nonce = query.nonce; var oriArray = new Array(); oriArray[0] = nonce; oriArray[1] = timestamp; oriArray[2] = "sdsfd";//这里填写你的token oriArray.sort(); var original = oriArray[0]+oriArray[1]+oriArray[2]; console.log("Original Str:"+original); console.log("signature:"+signature); var scyptoString = sha1(original); if (signature == scyptoString) { res.send(echostr); }}
把这个写到路由的位置就OK了,通过这个认真,我们能通过API开发者资格的认真,但是wechat已经给封装了方法,就不用了那么麻烦了。
var config = { token: '********', appid: '***************' }; /* GET home page. */ module.exports=wechat(config, function (req, res, next) {}
把这个写入相应的路由,然后启动项目,点击微信开放平台上的验证token(PS:多点几下,腾讯有时会抽风);当验证成功我们就可以用官方的wechat例子进行测试了,注:每个请求当没有遇到res. reply()方法的时候会重复请求三次。 我们可以打印req.weixin这样我们就能方便的进行调试。
wechat的等待回复功能不能启用,如果你使用rides的话WXSession,最好看好接口文档,否则怎么死的都不知道
菜单:
创建菜单需要使用wechat-api这个模块,二话不说直接上码。
var wechatApi=require('wechat-api'); var fs=require('fs'); var iconv=require('iconv-lite'); var api = new wechatApi('wx310a9385514e6a69', 'fec50d83a22c77d2414d931affe3baf9'); exports.createMenu=function(){ var menu1=fs.readFileSync('routes/yourapi/menu.json'); var c=iconv.decode(menu1,'utf-8'); api.createMenu(c, function(err, result){ console.log(result); }); } exports.removeMenu=function(){ api.removeMenu(); }
直接读进来,当出现用户收听事件的时候,创建菜单,如果要移除菜单可以,removemenu(),但是服务器有缓存,多触发几次事件就OK。