/* jshint -W079 */
/* jshint -W020 */ "use strict";
var _ = require("lodash");
var sha1 = require('sha1');
var urlencode = require('urlencode');
var request = require('request');
var express = require('express');
var router = express.Router(); module.exports = function(app) { /* 微信中继接口 */
router.get('/wechat/ticket', function (req, res) {
var page = req.query.page; if (page && page.indexOf('from=singlemessage') > 0 && page.indexOf('&isappinstalled=0') < 0) {
page = page + "&isappinstalled=0";
} WeChatTicket.findOne({appid: appid}).exec(function (err, ticket) {
if (_.isEmpty(ticket)) refreshTicket(appid, appsecret, page, null, res);
else {
var difference = parseInt(new Date().getTime() / 1000) - ticket.at;
if (difference > 7100) refreshTicket(appid, appsecret, page, ticket, res);
else {
var json = ticket.toJSON(); var timestamp = parseInt(new Date().getTime() / 1000);
json.at = timestamp;
json.signature = wechatSignature(ticket, page, timestamp); res.json({ticket: json});
}
}
});
}); // 微信 access_token 接口
router.get('/wechat/access_token', function (req, res) {
getToken(appid, appsecret, function(token, error) {
if(error) console.error(error);
res.json(token);
});
}); function getToken(appid, appsecret, cb) {
WeChatAccessToken.findOne({appid: appid}, function (err, token) {
if(token) {
var difference = parseInt(new Date().getTime() / 1000) - token.at;
if (difference > 7100) refreshToken(appid, appsecret, function(data, err) { cb(data, err); });
else cb(token, null);
} else refreshToken(appid, appsecret, function(data, err) { cb(data, err); });
});
} function refreshToken(appid, appsecret, cb) {
var access_token_api = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
var url = access_token_api.replace('APPID', appid).replace('APPSECRET', appsecret); // 参考请求: http://localhost:7000/wechat/ticket?appid=wx8160a61c2d53fb74&appsecret=aa2c953465334823e20090156527a957
request.get(url, function (error, response, body) {
if (body) {
WeChatAccessToken.findOne({appid: appid}, function (err, token) {
if (!token) token = new WeChatAccessToken();
var data = JSON.parse(body); token.appid = appid;
token.access_token = data.access_token;
token.expires_in = data.expires_in;
token.at = parseInt(new Date().getTime() / 1000);
token.save(function (err) { cb(token, err); });
});
} else cb(null, error);
});
} function refreshTicket(appid, appsecret, page, ticket, res) {
getToken(appid, appsecret, function (token, err) {
if (err === null) {
if (!_.isEmpty(token.access_token)) {
// 获取 jsapi_ticket
var ticket_url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' + token.access_token + '&type=jsapi'; request.get(ticket_url, function (error, response, body) {
var t = ticket === null ? new WeChatTicket() : ticket;
var data = JSON.parse(body); if(!data.ticket) res.json({error: response});
else {
t.appid = appid;
t.ticket = data.ticket;
t.noncestr = sha1(new Date());
t.expires_in = data.expires_in;
t.at = parseInt(new Date().getTime() / 1000); var timestamp = parseInt(new Date().getTime() / 1000);
var signature = wechatSignature(t, page, timestamp); t.save(function (err) {
var json = t.toJSON();
json.at = timestamp;
json.signature = signature;
res.json({ticket: json, error: err});
});
}
});
} else res.json({error: err});
} else res.json({error: err});
});
} /* 微信签名实现 */
function wechatSignature(t, page, timestamp) {
var string = "jsapi_ticket=" + t.ticket + "&noncestr=" + t.noncestr + "&timestamp=" + timestamp + "&url=" + page;
return sha1(string);
} /* 微信授权接口 */
router.get('/wechat/userinfo', function(req, res) {
var cb = req.query.cb;
res.cookie(wechat_userinfo_callback_url, cb);
var url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://m.moretao.com/wechat/userinfo/callback&response_type=code&scope=snsapi_userinfo#wechat_redirect";
res.redirect(url);
}); router.get('/wechat/userinfo/callback', function(req, res) {
var code = req.query.code;
var url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code";
request.get(url, function(error, response, body) {
var json = JSON.parse(body); var refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + appid + "&grant_type=refresh_token&refresh_token=" + json.refresh_token; request.get(refresh_url, function(error, response, refresh) {
var json = JSON.parse(refresh);
var info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + json.access_token + "&openid=" + json.openid + "&lang=zh_CN";
request.get(info_url, function(error, response, info) {
var callback = req.cookies[wechat_userinfo_callback_url];
var str = "?data=";
if(callback && callback.indexOf('?') > -1) str = "&data=";
var ret = callback + str + encodeURIComponent(info);
res.redirect(ret);
});
});
});
}); /* 微信静默授权接口 */
router.get('/wechat/silent', function(req, res) {
var cb = req.query.cb;
res.cookie(wechat_silent_callback_url, cb);
var url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://m.moretao.com/wechat/silent/callback&response_type=code&scope=snsapi_base#wechat_redirect";
res.redirect(url);
}); router.get('/wechat/silent/callback', function(req, res) {
var code = req.query.code;
var url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code"; request.get(url, function(error, response, body) {
var callback = req.cookies[wechat_silent_callback_url];
var str = "?data=";
if(callback.indexOf('?') > -1) str = "&data=";
res.redirect(callback + str + body);
});
}); return router;
};

