nodejs 中koa框架下的微信公众号开发初始篇

最近在搞微信公众号开发,后端采用的是nodejs下的koa框架,初识后端的菜鸟,自己搞难度太大了,网上找了很多文章,采用的中间件大都是express框架下的,不过好在爬了许多坑之后总算看见点曙光了,遂把探索出来的一点东西拿出来分享,毕竟能力有限,拿出来也是希望大神看到了给点建议,

主要用 koa-wechat 处理验证和消息解析 ,用wechat-api来进行按钮组等api操作,刚开始没什么内容,大家随意看看就好,

废话不多说,直接上代码(这是一个route的代码):

var koa = require(‘koa‘),
  co = require(‘co‘),
  fs = require(‘fs‘),
  request = require(‘co-request‘);
var route = require(‘koa-route‘);
var WechatAPI = require(‘wechat-api‘);
var wechat = require(‘koa-wechat‘);

exports.init = function(app) {
  app.use(wechat({ token: ‘your token‘ }));
  app.use(route.post(‘/api/wechat‘, postFun));
}
//因为服务器多进程,故需要保存token到全局,其他参见wechat-api文档
var api = new WechatAPI(‘appid‘, ‘appsecret‘, function(callback) {
  // 传入一个获取全局token的方法
  fs.readFile(‘access_token.txt‘, ‘utf8‘, function(err, txt) {
    if (err) {
      return callback(err);
    }
    callback(null, JSON.parse(txt));
  });
}, function(token, callback) {
  // 请将token存储到全局,跨进程、跨机器级别的全局,比如写到数据库、redis等
  fs.writeFile(‘access_token.txt‘, JSON.stringify(token), callback);
});

var weixin = {
  appid: ‘appid‘,
  appsecret: ‘appsecret‘,
  prefix: ‘https://api.weixin.qq.com/cgi-bin/‘,
  mpPrefix: ‘https://mp.weixin.qq.com/cgi-bin/‘,
  fileServerPrefix: ‘http://file.api.weixin.qq.com/cgi-bin/‘,
  payPrefix: ‘https://api.weixin.qq.com/pay/‘,
  merchantPrefix: ‘https://api.weixin.qq.com/merchant/‘,
  customservicePrefix: ‘https://api.weixin.qq.com/customservice/‘
}
//这里是在最初的时候运行下创建一个‘access_token.txt,(因为在设置token为全局后总是不成功,怀疑初始化没有获取token)有更好的办法可以交流
function* getAccessToken() {
  console.log("getAccessToken start");
  var url = weixin.prefix + ‘token?grant_type=client_credential&appid=‘ + weixin.appid + ‘&secret=‘ + weixin.appsecret;
  var response = yield request.get(url);
  var result = JSON.parse(response.body);
  console.log(‘result‘, result);
  weixin.token = result.access_token;
  console.log("token", weixin.token);
  return weixin.token;
}

function* postFun(next) {
  console.log("**************postFun***********");
  var info = this.req.body
  console.log("postFun info", info);
  console.log("info raw", info.raw);
  if (info.type === ‘text‘) {
    if (info.raw.Content == ‘你好‘) {
      this.body = {
        content: ‘你好‘,
        type: ‘text‘
      }
    } else {
      this.body = {
        type: "music",
        content: {
          title: "什么都不说了,来段音乐吧",
          description: "一路上有你",
          musicUrl: "http://www.xxxxx.com/yilushangyouni.mp3",
          hqMusicUrl: "http://www/yilushangyouni.mp3",
          thumbMediaId: "thisThumbMediaId"
        }
      }
    }
  } else if (info.type === ‘event‘) {
    if (info.raw.Event === ‘subscribe‘) { //添加关注事件
      console.log("用户:" + info.uid + "新添加了关注");
      this.body = {
        content: ‘你好,欢迎‘,
        type: ‘text‘
      };
    } else {
      console.log(‘event::‘, info.raw);
    }
  } else {//经试验这个是有问题的,实际是没法播放的,估计是需要上传到微信服务器
    this.body = {
      type: "music",
      content: {
        title: "什么都不说了,来段音乐吧",
        description: "一路上有你",
        musicUrl: "http://sc.111ttt.com/up/mp3/239837/2DF7A5657F60BE1DEF33B8DC3EA42492.mp3",
        hqMusicUrl: "http://sc.111ttt.com/up/mp3/239837/2DF7A5657F60BE1DEF33B8DC3EA42492.mp3",
        thumbMediaId: "thisThumbMediaId"
      }
    }
  }
  console.log("************** postFun end ***********");
}
var menu = {
  "button": [{
    "name": "父按钮",
    "sub_button": [{
      "type": "view",
      "name": "子按钮",
      "url": "http://www."
    }, {
      "type": "view",
      "name": "子按钮",
      "url": "http://www."
    }, {
      "type": "view",
      "name": "子按钮",
      "url": "http:/"
    }]
  }, {
    "name": "父按钮",
    "sub_button": [{
      "type": "view",
      "name": "子按钮",
      "url": "http:"
    }, {
      "type": "view",
      "name": "子按钮",
      "url": "http:"
    }]
  }, {
    "name": "父按钮",
    "sub_button": [{
      "type": "view",
      "name": "关于我",
      "url": "http:"
    }, {
      "type": "view",
      "name": "遇到我",
      "url": "http:"
    }, {
      "type": "view",
      "name": "联系我们",
      "url": "http:"
    }]
  }]
}
//创建菜单函数,只为了试验有效性,更多API参考官方文档
function* appMenu() {
  console.log(‘appMenu start‘);
  yield api.createMenu(menu, function(err, result) {
    if (err) {
      throw err
    };
    console.log(‘appMenu‘, result);
  });
  console.log(‘appMenu end‘);
}//只是为了试验而执行了一下,自己根据需要执行
co(appMenu());

