// 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. MFC断点无效

    方法1: 将出问题的CPP文件用系统记事本notepad打开,然后另存时选择unicode编码保存,覆盖掉原来的文件即可.一般这种方法一般会解决VS断点无法设定的80%问题.没有办法才请出第2种方法. ...

  2. 通过并行 提高批量审核PDF性能

    上一篇文章提到了 通过 iTextSharp 实现PDF 审核盖章 ,如果当需要一次审核大批量的PDF我们如何来提高程序的性能呢? 下面我们通过并行计算来提升性能. 首先是一个审核PDF的方法 pub ...

  3. android 再按一次退出程序(实现代码)

    效果如图: 实现代码: private long exitTime = 0; /** * 捕捉返回事件按钮 * * 因为此 Activity 继承 TabActivity 用 onKeyDown 无响 ...

  4. Windows下重启指定名称的服务

    // 重启指定服务 void CPSSDPrinterCtrlPlug::RestartService(const wchar_t* nswServiceName) { SC_HANDLE schSC ...

  5. [北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX

    [北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX [北京周六见]10 家创业公司联合招 Partner-均融资 1 ...

  6. MySQL 遇到的问题:在服务里找不到自己的 MySQL,以及在命令行窗口中运行服务出现的问题。

    1.用数据库的时候在服务里找不到自己的 MySQL ,于是就想用命令行窗口去运行. ①.在开始里,键入 cmd ,打开命令行窗口. ②.输入:mysql -u root -p 回车,这时会提示请输入密 ...

  7. c# 可变性解析(协变和逆变)

    之所以会想写关于协变和逆变的知识点,主要是因为在泛型委托中提到了这个知识点. 1.什么是可变性 可变性是.NET4.0中的一个特性,可变形分为:协变性,逆变性,不可变性. 2.在.NET4.0出来之前 ...

  8. 根据控件Id得到控件

    在做动态获取控件时,时常需要根据Id得到控件,并对该控件进行操作,此时用 /// <summary>        /// 根据控件id得到控件        /// </summa ...

  9. 2.RxJava详解网址http

    RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1) Scheduler 的 API (二) 2) Scheduler 的原理(二) 3) 延伸:doOnSubscribe() ...

  10. java 线程池的用法

    1.java自带的类ExecutorService用于提供线程池服务,可以一下方法初始化线程池: ExecutorService pool = Executors.newFixedThreadPool ...