// 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);

node实现创建服务器获取wx jssdk签名的更多相关文章

  1. Node.js创建服务器和模拟客户端请求

    1. 何为服务器 服务器是某种长期运行,等待请求资源的应用程序 2. 常见Web应用架构 3. 如何创建web服务器 Web服务器是使用HTTP协议,等待客户端连接后请求资源的驻守应用程序:HTTP协 ...

  2. node.js在windows下的学习笔记(5)---用NODE.JS创建服务器和客户端

    //引入http模块 var http = require('http'); //调用http的createServer的方法,这个方法有一个回调函数,这个回调数 //的作用是当有请求发送给服务器的时 ...

  3. node.js创建服务器报错

    创建nodeTest.js如下: var http = require('http'); http.createServer(function (request, response){ respons ...

  4. Element(Vue)+Express(Node)模拟服务器获取本地json数据

    网上很多教程说需要在build目录下的dev-server.js文件中配置,但目前最新的vue-cli是没有dev-server.js这个文件的,因为已经被合并到webpack.dev.conf.js ...

  5. node.js和express创建服务器

    创建web服务器 一. 使用node.js创建服务器. 使用express创建http服务. 监控服务器的变化. 二. 初始化配置文件:npm init -y 使用typescript编写,导入nod ...

  6. [转]用Node.js创建自签名的HTTPS服务器

    用Node.js创建自签名的HTTPS服务器 创建自己的CA机构 创建服务器端证书 创建客户端证书 将证书打包 创建自己的CA机构 为CA生成私钥 openssl genrsa -out ca-key ...

  7. Node.js创建自签名的HTTPS服务器

    https://cnodejs.org/topic/54745ac22804a0997d38b32d  用Node.js创建自签名的HTTPS服务器  发布于 4 年前  作者 eeandrew  6 ...

  8. node.js中使用http模块创建服务器和客户端

    node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...

  9. Node.js 创建HTTP服务器

    Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个& ...

随机推荐

  1. Shell continue循环

    [oracle@june ~]$ cat continue.sh for i in a b c d e f g do if [ "$i" = "c" ] the ...

  2. mongodb sort limit和skip用法

    > db.mediaCollection.find().skip().toArray() [ { "_id" : ObjectId("5353463193efef0 ...

  3. 转载-常用API接口签名验证参考

    原文地址: http://www.cnblogs.com/hnsongbiao/p/5478645.html 写的很好,就做个笔记了.感谢作者! 项目中常用的API接口签名验证方法: 1. 给app分 ...

  4. Storm拓扑的并行度(parallelism)介绍

    Storm拓扑的并行度(parallelism)介绍 1.Storm分为3个主要实体,用于在Storm集群中运行拓扑        工作进程:Worker Process,也称为Worker      ...

  5. I/O多路转接 --- UNIX环境高级编程

    I/O多路转接技术:先构造一张有关描述符的列表,然后调用一个函数,知道这些描述符中的一个已准备好进行I/O时,给函数才返回.在返回时,它告诉进程哪些描述符已准备好可以进行I/O. poll.selec ...

  6. StringBuffer学习笔记

    StringBuffer是什么? StringBuffer是使用缓冲区的,本身也是操作字符串的,它是一个具体的操作类.与String类不同的是,它其中的内容是可以改变的.它不能像String那样采用直 ...

  7. 【C#爬虫】抓取XX网站mp4资源地址

    抓取小视频的url地址,然后将地址信息拷贝到迅雷里批量下载就ok了 主程序 代码 //yazhouqingseAV 35 //zhifusiwaAV 29 //zipaishipin 30 //oum ...

  8. 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。

    1.服务器 #include<winsock2.h> //包含头文件#include<stdio.h>#include<windows.h>#pragma comm ...

  9. C#获取当前路径的几种方法

    C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. ...

  10. win7 安装 IIS

    和xp不同,xp安装 IIS需要下载额外的软件包. 步骤 1,依次打开 "控制面板" -> "程序" ->"打开或关闭windows功能& ...