上一篇:自动回复的实现
这两天终于把获取access_token+自定义菜单+受权登陆+获取用户信息部分完成了,nodejs其实不是很熟悉,因此估计有不少特性没用起来的,还有不少冗余代码以及各类问题,只能说功能实现了,你们多多担待吧。node
由于调用全部公众号的接口都须要用到access_token,因此必须先将access_token缓存起来,方便之后使用,access_token的有效时间为2小时,因此须要定时更新,下面是代码实现。
有一点须要注意,本文会提到两个access_token,还有一个是oauth时会用到,因此你们不要搞混了。git
access_token的获取相对来讲很简单了,就是请求一个连接附加参数获得access_token,代码以下:github
const getAccessToken = function () { let queryParams = { 'grant_type': 'client_credential', 'appid': config.appId, 'secret': config.appSecret }; let wxGetAccessTokenBaseUrl = 'https://api.weixin.qq.com/cgi-bin/token?'+qs.stringify(queryParams); let options = { method: 'GET', url: wxGetAccessTokenBaseUrl }; return new Promise((resolve, reject) => { request(options, function (err, res, body) { if (res) { resolve(JSON.parse(body)); } else { reject(err); } }); }) };
请求的三个参数也比较简洁:json
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户惟一凭证 |
secret | 是 | 第三方用户惟一凭证密钥,即appsecret |
保存有不少种方法,放在缓存里等,我这边是存放在一个文件里,由于仅仅是一个示例,定时7000s更新。segmentfault
//保存与更新 const saveToken = function () { getAccessToken().then(res => { let token = res['access_token']; fs.writeFile('./token', token, function (err) { }); }) }; const refreshToken = function () { saveToken(); setInterval(function () { saveToken(); }, 7000*1000); };
这样access_token就能作到定时更新了,注意,若是不是测试好获取token的次数是有限制的,不过通常没什么问题,测试最好仍是在测试号上进行。api
获取access_token后自定义菜单的实现就很是简单了,这里仅仅简单讲一下请求,具体菜单内容请看微信的文档。
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
可是body要带上菜单的内容,就是json数据,可是微信返回的数据是string类型,因此下面也要注意,可能在这边会遇到问题。简单代码以下:缓存
'use strict'; const fs = require('fs'); const request = require('request'); //token,由于token是存在文件里的因此这里进行文件读取获得token const token = fs.readFileSync('./token').toString(); //经常使用type为view和click,分别为点击事件和连接 var menus = { "button": [ { "name": "测试菜单", "sub_button": [ { "type": "view", "name": "受权登陆", "url": "http://wuyrsp3tma.proxy.qqbrowser.cc/auth" }] }] }; function createMenu() { let options = { url: 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' + token, form: JSON.stringify(menus), headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; request.post(options, function (err, res, body) { if (err) { console.log(err) }else { console.log(body); } }) } module.exports = createMenu;
这样在服务器启动的时候调用这个模块就能够建立一个简单的自定义菜单了:服务器
好这部分就算结束了,原本想连着jssdk一块儿的可是那样就显得太长了,可是那部分代码已经完成了,因此你们能够自行看看代码。
github地址奉上:https://github.com/xiadd/shorthand 欢迎star?微信