经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » 微信开发 » 查看文章
node微信开发之获取access_token+自定义菜单
来源:jb51  时间:2019/3/18 8:39:54  对本文有异议

上一篇:自动回复的实现

这两天终于把获取access_token+自定义菜单+授权登录+获取用户信息部分完成了,nodejs其实不是很熟悉,所以估计有很多特性没用起来的,还有很多冗余代码以及各种问题,只能说功能实现了,大家多多担待吧。

获取access_token

因为调用所有公众号的接口都需要用到access_token,所以必须先将access_token缓存起来,方便以后使用,access_token的有效时间为2小时,所以需要定时更新,下面是代码实现。

有一点需要注意,本文会提到两个access_token,还有一个是oauth时会用到,所以大家不要搞混了。

access_token的获取

access_token的获取相对来说很简单了,就是请求一个链接附加参数得到access_token,代码如下:

  1. const getAccessToken = function () {
  2. let queryParams = {
  3. 'grant_type': 'client_credential',
  4. 'appid': config.appId,
  5. 'secret': config.appSecret
  6. };
  7.  
  8. let wxGetAccessTokenBaseUrl = 'https://api.weixin.qq.com/cgi-bin/token?'+qs.stringify(queryParams);
  9. let options = {
  10. method: 'GET',
  11. url: wxGetAccessTokenBaseUrl
  12. };
  13. return new Promise((resolve, reject) => {
  14. request(options, function (err, res, body) {
  15. if (res) {
  16. resolve(JSON.parse(body));
  17. } else {
  18. reject(err);
  19. }
  20. });
  21. })
  22. };

请求的三个参数也比较简洁:

参数 是否必须 说明
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,即appsecret

access_token的保存

保存有很多种方法,放在缓存里等,我这边是存放在一个文件里,因为仅仅是一个示例,定时7000s更新。

  1. //保存与更新
  2. const saveToken = function () {
  3. getAccessToken().then(res => {
  4. let token = res['access_token'];
  5. fs.writeFile('./token', token, function (err) {
  6. });
  7. })
  8. };
  9.  
  10. const refreshToken = function () {
  11. saveToken();
  12. setInterval(function () {
  13. saveToken();
  14. }, 7000*1000);
  15. };

这样access_token就能做到定时更新了,注意,如果不是测试好获取token的次数是有限制的,不过一般没什么问题,测试最好还是在测试号上进行。

自定义菜单

获取access_token后自定义菜单的实现就非常简单了,这里仅仅简单讲一下请求,具体菜单内容请看微信的文档。
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

但是body要带上菜单的内容,就是json数据,但是微信返回的数据是string类型,所以下面也要注意,可能在这边会遇到问题。简单代码如下:

  1. 'use strict';
  2. const fs = require('fs');
  3. const request = require('request');
  4.  
  5. //token,因为token是存在文件里的所以这里进行文件读取得到token
  6. const token = fs.readFileSync('./token').toString();
  7.  
  8. //常用type为view和click,分别为点击事件和链接
  9. var menus = {
  10. "button": [
  11. {
  12. "name": "测试菜单",
  13. "sub_button": [
  14. {
  15. "type": "view",
  16. "name": "授权登录",
  17. "url": "http://wuyrsp3tma.proxy.qqbrowser.cc/auth"
  18. }]
  19. }]
  20. };
  21.  
  22. function createMenu() {
  23. let options = {
  24. url: 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' + token,
  25. form: JSON.stringify(menus),
  26. headers: {
  27. 'Content-Type': 'application/x-www-form-urlencoded'
  28. }
  29. };
  30. request.post(options, function (err, res, body) {
  31. if (err) {
  32. console.log(err)
  33. }else {
  34. console.log(body);
  35. }
  36. })
  37. }
  38.  
  39. module.exports = createMenu;

这样在服务器启动的时候调用这个模块就可以创建一个简单的自定义菜单了:

好这部分就算结束了,本来想连着jssdk一起的但是那样就显得太长了,但是那部分代码已经完成了,所以大家可以自行看看代码。

github地址奉上:https://github.com/xiadd/shorthand 欢迎star

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号