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. 从这个角度看,整个& ...
随机推荐
- Kill Process by Name
Kill Process by Name(works in: Microsoft Windows 95/98/ME/NT/2000/XP)It is sometimes necessary to te ...
- eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法
很长一段时间我的eclipse都有个毛病,就是当我要格式化代码的时候,右键-source-format能够起效,但ctrl+shift+f不好使了. 可以基本断定是快捷键与别的软件冲突了,但一直也没时 ...
- Java JDBC中,MySQL字段类型到JAVA类型的转换
1. 概述 在使用Java JDBC时,你是否有过这样的疑问:MySQL里的数据类型到底该选择哪种Java类型与之对应?本篇将为你揭开这个答案. 2. 类型映射 java.sql.Types定义了常 ...
- mySql控制流程的函数
1.select case value then result else value end; 在第一个方案的返回结果中, value=compare-value.而第二个方案的返回结果是第一种情况的 ...
- HDU-2571命运
Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了!可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机 ...
- 如何使用深度学习破解验证码 keras 连续验证码
在实现网络爬虫的过程中,验证码的出现总是会阻碍爬虫的工作.本期介绍一种利用深度神经网络来实现的端到端的验证码识别方法.通过本方法,可以在不切割图片.不做模板匹配的情况下实现精度超过90%的识别结果. ...
- MVC框架个人浅析
1.概述: 相信不少前端从业者,都会遇到MVC编程模式,现今多数轻量级网站用php作为后台交互,MVC编程模式用于JAVAWEB开发,应用类型以系统占多数(包括并不限于系统,电商网站,平台交互当然都能 ...
- cavium octeon 处理器启动总线Bootbus 简介
cavium octeon 处理器启动总线Bootbus 简介: 韩大卫@吉林师范大学 Boot-bus(启动总线)是cavium octeon处理器的一种用于启动系统的硬件. CPU通过boot b ...
- python数据库做成邮箱的注册系统!
#! /usr/bin/env python2.7 # -*- coding:utf-8 -*- #File:w7.py #Date:2013-7-18 #Author:wangyu import r ...
- Linux菜鸟学习笔记--Linux系统结构
什么是Linux? Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核.严格来讲,Linux这个词本身只表示Linux内核,但实际上人 ...