node.js koa实现公众号获取验证码 网页登录

#其它  2个月前   阅读/97

简单实现一个公众号获取验证码网页输入验证码登录获取基本信息

2b6a156648f86f6478e3153cbc9ad72.png
image.png
1.注册微信公众号
2.获取测试账号->开发的时候用 公众平台测试账号
image.png
3.填写接口配置信息->提交 (我这里用的钉钉工具做的本地代理)
image.png
钉钉工具内网穿透
新建文件validateToken.js这个就是接口配置信息校验

var config = require('./config'); var crypto = require("crypto"); // 加密方法 function sha1(str) { var md5sum = crypto.createHash("sha1"); md5sum.update(str); str = md5sum.digest("hex"); return str; } // 验证tonken function validateToken(req) { return new Promise((resolve, reject) => { let query = req.query; let signature = query.signature; let echostr = query["echostr"]; let timestamp = query["timestamp"]; let nonce = query["nonce"]; let oriArray = new Array(); oriArray[0] = nonce; oriArray[1] = timestamp; oriArray[2] = config.wechat.token; // 这里是在公众号接口配置信息里面填写的Token oriArray.sort(); let original = oriArray.join(""); let scyptoString = sha1(original); if (signature == scyptoString) { // 验证通过,返回 echostr resolve(echostr); } else { reject(false); } }); } // 导出验证 Tonken 的发放 module.exports = validateToken;

然后routes新建wx.js

// 接口配置信息 const validateToken = require("../wechat/validateToken"); router.get('/', async (ctx) => { // 微信校验 接口配置信息 validateToken(ctx).then((t) => { ctx.body = t }); await next() }) module.exports = router.routes();

上面对应的就是接口配置信息里面的http://xx.vaiwan.com/api/wx

4.创建菜单 (菜单需要token)
后面内容写到post里面

router.post('/', async (ctx, next) => { .... })

获取token

// 获取access_token request({ timeout: 5000, // 设置超时 method: 'GET', //请求方式 url: config.url+'/token', qs: { //参数,注意get和post的参数设置不一样 grant_type: "client_credential", appid: config.appid, secret: config.appsecret } }, function (error, response, body) { if (!error && response.statusCode == 200) { body = JSON.parse(body); if (body.access_token) { var token = body.access_token; canback(token) } else { canback('') } } else { canback('') } });

创建菜单

// 菜单 var btn = { "button": [{ //一级菜单 "type": "click", "name": "一键登录", "key": "V1001_LOGIN" }, ] } request({ timeout: 5000, // 设置超时 method: 'POST', //请求方式 url: config.url+'/menu/create?access_token=' + token, headers: { 'Content-Type': 'application/x-www-form-urlencoded' },form: JSON.stringify(btn) },function (error, response, body) { if (!error && response.statusCode == 200) { console.log('body', body); } else { console.log("error"); } })

5.消息处理

// 消息处理 function messageProcessing() { // 接收到文本消息 var msgdata = {} if (msgType == 'text') { msgdata = { FromUserName: toFromName, ToUserName: toUserName, reply: `${content}`, }; ctx.body = msgTemplate.textMessage(msgdata) return } if (msgType == 'event') { if (event == 'CLICK') { // 创建用户 createUser() // 发送验证码 sendCode('click') } else { //关注 if (event == 'subscribe') { // 创建菜单 createMenu() // 创建用户 createUser() // 发送验证码 sendCode('subscribe') } } } if (msgType == 'image') { msgdata = { FromUserName: toFromName, ToUserName: toUserName, reply: `${content}`, }; ctx.body = msgTemplate.imageMessage(msgdata) } // 发送验证码 function sendCode(type) { let code = getuuid(6) createCode(code, toFromName, toUserName) let msg = type == 'click' ? ('验证码:' + code + '\n请在10分钟内登录[吃瓜]') : ('感谢关注导航站\n' + '验证码:' + code + '\n请在10分钟内登录[吃瓜]') var msgdata = { FromUserName: toFromName, ToUserName: toUserName, reply: msg }; ctx.body = msgTemplate.textMessage(msgdata) } } })

上面就是主要代码

主要有5个文件
app.js 入口文件
routes->wx.js //主要文件
wechat->config.js //配置文件
wechat->messageTemplate.js //消息模板
wechat->validateToken.js //接口配置信息校验

元芳,你怎么看?
加载中