Skip to content

微信项目开发过程中的积累。封装了常用API。

Notifications You must be signed in to change notification settings

hd19861028/weixin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

wx-common

wx-common是一个node.js模块,提供微信项目开发的公共库

安装

npm install wx-common

添加全局配置

必须将下面的配置设置到global.config全局对象中

{
	/** 服务器根目录,可以在启动时动态设置 **/
	"root": "/data/web/",
	/** 默认的文件上传保存路径,可以在启动时动态设置 **/
	"upload_temp": "/data/upload/",
	/** 上传文件最大尺寸,可以在启动时动态设置 **/
	"upload_max_size": 100,
	/** AES加密密钥 **/
	"ase_key": "ahkdaksdnalksjd",
	/** 微信公众好有关的配置 **/
	"website": {
		/** 微信服务器接口域名 **/
		"domain": "xxxxxxxx.com",
		/** 微信公众号groupid **/
		"groupid": "gh_ahsudjikasndk",
		/** AppID(应用ID) **/
		"appid": "ahkdaksdnalksjd.a",
		/** AppSecret(应用密钥) **/
		"secret": "ahkdaksdnalksjd",
		/** Token(令牌) **/
		"site_token": "ahkdaksdnalksjd",
		/** jsapi方法名 **/
		"jsApiList": [],
		/** openid过期时间 **/
		"openid_expire": 31536000000
	},
	/** redis缓存配置 **/
	"cache": {
		"ip": "127.0.0.1",
		"port": 6379,
		"timeout": 3000,
		"expire": 300,
		"db_count": 16,
		"enable": true
	}
}

微信开发

功能概要

引入模块

var wx = require('wx-common').weixin;

启动开发者模式

//启动服务器配置时,第一次验证所用
//query是Express的req.query,无需修饰,直接传入
var result = wx.validateToken(query);
if(result === "false"){
	//失败
} else {
	//接入成功
}

发送模板消息

wx.push_notise(openid, '模板消息id', data, '点击模板的回调URL(可空)');
//data属性,与模板消息的内容字段是对应关系。
//假设模板消息有字段title, keyword1, keyword2, desc,那么data可以如下设置
//所有字段的值,都支持String和Object两种格式
//注意:只能设置字体颜色,不能设置字体大小
var data = {
	"title": "测试标题",
	"keyword1": "测试内容1",
	"keyword2": "测试内容2",
	"desc": {
		"value": "这是模板消息底部描述信息",
		"color": "#cccccc"
	}
}

发送客服消息

wx.push_msg(openid, message, callback);
//message: 
//	类型为string:推送纯文本消息
//	类型为json或者array时,推送图文消息
//	    json示例: {title: "图文标题", description: "图文描述", link_url: "跳转链接", pic_url: "图片路径"}
//	    array示例: [{title: "图文标题", link_url: "跳转链接", pic_url: "图片路径"}]

回复消息

//Event == "CLICK时,服务台向微信用户回复的消息
//回复文本消息
wx.reply_news(openid, '谢谢关注', 'text');
//回复图文消息
wx.reply_news(openid, msgs, 'news');
//	msgs对象示例: 
//	    [{ title: "图文标题", link: "跳转链接", pic: "图片路径", description: "图文描述" }]

获取Access Token

//返回Promise
wx.get_access_token()

获取jsapi ticket

//返回Promise
//pagename: 使用jaapi的页面名
//此外,global.config.website.jsApiList对象中要设置需要使用的方法名
wx.get_jsapi_ticket(pagename)

下载媒体对象,比如图片,小视频,语音等等

wx.download_media(media_id, callback, saveAs);
//callback(error, data)

生成带场景值的二维码

//scene:数据类型必须是string或者Int32
//expire:过期时间(秒),最大不得超过2592000,也就是30天,默认值259200,如果设置-1,将生成永久二维码
wx.create_qr(scene, expire); //返回promise

生成二维码

wx.create_qr_image(web_url, callback);
//callback(save_as)

加密模块

Md5, Sha, HmacMd5, HmacSha用法示例

//在线验证:http://tool.chinaz.com/tools/hash.aspx
var common = require('wx-common');
var sec = common.secret;

var source = "123456";
var key = "123456";
var method = ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'];
console.log('\r\nsha加密')
for (var i = 0; i < method.length; i++) {
	console.log(method[i], '\t', sec.Encrypt(source, method[i]));
}
console.log('\r\nhmac加密')
for (var i = 0; i < method.length; i++) {
	console.log(method[i], '\t', sec.Encrypt(source, method[i], key));
}

AES加密解密用法示例

var common = require('wx-common');
var sec = common.secret;

var source = "123456";
var aes_key = "1234567890123456";

