Eggjs 与微信公众平台 (Wechat) 对接之不得不说

最近在开发一个项目是用的 eggjs 同时又需要对接到微信公众平台,所以记录下自己 Egg 对接微信的过程

验证 Token

我们知道在微信开发时都需在公众开发配置中对 Token 验证一次,接下来谈谈验证的步骤

第一步确定验证 URL

比如我的是 https://www.jakehu.me/wechat,那么先对 eggjs 路由改造

1
2
3
4
5
// app/router.js

module.exports = app => {
app.router.get('/wechat', app.controller.wechat.index);
};

改造完路由后我们还必须对安全这块进行设置,屏蔽对路由 /wechatcsrf 验证

1
2
3
4
5
6
7
// config/config.default.js

config.security = {
csrf: {
ignore: '/wechat',
},
};

第二步编写验证 Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// app/controller/wechat.js

async index () {
const query = this.ctx.request.query;
const signature = query.signature;
const timestamp = query.timestamp;
const nonce = query.nonce;
const echostr = query.echostr;
   if (await this.check(timestamp, nonce, signature, 'token')) {
this.ctx.body = echostr;
} else {
this.ctx.body = 'It is not from weixin';
}
}

async check (timestamp, nonce, signature, token) {
const tmp = [ token, timestamp, nonce ].sort().join('');
const currSign = crypto.createHash('sha1').update(tmp).digest('hex');
return (currSign === signature);
}

然后就可以在开发者配置进行验证就好了

注:上面代码中的 token 即为你在开发者配置页面中填写的 token

接入开发

第一步安装必要组件

这里我们用到了 co-wechat 插件

1
npm i co-wechat -s

安装后对插件进行配置

1
2
3
4
5
6
7
// config/config.default.js

config.wechat = {
token: 'token',
appid: 'appid',
encodingAESKey: 'encodingAESKey',
};

编写对接代码

首先是 Controller 的编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// app/controller/wechat.js

const wechat = require('co-wechat');
module.exports = app => {
class WechatController extends app.Controller { }

// 因为 Egg 需要用类的形式来组织,而 wechat 是通过 middleware 方法来生成中间件
WechatController.prototype.wechat = wechat({
token: 'token',
appid: 'appid',
encodingAESKey: 'encodingAESKey',
}).middleware(async (message, ctx) => {
console.log(message);
return { type: 'text', content: 'Hello world!' };
});

return WechatController;
};

其次我们对路由再进行改造

1
2
3
4
5
// app/router.js

module.exports = app => {
app.router.post('/wechat', app.controller.wechat.wechat);
};

到此就结束了,完美对接!!!


完美对接!!!