找回密码
 立即注册

QQ登录

只需一步,快速开始

参考文章

关注:2

所属分类: 微信开发 微信公众号开发资源 参考文章

微信公众号开发相关参考文章,不定期更新

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

[复制链接]
查看: 754|回复: 0
最佳答案
0 

754

主题

0

帖子

4488

积分

网站编辑

Rank: 8Rank: 8

积分
4488
 楼主| 发表于 2017-3-15 18:37:01 | 显示全部楼层 |阅读模式

最近在搞微信公众号开发,后端采用的是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());

能力有限,欢迎补充。

原文链接:http://www.cnblogs.com/shtyHome/p/5676845.html

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



henkuai.com是专业的第三方微信开发者平台,为生态而生。


本站为第三方微信开发者平台,非腾讯官方网站。

天津市滨海新区
中新生态城中成大道生态建设公寓9号楼3层301

欢迎来这里一起喝喝茶,
聊聊你的产品。

微信公众号gongzhongkaifa

工作日12小时内回复。

广告推广
zhongcong@henkuai.com

工作日12小时内回复。

市场合作
songchang@henkuai.com