nodejs微信开发获取token,ticket-1的更多相关文章

  1. 微信开发-ACCESS TOKEN 过期失效解决方案

    微信开发-ACCESS TOKEN 过期失效解决方案 起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一 ...

  2. 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)   在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...

  3. Nodejs微信开发使用wechat-api回复多条消息

    在上一往篇文章<Nodejs微信开发>中,微信后台能够正常的接收到客户端的消息,并能够简单的回复一条消息至客户端. 但我的目录是将微信与Bot Framework进行关联,那么肯定就有一些 ...

  4. 微信开发获取地理位置实例(java,非常详细,附工程源码)

    在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一些必要的配置,以及如何调用微信接口. 2.微信开发之通过代理调试 ...

  5. 微信开发获取media_id错误码汇总

    微信开发遇到的错误汇总: 1. 错误代码40001 "errcode": 40001,    "errmsg": "invalid credentia ...

  6. 解析nodejs微信开发-2获取ticket

    获取ticket是需要拼接url,url中需要获得的tocken 1.先判断有无tocken:若有则拼接url: 2.请求url: a.处理回调数据,注意时间戳和签名处理方式,此两项并未存到ticke ...

  7. Nodejs微信开发

    因为使用了Bot Framework开发了一个小功能,它目前支持了Skype\Teams\Slack等,但在国内来讲,微信还是一个比较流行的软件,所以需要接上微信 原来开发Bot的时候使用的是.Net ...

  8. 微信定时获取token

    为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相 ...

  9. 微信开发获取用户OpenID

    第一次开发微信版网页,对最重要的获取微信OpenId,特此记录下来 1.首先得有appid和appsecret . public class WeiXin { public static string ...

随机推荐

  1. 安装ecshop出错

    在安装Ecshop的时候,遇到两个问题: 1.Strict Standards: Non-static method cls_image::gd_version() should not be cal ...

  2. python学习day2(二)

    1.类与对象的关系 对于Python,一切事物都是对象,对象基于类创建 type是获取类的 dir是获取这个类里面的成员 2.int内部功能介绍 bit_length:返回表示当前数字占用的最少位数: ...

  3. Es分析

    http://my.oschina.net/lxbzj/blog/138587 http://donlianli.iteye.com/blog/1923017 http://tangzhaohui.n ...

  4. C++箴言:理解 new-handler的行为

    当 operator new 不能满足一个内存分配请求时,它抛出一个 exception(异常).很久以前,他返回一个 null pointer(空指针),而一些比较老的编译器还在这样做.你依然能达到 ...

  5. .net c# 正则表达式 平衡组/递归匹配

    原文 http://www.cnblogs.com/qiantuwuliang/archive/2011/06/11/2078482.html 平衡组/递归匹配 这里介绍的平衡组语法是由.Net Fr ...

  6. perl 继承写法

    use base (Critter); 和 BEGIN{ require Critter; @ISA=qw/Critter/; } 这两种写法是等价

  7. 第52周四ApplicationContext

    ApplicationContext的中文意思是"应用前后关系"应用上下文即容器,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持.资 ...

  8. 面试题25:最小的K个数

    方法一:对n个整数进行排序(快速排序或堆排序),取出前K个元素(最容易想到的最笨的方法,不可取) 时间复杂度:O(n*logn) + O(k) = O(n*logn) 采用快速排序的代码: #incl ...

  9. 404 Not Found The requested URL * was not found on this server

    1. 把从SVNcheckout下来的代码搭建起来.CakePHP+mysql.改动数据库配置. 2. 配置虚拟主机,发现訪问不了/user/login这个URL,报这个错误:404 Not Foun ...

  10. 百度Android语音识别SDK语义理解与解析方法

    百度语义理解开放平台面向互联网开发人员提供自然语言文本的解析服务,也就是能够依据文本的意图解析成对应的表示. 为了易于人阅读,同一时候也方便机器解析和生成,意图表示协议採用 json 语言进行描写叙述 ...