能力有限,欢迎补充。

时间: 2024-08-05 15:00:52

nodejs 中koa框架下的微信公众号开发初始篇的相关文章

.NET微信公众号开发-初始微信公众号

一.前言 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一种主流的线上线下微信互动营销方式. 二.开发准备 在开发以前,公司给你把一些资料准备好,这时候你只需要登录微信公众平台https://mp.weixin.qq.com.启动我们的开发者模式 这些工作都准备好了就可以开始我们的编码工作了. 三.开始编码 第一步:我们要做的就是创建菜单.菜单分为一级菜单,二级菜单,官

nodejs + BAE 搭建微信公众号开发平台

闲来无事创建了一个微信公众账号,名曰“深圳生活小助手”, 关注的人不多,平时发一些深圳新闻,趣事啥的,为了丰富公众号的内容,准备添加一些便民查询功能,例如天气预报.快递查询等等. 于是就有了本文的内容. 深圳的读者扫描关注支持下啊... 闲话不多说,本文主要介绍的就是如何基于nodejs和百度云搭建微信公众号开发平台,下一节介绍如何基于该平台实现了一个简单的天气预报查询功能的小例子. 1. 使用Express搭建本地站点 Express 是一个简洁.灵活的 node.js Web 应用开发框架,

微信公众号开发中遇到的几个bug

一.测试自定义菜单接口时中文菜单名显示为null 设置的中文菜单名,中文未经过编码和解码过程,设置的中文菜单名在最后的微信服务器返回的json格式数据中显示为null. 解决办法:将中文先用unecode方法编码,最后再将菜单数组用undecode解码,再传给微信服务器.方法最上面加上header("content-type=text/html;charset=utf-8"),编码方式必须是utf-8,才能在微信公众平台在线测试接口. 二.自定义菜单中的菜单类型type="c

微信公众号开发笔记1(nodejs开发的)

本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有自己的服务器与微信服务器进行认证通过后,才能与他交流.如何进行认证? 1. 接口认证 接口的认证是token验证,微信服务器会发送一个get请求给我们在公众号配置的接口,如http://xxxx/weixin/api ,这个请求带了如下参数 然后,微信规定我们 1)将token.timestamp.

微信公众号开发中的用户账号绑定

最近由于工作需要,接触了微信公众号的开发.业务上要求绑定微信用户和系统用户,以便用户在一次绑定后能够通过系统用户的身份去使用一些功能.我关注的招行信用卡公众号实现了这个功能,所以估计还是可行的,在网上搜索了一下,发现这个问题没什么好的答案,很多都说取不到微信用户名实现不了,甚至有说实现了这个功能的应该是与微信有内部合作的. 搜索无果,遂自己动手实验,后发现其实完全可以的,看来实践才是检验真理的唯一标准,方案上也很简单,我分几点来说. 用OpenID绑定即可 微信接口中虽然没给用户的微信账号,但给

《初识Java微信公众号开发》 学习中遇到的困难

前一段时间无聊的时候,在慕课网上自学了一点点微信公众号开发(受学姐威胁). 慕课网教程的地址:http://www.imooc.com/learn/368 毕竟是免费的课程,不可能讲的那么详细.所以我吧我遇到的问题跟大家分享一下. 这是我照着课程敲的代码(IDE是Eclipse): https://github.com/Zuosy/WeiXin 发到github上面了. 为了这个,我还专门到廖大的网站上学了一遍Git. 廖大的Git教程传送们:https://www.liaoxuefeng.co

微信公众号开发总结

最近公司用到了微信公众平台,所以研究了一下微信公众号的开发技术,总体来说比较简单,结合现有的平台核技术,实现起来非常方便. 首先先来了解一下微信公众平台. "微信,是一个生活方式" ,这是微信的自我评价,是不是觉得如果那天不在朋友圈里分享一下自己的最新状态, 并且收到几个赞和评价的话,会觉得空虚寂寞呢?它实实在在的改变了我们的生活方式. " 微信,也是一个生意方式 ",在微信成为我们日常必备之app的同时,它同样具备巨大的的商业 或许不应该称为潜力,因为有很多人已经

微信公众号开发前期准备工作

随着移动互联网越来越普及,众多企业都注册了微信公众号,于是微信公众号的开发也越来越多,为了不被世界所淘汰,特地学习下微信公众号的开发,已备不时之需! 按照惯例,学习一门新技术或者新框架,咱们还是从官方提供的文档开始,于是找到微信公众平台开发者文档(http://mp.weixin.qq.com/wiki/home/index.html) 1.微信公众平台接口测试号申请 按照文档指引,咱们得先申请一个微信公众平台接口测试账号(http://mp.weixin.qq.com/debug/cgi-bi

微信公众号开发教程详细完整第1篇

| 版权声明:本文为博主原创文章,未经博主允许不得转载. 从2014.12月份左右接触微信公众号开发,短短续续也有了一年多在这期间做了不知道多少个公众号,各种奇葩的功能都有涉猎.从一无所知的小白,到对整个微信公众号生态的理解,不知道经历了多少个日日夜夜,鬼知道我经历了什么.此次教程不谈什么微信公众号O2O(基本死光了)也不谈什么分答,大字(基本被微信封的差不多了),这次我们只是对微信公众号的二次开发者们,希望对你们有所帮助,也希望有更多的朋友一起探讨,讨论. 下面说一下这个教程的前言:首先此次教