var target = sec.ASE_Encrypt(source, aes_key);
console.log(target) //c97554911e393c5cf451fa5b0c1f3f7b
var _source = sec.ASE_Decrypt(target, aes_key);
console.log(_source == source) //true

//验证地址:http://tool.chacuo.net/cryptaes
//参数配置如下
//加密模式:ECB,填充:pkcs5padding,数据块:128位,偏移量:空,输出:hex,字符集:utf8

RSA公私钥验证

//只是验证签名,如果想利用公私钥加密&解密,移步至
//https://github.com/rzcoder/node-rsa

var fs = require('fs');
var path = require('path');
var common = require('wx-common');
var sec = common.secret;

//生成私钥:openssl genrsa -out ~/.ssh/id_rsa 2048
var privateKey = fs.readFileSync(path.join('/root/.ssh/', 'id_rsa')).toString();
//生成公钥:openssl rsa -in ~/.ssh/id_rsa -pubout -out ~/.ssh/id_rsa.pub
var publicKey = fs.readFileSync(path.join('/root/.ssh/', 'id_rsa.pub')).toString();
var source = "123456";

var secretResult = sec.RSA.Create(source, privateKey);
var r = sec.RSA.Valid(source, secretResult, publicKey);
console.log(r); //true

Http Request模块

参数描述

//请求路径
var url = "http://example.com/";
//发送数据,若是Object类型,内部会先JSON.stringify转换成String,然后再发送
var data = { a: 1, b: 2 };
var header = { 'Content-Type': 'application/json' };
//是否不处理响应流,直接输出。如果设置成true,将直接返回ResponseStream,而不是返回字符串
var isStream = false;
//文件的保存路径
var saveAsUrl = "E:/project/";
//启动多线程下载前,必须钱通过FileLength获取到文件的总长度
var maxLength = null;
//分多少段下载,一般设置成cpu的数量
var cpus = 4; //require('os').cpus().length

获取结果

//引入模块
var request = require('wx-common').request;

//所有方法都返回Promise对象,请通过method.then获取结果
//如果isStream=false
request.Get(url, header, isStream)
	.then(function(result){
		//result (Object || String)
		//如果是json对象,将返回object,否则返回string
	})
//如果isStream=true
request.Get(url, header, isStream)
	.then(function(res) {
		res.setEncoding('utf8');
		var result = '';
		res.on('data', function(chunk) {
			result += chunk;
		});
		res.on('end', function() {
			
		});
		res.on('error', function(err) {
			
		});
	})

常用的Get, Post, Put, Delete

request.Post(url, JSON.stringify(data), header, isStream);
request.Put(url, JSON.stringify(data), header, isStream);
request.Get(url, header, isStream);
request.Delete(url, header, isStream);

文件下载

request.Download(url, saveAsUrl);

获取远程文件长度

request.FileLength(url);

多线程下载(Debug中)

request.DownloadParallel(url, saveAsUrl, maxLength, cpus);

Common模块

引入模块

var common = require('wx-common').common;

读取config.json

//json文件中支持/** xxxx **/格式的多行注释
const config = common.loadJsonFile('./config.json');

> XML与JSON互转

