varhttp=require("https");
varparse= require('url').parse;
varconfig= require('../conf/config.js').config();
variconv= require('iconv-lite');
varr=require('./r.js');
varcrypto= require('crypto');
functionget(url,callback){
varinfo=parse(url);
varoptions= {
hostname: info.hostname,
port: info.port,
path: info.path,
method: 'GET'};
varreq= http.request(options, function(res) {
res.on('data', function(chunk) {
// console.log('BODY: ' + chunk);callback(null,chunk);//返回结果});
});
req.on('error', function(e) {
console.log('problem with request: '+ e.message);
callback(e,null);
});
req.end();
}
//网页授权后提交页面到微信接口,此时需要拿到用户的微信一些信息,用于插入操作functiongetWeiXinUser(req,param,callback){
//得到access_tokenvarurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+config.weixin.appid+"&secret="+config.weixin.secret+"&code="+param.code+"&grant_type=authorization_code";
get(url,function(err,res){
if(err){
console.error(err);
callback(err,null);
}
//只返回结果varjson= JSON.parse(iconv.decode(res, 'UTF-8'));
if(json.openid&&r.loadFromCache(json.openid)){
varuser=r.loadFromCache(json.openid).data;//data才是user里面的内容callback(null,user);//如果数据中有}else{
if(json.access_token) {
验证access_token是否有效varinvalidAT= "https://api.weixin.qq.com/sns/auth?access_token="+ json.access_token + "&openid="+ json.openid;
get(invalidAT, function(err, resAcc) {
varaccResult= JSON.parse(iconv.decode(resAcc));
if(accResult.errcode != 0) {
//此时access_token有效,重新刷新access_token,再传入数据当中varurl= "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+ config.weixin.appid+ "&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";
get(url, function(errR, resR) {
varnewResult= JSON.parse(iconv.decode(resR));
if(newResult.errcode == undefined) {
getUserInfo(newResult, function(err, user) {
callback(err, user);
});
} else{
callback(err, null);
}
})
} else{
if(json.errcode == undefined) {//报错时直接退出,不进入查询userInfo的页面getUserInfo(json, function(err, user) {
callback(err, user);
});
} else{
callback(err, null);
}
}
});
}else{
callback(err,null);//授权code处已失败}
}
});
}
//得到用户信息functiongetUserInfo(param,callback){
varurlInfo= "https://api.weixin.qq.com/sns/userinfo?lang=zh_CN&access_token="+ param.access_token + "&openid="+ param.openid;
get(urlInfo, function(err, response) {
varuser= JSON.parse(iconv.decode(response, 'UTF-8'));
r.writeToCache(user.openid,user,config.weixin.sessionTime);//openid==>user cachecallback(null, user);
});
}
functiongetInfoForJsSDK(req,callback){//在微信中打开页面形式是否可以调用对应的jsjdkvaracToUrl='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='+config.weixin.appid+'&secret='+config.weixin.secret;
get(acToUrl,function(err,res){
varacToObj=JSON.parse(iconv.decode(res,"UTF-8"));
varaccessToken=acToObj.access_token;
varticketUrl="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=jsapi";//get(ticketUrl,function(err,resTick){
varticketObj=JSON.parse(iconv.decode(resTick,"UTF-8"));
varticket=ticketObj.ticket;
callback(err,sign(ticket,"http://"+req.headers.host+req.url));//得到签名});
});
}
varcreateNonceStr= function() {
returnMath.random().toString(36).substr(2, 15);
};
varcreateTimestamp= function() {
returnparseInt(newDate().getTime() / 1000) + '';
};
varraw= function(args) {
varkeys= Object.keys(args);
keys= keys.sort()
varnewArgs= {};
keys.forEach(function(key) {
newArgs[key.toLowerCase()] = args[key];
});
varstring= '';
for(varkinnewArgs) {
string+= '&'+ k+ '='+ newArgs[k];
}
string= string.substr(1);
returnstring;
};
varsign= function(jsapi_ticket, url) {
varret= {
jsapi_ticket: jsapi_ticket,
nonceStr: createNonceStr(),
timestamp: createTimestamp(),
url: url
};
varstring= raw(ret);
jsSHA= require('jssha');
shaObj= newjsSHA(string, 'TEXT');
ret.signature= shaObj.getHash('SHA-1', 'HEX');
ret.appid=config.weixin.appid;
ret.secret=config.weixin.secret;
returnret;
};
//exports.get=get;exports.getWeiXinUser=function(req,param){
return function(callback) {
getWeiXinUser(req,param,callback);
};
};
exports.getInfoForJsSDK=function(req){
return function(callback){
getInfoForJsSDK(req,callback);//得到签名}
}