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开发)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
随机推荐
- 【Xamarin挖墙脚系列:移动设备应用的开发周期及准则】
原文:[Xamarin挖墙脚系列:移动设备应用的开发周期及准则] 原文地址:https://developer.xamarin.com/guides/cross-platform/getting_st ...
- BitMap 内存使用优化
在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...
- 如何编译Support7Demos测试appcompat
目录(?)[-] 简介 在Eclipse中编译 使用Gradle编译 简介 Google发布的API-18中带上的support-v7包含了appcompat组件,可以在小于API-11的androi ...
- ASP.NET中验证控件的使用
转自:http://www.cnblogs.com/yangmingming/archive/2010/03/09/1682006.html 前言: 前几日,无奈用JS判断控件的有效性,发现的确是一件 ...
- HDOJ --- 2151 Worm
Worm Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- sort()函数与qsort()函数及其头文件
sort()函数与qsort()函数及其头文件 sort()函数是C++中的排序函数其头文件为:#include<algorithm>头文件: qsort()是C中的排序函数,其头文件为: ...
- Excel通过宏创建百万数据
打开视图->宏->编辑,代码如下,cells(n,m)表示当前Excel表格第n行第m列</span> Sub newdata() Dim i As Long Cells(i, ...
- linux时间设置相关
1.查询时间命令:date 2.设置日期:date -s mm/dd/yyyy 3.设置时间:date -s HH:MM:SS 4.将当前时间及日期写入BIOS,避免重启失效:hwclock -w 5 ...
- UART(串口)
(1)串行通信线路三种工作方式:单工通信.半双工通信.全双工通信 单工:单工就是指A只能发信号,而B只能接收信号,通信是单向的. 半双工:半双工就是指A能发信号给B,B也能发信号给A,但这两个过程不能 ...
- input框自动填充内容背景颜色为黄色解决方法
谷歌浏览器input自动填充内容,背景色会是黄色,想改的话: input:-webkit-autofill { box-shadow: 0 0 0px 1000px white inset;} 这种方 ...