```javascript
//xml转json
common.xmlToJson('xmlString', function(json) {

})

//json转xml
var xmlResult = common.jsonToXml(json)

获取字符串hash值

var hash = common.hash('原字符串')

处理表单上传的文件

//req: 		express的req
//res: 		express的res
//callback:	2个参数,分别是fields, files,2个对象都是数组
//save_as:	文件保存的目录(文件夹路径)
common.upload_file(req, res, callback, save_as)

//此外,使用此方法,还必须在global对象上设置2个属性
global.config.upload_temp		//表示文件保存的默认路径
global.config.upload_max_size	//表示最多允许上传多大的文件,int类型,单位m

获取guid

var guid = common.guid()

获取shortid

var shortid = common.shortid();
//可以自定义长度,默认长度9
shortid = common.shortid(12);

密码和盐值

//根据指定的密码产生随机盐值
//返回promise,内容{ salt: '盐值', pwd: '原密码' }
common.makePwd(pwd)

//验证密码
//返回promise,内容true|false
common.validPwd(
	pwd, //用户输入的密码 
	pwd_db, //数据库存储的密码 
	salt //数据库存储的密码对应的盐值
)

删除文件夹下过期文件

//需要清理的目录,不递归目录,只删除当前目录下的文件
var dir = '/data/logs/test-project/';
//指定一个天数,设置成5,意思是删除5天前的所有文件
//此功能一般用于清理过去日志文件
var expireDays = 5;

common.DeleteExpireFiles(dir, expireDays)
	.then(function(deletedFiles){
		//被删除的文件列表:
		console.log(deletedFiles);		
	})

原型扩展

引入模块

require('wx-common').prototype;

//使用须知:
//	1. 若要使用WriteLog方法, 在项目初始化时需要设置global.config.root = __dirname,或者指定自己喜欢的目录
//	2. 在global.config.root指定的目录下,必须有一个“log”文件夹

Number类型扩展

//时间戳转换成指定的日期字符串
Date.now().Format('yyyy-MM-dd HH:mm:ss.fff');

String类型扩展

//判断当前字符串是否包含Emoji字符
str.HasEmoji()
//将当前字符串写入log文件中
//isError: true|false, 是不是错误消息。如果true,将会记录到error.log中,否则记录到info
str.WriteLog(isError);

global对象扩展

//记录日志
global.WriteLog(Object|String, isError);

//Express框架,从post或put请求的req中获取请求参数
//req:		express框架req对象
//isJSON:	如果传入的参数是json字符串,请传入true,如果是a=1&b=2&c=3的形式,请传入false
global.BodyParse(req, isJSON);

//锁机制,将某个接口从并发改为串行执行
var lockId = 1;
//创建锁
var lock = await Lock.Open(lockId);
//释放锁
await Lock.Close(lock);

//下载Excel2007
var filename = "测试文件test.xlsx";
var data = [
	{ '得主': '王重阳', '手机': '18911112222', '奖品': '测试奖品', '中奖时间': '2017-05-26 09:39:59'},
	{ '得主': '小李飞刀', '手机': '18911112222', '奖品': '测试奖品', '中奖时间': '2017-05-26 09:39:59' }
]
/*
 * data设置成下面这个样子,可以导出多个sheet
 * data = [
 * 	[......],
 * 	[......]
 * ]
 *
 */
global.DownloadExcel(res, filename, data);

Array类型扩展

//数组复制
var a = [1, 2, 3, 4, 5];
var b = a.Clone();

Error类型扩展

//记录日志
var err = new Error('测试错误');
err.WriteLog();

Timer计时器模块

引入模块

var Timer = require('wx-common').timer;
var timer = new Timer(options);
timer.Start();

options参数列表

var options = {
	days: null, //间隔天数
	hours: null, //间隔小时数
	minutes: null, //间隔分钟数
	seconds: 10, //间隔秒数
	onTick: function(){}
}

//上面的参数含义是间隔10秒运行一次
//如果上面这些时间段,无法满足你的要求,那么可以调用下面的方法指定一个时间运行
timer.SetCronTime('*/10 * * * * *');
//6个参数的含义如下:
//秒: 0-59
//分钟: 0-59
//小时: 0-23
//每月的第几天: 1-31
//每年的第几月: 0-11
//每周的第几天: 0-6

Timer实例方法

//启动
timer.Enable();
//禁用
timer.Disable();
//开始并启动,不要重复调用
timer.Start();
//停止并清除计时器
timer.Stop();
//停止清除计时器并重新开始
timer.Restart();
//自定义设置执行间隔
timer.SetCronTime(interval);
//检查当前计时器执行时间是否发生变更,如果有,就重启。
//name只是用来打印计时器的名字,可选参数
timer.CheckIsChange(interval, name);
//设置自定义执行间隔,并立刻启动
//name只是用来打印计时器的名字,可选参数
timer.StartTimer(interval, name)

fs的Promise实现

引入模块

var fs = require('fs');
var fsPromise = require('wx-common').fs;

异步用法举例

//创建文件夹
fs.mkdir(path, function(err){});
//使用fs-promise方式如下
fsPromise.mkdir(path).then(function(){}, function(err){});

//注意,只实现了异步方法,并未实现类似mkdirSync的同步方法。

使用node原生fs库

//创建文件夹
fsPromise.node.mkdir(path, function(err){});

仿Nginx代理转发

引入模块

var agent = require('wx-common').agent;

基本用法

agent.startAgent({
        port: 8888, //代理服务器端口
        forwardPort: 9999, //转发到目标端口
        middleware: function(req, res, next){
        	//支持express中间件语法
        	console.log(req.headers)
        	next();
        },
        hosts: ['127.0.0.1'] //目标服务器host地址
})

负载均衡权值设置

agent.startAgent({
	port: 8888,
	hosts: [{
		host: '127.0.0.1',
		port: 9999,
		weight: 100 //含义与nginx一致,表示负载均衡的权值
	}, {
		host: '127.0.0.1',
		port: 9999,
		weight: 100
	}]
})

转发HTTPS

agent.startAgent({
        port: 8888, 
        forwardPort: 443, 
        https: true, //默认不开启,只有该属性为true,才开启
        hosts: ['127.0.0.1'] 
})

About

微信项目开发过程中的积累。封装了常用API。

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published