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());
能力有限,欢迎补充。
nodejs 中koa框架下的微信公众号开发初始篇的更多相关文章
- 基于.net5 wtm框架、uni-app微信公众号开发一、公众号授权
前端公众号授权 公众号设置 0.首先用IIS创建一个空目录的网站用于公众号域名验证,接着把该网站内网穿透出去,推荐用utools工具,官网:https://u.tools/ 下载安装好后搜索内网穿透并 ...
- Python微信公众号开发—小白篇
本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造专栏],欢迎大家关注. github仓库地址http ...
- Python微信公众号开发—小白篇(1)
本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造社区],欢迎大家关注. github仓库地址http ...
- 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转
线程安全使用(四) 这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...
- 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示
1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为企业解决那些问题呢? 我们经常看到微信公众号定制开发.微信公众平台定制开发,都不知道这些能给 ...
- 微信公众号开发中遇到的几个bug
一.测试自定义菜单接口时中文菜单名显示为null 设置的中文菜单名,中文未经过编码和解码过程,设置的中文菜单名在最后的微信服务器返回的json格式数据中显示为null. 解决办法:将中文先用uneco ...
- 微信公众号开发笔记1(nodejs开发的)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
- Nodejs微信公众号开发
概览 key value 项目名称 node微信公众号开发 项目描述 使用node编写接口,前后端分离获取签名数据 开发者 leinov 发布日期 2018-11-07 仓库 github地址 安装& ...
- 微信公众号开发笔记1(nodejs开发)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
随机推荐
- Security 可视化
http://web.cs.ucdavis.edu/~ma/SecVis/ http://research.dbvis.de/security/tools/clockview/ http://raff ...
- Mono for Android 优势与劣势
原文:Mono for Android 优势与劣势 最近有兴趣了解一下Mono for Andriod,也就是使用.NET平台来开发Andriod程序.Mono for Android API 几乎映 ...
- 四种必须知道的Android屏幕自适应解决方案
一.细说layout_weight 目前最为推荐的Android多屏幕自适应解决方案. 该属性的作用是决定控件在其父布局中的显示权重,一般用于线性布局中.其值越小,则对应的layout ...
- 17.2.2.1 The Slave Relay Log Slave中继日志
17.2.2.1 The Slave Relay Log Slave中继日志 中继日志, 像binary log,有一组文件组成包含events 描述数据库的修改,和一个index文件包含所有使用过的 ...
- java提高篇(十)-----详解匿名内部类 ,形参为什么要用final
在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...
- the private key for is not installed on this mac
the private key for is not installed on this mac 如果提交 时出现这个问题, 有可能是 keychain重复了, 1:要去keychain中把旧的删除, ...
- 在Apache上部署Django
跟php类似,要想使Apache能够处理python脚本(实际上Apache是不能处理脚本的,只是利用别的扩展模块处理相应脚本),就要给Apache安装相应的扩展模块. Apache起初的python ...
- VS2015连接Oracle数据库(转)
原文地址:https://xuanwo.org/2016/01/03/vs-oracle-11g 开发环境 宿主机:Win10 + VS2015 + ODP.Net for VS2015虚拟机:Win ...
- HDOJ/HDU 1022 Train Problem I(模拟栈)
Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...
- poj 1654 Area(多边形面积)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17456 Accepted: 4847 Description ...