基于node.js的express框架
var https = require('https');
var fs = require('fs');
var path = require('path');
var sign = require(path.join(__dirname, 'sign'));
var _url = require('url');
var BufferHelper = require('bufferhelper');
var request = require("request");
exports.sendTMsg = function (appid, secret, body, fn) {
this.weixinAccessToken(appid, secret, function (token) {
var options = {
method: 'POST',
url: 'https://api.weixin.qq.com/cgi-bin/message/template/send',
qs: { access_token: token },
headers: {
'cache-control': 'no-cache',
'content-type': 'application/json'
},
body: body,
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
fn(null,body);
});
});
}
exports.weixinUserInfoByCode = function (appid, secret, code, fn) {
var that = this;
var options = {
method: 'GET',
url: 'https://api.weixin.qq.com/sns/oauth2/access_token',
qs: {
appid: appid,
secret: secret,
code: code,
grant_type: 'authorization_code'
},
headers: {
'cache-control': 'no-cache'
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
body = JSON.parse(body);
var openid = body.openid;
var token = body.access_token;
console.log('weixinUserInfoByCode', openid, token, body);
// that.userInfo(appid, secret, openid, fn);
that.userInfoCommon(appid, secret, token, openid, fn);
});
};
/**
* 通用获取用户信息,未关注用户也可获取
* @param appid
* @param secret
* @param token
* @param openid
* @param fn
*/
exports.userInfoCommon = function (appid, secret, token, openid, fn) {
var options = {
method: 'GET',
url: 'https://api.weixin.qq.com/sns/userinfo',
qs: { access_token: token, openid: openid, lang: 'zh_CN' },
headers: {
'cache-control': 'no-cache'
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log('userInfoCommon', body);
fn(null, JSON.parse(body));
});
};
/**
*
* @param url
* @param filename
* @param fn
*/
exports.downloadFile = function (res, path, filename, fn) {
res.download(path, filename, fn);
};
/**
* 创建二维码
* @param appid
* @param secret
* @param scene_str
* @param expire_seconds
* @param fn
*/
exports.createQrCode = function (appid, secret, scene_str, expire_seconds, fn) {
var that = this;
var data = {};
if (expire_seconds) {
data = {
"expire_seconds": expire_seconds,
"action_name": "QR_SCENE",
"action_info": { "scene": { "scene_id": scene_str } }
};
} else {
data = { "action_name": "QR_LIMIT_STR_SCENE", "action_info": { "scene": { "scene_str": scene_str } } };
}
this.weixinAccessToken(appid, secret, function (token) {
// that.requestRawAppJson('https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' + token, data, 15000, function (err, result) {
// if (!err) {
// fn(err, JSON.parse(result));
// } else {
// fn(err, null);
// }
// });
var options = {
method: 'POST',
url: 'https://api.weixin.qq.com/cgi-bin/qrcode/create',
qs: { access_token: token },
headers: {
'cache-control': 'no-cache',
'content-type': 'application/json'
},
body: {
action_name: 'QR_LIMIT_STR_SCENE',
action_info: { scene: { scene_str: '18612233895' } }
},
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
fn(null, body);
});
});
};
/**
* 获取用户基本信息
* @param appid
* @param secret
* @param fn
*/
exports.userInfo = function (appid, secret, openid, fn) {
this.weixinAccessToken(appid, secret, function (token) {
https.get('https://api.weixin.qq.com/cgi-bin/user/info?access_token=' + token + '&openid=' + openid + '&lang=zh_CN', function (result) {
var user_info = '';
result.setEncoding('utf8');
result.on('data', function (data) {
user_info += data;
});
result.on('end', function () {
user_info = JSON.parse(user_info);
fn(user_info);
});
});
});
};
/**
* 获取微信API调用的apiTicket
* @param appid
* @param secret
* @param fn
*/
exports.weixinTicket = function (appid, secret, fn) {
var ticket_json = path.join(__dirname, 'ticket.json');
var data = JSON.parse(fs.readFileSync(ticket_json));
console.log(data, 'ticket.json');
if ((data.expire_time * 1) < ((new Date().getTime()) * 1)) {
this.weixinAccessToken(appid, secret, function (token) {
https.get('https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=' + token, function (apiTicket) {
apiTicket.on('data', function (ticket) {
ticket = JSON.parse(ticket);
fs.writeFile(ticket_json, JSON.stringify({
"ticket": ticket.ticket,
"expire_time": (new Date().getTime() + 7000 * 1000)
}, null, 4), function (err) {
});
fn(ticket.ticket);
});
});
});
} else {
fn(data.ticket);
}
};
/**
* 获取微信AccessToken
* @param appid
* @param secret
* @param fn 返回TOKEN
*/
exports.weixinAccessToken = function (appid, secret, fn) {
var access_token_json = path.join(__dirname, 'access_token.json');
var data = JSON.parse(fs.readFileSync(access_token_json));
if ((data.expire_time * 1) < ((new Date().getTime()) * 1)) {
https.get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&secret=' + secret, function (accessToken) {
accessToken.on('data', function (token) {
token = JSON.parse(token);
fs.writeFile(access_token_json, JSON.stringify({
"access_token": token.access_token,
"expire_time": (new Date().getTime() + 7000 * 1000)
}, null, 4), function (err) {
});
fn(token.access_token);
});
});
} else {
fn(data.access_token);
}
};
/**
* 微信调用weixin.js认证签名
* @param appid
* @param secret
* @param fn
*/
exports.weixinSign = function (appid, secret, url, title, desc, imgUrl, fn) {
this.weixinTicket(appid, secret, function (ticket) {
url = url.split('#')[0];
sign.encrypt(ticket, url, function (sign_data) {
var weixin = {
//sign: sign_data.signature,
config: "{debug: false,appId:'" + appid + "',timestamp: '" + sign_data.timestamp + "',nonceStr: '" + sign_data.nonceStr + "',signature: '" + sign_data.signature + "',jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline']}",
onMenuShareTimeline: "{title: '" + title + "', link: '" + url + "', imgUrl: '" + imgUrl + "',success: function () {},cancel: function () {}}",
onMenuShareAppMessage: "{title: '" + title + "', desc: '" + desc + "', link: '" + url + "', imgUrl: '" + imgUrl + "', type: 'link', dataUrl: '',success: function () {},cancel: function () {}}"
};
fn(weixin);
});
});
};
// 扫一扫签名 ops:{obj},{functionName:"func"}
exports.weixinScaningSigin = function (appid, secret, url,ops,fn) {
this.weixinTicket(appid, secret, function (ticket) {
url = url.split('#')[0];
sign.encrypt(ticket, url, function (sign_data) {
let config = {
debug:false,
appId:appid,
timestamp:sign_data.timestamp,
nonceStr:sign_data.nonceStr,
signature:sign_data.signature,
jsApiList:['scanQRCode' ]
}
let scanQRCode = {
needResult:1,
scanType:['qrCode','barCode'],
success:function (res) {
ops.functionName(res)
}
};
let weixin = {
//sign: sign_data.signature,
config: JSON.stringify(config),
// scanQRCode:JSON.stringify(scanQRCode)
scanQRCode: "{"
+"needResult: 1," // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+"scanType: [\"qrCode\",\"barCode\"]," // 可以指定扫二维码还是一维码,默认二者都有
+"success: function (res) {"
+""+ops.functionName+"(res);"
+"}}"
};
fn(weixin);
});
})
}
exports.http_request = function (url, json) {
var json = json || {};
json.data = json.data || {};
json.method = json.method || 'GET';
json.headers = json.headers || {};
json.headers['Content-Type'] = 'application/json';
//json.headers['http']='multipart/form-data';
// json.headers['Authorization'] = 'Bearer ' + token;
var postData = JSON.stringify(json.data);//从json对象中解析出字符串
//请求参数
var options = {
host: url,
//path : '/HYT9101/zsyy9101' + json.path,
path: json.path,
method: json.method,
headers: json.headers
};
//发送请求
var req = https.request(options, function (res) {
var chunks = '';
var size = 0;
res.setEncoding('utf8');//设置返回内容的编码
//存储返回的响应数据
res.on('data', function (chunk) {
chunks += chunk;
size += chunk.length;
});
res.on('end', function () {
//响应完成,获取完整响应数据
//var data = JSON.parse(Buffer.concat(chunks, size).toString());
if (typeof json.callback == 'function')
json.callback(chunks);
});
});
//请求错误时执行的方法
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
// write data to request body
req.write(postData);//请求体
req.end();//请求结束
};
exports.requestRawAppJson = function (api, params, timeout, callback, method) {
method = !method ? 'POST' : method;
// if (api.indexOf('http') == -1) {
// api = this.SERVER_DEFAULT + api;
// }
try {
//将method转为大写
method = method.toUpperCase();
//效验method
if (!method) {
throw new Error('method is invalid');
}
//效验timeout
if (parseInt(timeout) !== timeout || timeout < 1) {
timeout = 15000;
}
//var builder = new xml2js.Builder();
//var xml = "" + encodeURIComponent(builder.buildObject(params) + "");
var xml = JSON.stringify(params);
// xml = xml.replace(/\"/g,'\\\"');
var urlParams = _url.parse(api);
var host = urlParams.hostname;
var path = urlParams.path;
var port = urlParams.port ? urlParams.port : 80;
var requestOption = {
host: host,
port: port,
path: path,
method: method,
headers: {
'Content-Type': 'application/json',//'application/json; charset=utf-8' ,
// 'Content-Length': Buffer.byteLength(xml)
}
};
} catch (e) {
return typeof callback === 'function' && callback(e, null);
}
//Modify by Hinbor 20150702 http.request处理回传数据的标准写法
var req = https.request(requestOption, function (res) {
res.setEncoding('utf8');
var bufferHelper = new BufferHelper();
res.on('data', function (data) {
bufferHelper.concat(data.toString());
}).on('end', function () {
//Add by Hinbor 20150702注意标准的调用方法中写法是这样的bufferHelper.toBuffers.toString(),这种方式是错误的
// var jsonObj = bufferHelper.buffers.toString();
var jsonObj = bufferHelper.buffers.join('');
typeof callback === 'function' && callback(null, jsonObj);
});
});
req.on('error', function (e) {
typeof callback === 'function' && callback(e, null);
});
req.write(xml);
req.setTimeout(timeout, function () {
req.abort();
});
req.end();
};
exports.request_common = function (params, url, method, fn) {
var options = {
method: method,
url: url,//'https://api.weixin.qq.com/cgi-bin/qrcode/create',
// qs : {access_token: token},
headers: {
'cache-control': 'no-cache',
'content-type': 'application/json'
},
body: params,
json: true,
};
request(options, function (error, response, body) {
if (error) body = 'error';
fn(body);
});
};