node实现创建服务器获取wx jssdk签名
// 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签名的更多相关文章
- Node.js创建服务器和模拟客户端请求
1. 何为服务器 服务器是某种长期运行,等待请求资源的应用程序 2. 常见Web应用架构 3. 如何创建web服务器 Web服务器是使用HTTP协议,等待客户端连接后请求资源的驻守应用程序:HTTP协 ...
- node.js在windows下的学习笔记(5)---用NODE.JS创建服务器和客户端
//引入http模块 var http = require('http'); //调用http的createServer的方法,这个方法有一个回调函数,这个回调数 //的作用是当有请求发送给服务器的时 ...
- node.js创建服务器报错
创建nodeTest.js如下: var http = require('http'); http.createServer(function (request, response){ respons ...
- Element(Vue)+Express(Node)模拟服务器获取本地json数据
网上很多教程说需要在build目录下的dev-server.js文件中配置,但目前最新的vue-cli是没有dev-server.js这个文件的,因为已经被合并到webpack.dev.conf.js ...
- node.js和express创建服务器
创建web服务器 一. 使用node.js创建服务器. 使用express创建http服务. 监控服务器的变化. 二. 初始化配置文件:npm init -y 使用typescript编写,导入nod ...
- [转]用Node.js创建自签名的HTTPS服务器
用Node.js创建自签名的HTTPS服务器 创建自己的CA机构 创建服务器端证书 创建客户端证书 将证书打包 创建自己的CA机构 为CA生成私钥 openssl genrsa -out ca-key ...
- Node.js创建自签名的HTTPS服务器
https://cnodejs.org/topic/54745ac22804a0997d38b32d 用Node.js创建自签名的HTTPS服务器 发布于 4 年前 作者 eeandrew 6 ...
- node.js中使用http模块创建服务器和客户端
node.js中的 http 模块提供了创建服务器和客户端的方法,http 全称是超文本传输协议,基于 tcp 之上,属于应用层协议. 一.创建http服务器 const http = require ...
- Node.js 创建HTTP服务器
Node.js 创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个& ...
随机推荐
- Altium designer PCB中过孔铺地连接的设置
在Altium designer 6及更高版本如Altium Designer Winter 9.altium designer summer 9都会有这样的问题,在Altium DXP2004里面是 ...
- QT的文本加密方法(寒山居士)
http://blog.csdn.net/esonpo/article/details/12746315http://blog.csdn.net/esonpo/article/details/1174 ...
- php 读取 word
---恢复内容开始--- 首先安装com扩展: php.ini php.ini 确保有此语句 [PHP_COM_DOTNET] extension=php_com_dotnet.dll php.i ...
- yum 使用说明
linux如何安装yum 使用YUM来安装软件,就可以不用去到处找依赖关系的RPM了.很方便. 第一步:安装yum 第二步:下载createrepo包并安装 下载地址: ftp://195.220. ...
- BZOJ1119: [POI2009]SLO
1119: [POI2009]SLO Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 379 Solved: 181[Submit][Status] ...
- HDOJ(HDU) 1563 Find your present!(异或)
Problem Description In the new year party, everybody will get a "special present".Now it's ...
- Android 侧滑(双向滑动菜单)效果
下面看看我们如何使用它,达到我们想要的效果 public class MainActivity extends Activity { /** * 双向滑动菜单布局 */ private SliderM ...
- 二叉树后序遍历的非递归算法(C语言)
首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问 ...
- Java多线程中变量的可见性
之所以写这篇博客, 是因为在csdn上看到一个帖子问的就是这个问题. 废话不多说, 我们先看看他的代码(为了减少代码量, 我将创建线程并启动的部分修改为使用方法引用). 1 2 3 4 5 6 7 8 ...
- CSS常用操作-对齐
index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...