nodeはサーバーを創立してwx jssdk署名を獲得することを実現します。
8652 ワード
// system module
var http = require("http");
var https = require("https");
var url = require("url");
var path = require("path");
var qs = require("querystring");
var crypto = require('crypto'); // hash
// simple cache
var cache = require("memory-cache");
// app file
var conf = require("./config/config.js");
var route = require("./route/route.js");
http.createServer(function(req,res){
var serverRes = res;
var serverReq = req;
var param = url.parse(req.url,true).query;
var pathname = url.parse(req.url,true).pathname;
var callback = param.callback;
var noncestr = param.noncestr;
var timestamp = param.timestamp;
var needUrl = param.url;
if(!needUrl || !noncestr || !timestamp){
var chunk = JSON.stringify({
errcode: 1,
message: " "
});
serverRes.end(callback+"("+chunk+")");
}
var getToken = function(){
console.log("2.1.1");
var data = {
grant_type: "client_credential",
appid: conf.wechat.AppID,
secret: conf.wechat.AppSecret
}
var content = qs.stringify(data);
var options = {
hostname: "api.weixin.qq.com",
port: "",
path: "/cgi-bin/token?"+content,
method: "GET"
}
var req = https.request(options,function(res){
res.on('data', function (chunk) {
console.log("2.1.2");
var statusCode = res.statusCode;
if(statusCode != 200){
var chunk = JSON.stringify({
code: statusCode,
message: " token "
});
serverRes.end(callback+"("+chunk+")");
}
var chunk = JSON.parse(chunk.toString());
cache.put("token",chunk["access_token"],7200000,function(){
cache.del("token");
});
getTicket();
});
})
req.on("error",function(err){
console.log(err.message);
})
req.end();
}
var getTicket = function(){
console.log("2.2.1");
var data = {
access_token: cache.get("token"),
type: "jsapi"
}
var content = qs.stringify(data);
var options = {
hostname: "api.weixin.qq.com",
port: "",
path: "/cgi-bin/ticket/getticket?"+content,
method: "GET"
}
var req = https.request(options,function(res){
console.log("2.2.2");
var statusCode = res.statusCode;
if(statusCode != 200){
var chunk = JSON.stringify({
code: statusCode,
message: " ticket "
});
serverRes.end(callback+"("+chunk+")");
}
res.on('data', function (chunk) {
var chunkJSON = JSON.parse(chunk.toString());
cache.put("ticket",chunkJSON.ticket,7200000,function(){
cache.del("ticket");
});
getSingature(chunkJSON.ticket);
});
})
req.on("error",function(err){
console.log(err.message);
})
req.end();
}
var getSingature = function(ticket){
console.log(3.1);
var data = {
jsapi_ticket: ticket,
noncestr: noncestr,
timestamp: timestamp,
};
console.log(data);
var content = qs.stringify(data);
content+="&url="+needUrl;
console.log(content);
var shasum = crypto.createHash('sha1');
shasum.update(content);
var signature = shasum.digest("hex");
console.log(signature);
var chunk = JSON.stringify({
errcode: 0,
errmsg: "ok",
signature: signature
});
serverRes.end(callback+"("+chunk+")");
}
/**
* jsapi_ticket ,
* jsapi_ticket, access_token( 7200s)
* access_token, jsapi_ticket( 7200s)
* jsapi_ticket api , jsapi_ticket api ,
* , jsapi_ticket
*/
if(pathname != "/getWechatSignature"){
res.statusCode = 404;
res.end();
return;
}
// jsapi_ticket,
// ticket sha1
var jsapi_ticket = cache.get("ticket");
if(jsapi_ticket && jsapi_ticket != ""){
console.log(1);
getSingature(jsapi_ticket);
}else{
/**
* access_token
* token, token
*/
var access_token = cache.get("token");
if(!access_token || access_token == ""){
console.log(2.1);
getToken();
}else{
console.log(2.2);
getTicket();
}
}
}).listen(conf.port);
console.log((new Date()).toLocaleString() + "server start on : " + conf.host + ":" + conf.port);