nodejs微信开发获取token,ticket-1

  1 /* jshint -W079 */
  2 /* jshint -W020 */
  3
  4 "use strict";
  5 var _ = require("lodash");
  6 var sha1 = require(‘sha1‘);
  7 var urlencode = require(‘urlencode‘);
  8 var request = require(‘request‘);
  9 var express = require(‘express‘);
 10 var router = express.Router();
 11
 12 module.exports = function(app) {
 13
 14   /* 微信中继接口 */
 15   router.get(‘/wechat/ticket‘, function (req, res) {
 16     var page = req.query.page;
 17
 18     if (page && page.indexOf(‘from=singlemessage‘) > 0 && page.indexOf(‘&isappinstalled=0‘) < 0) {
 19       page = page + "&isappinstalled=0";
 20     }
 21
 22     WeChatTicket.findOne({appid: appid}).exec(function (err, ticket) {
 23       if (_.isEmpty(ticket)) refreshTicket(appid, appsecret, page, null, res);
 24       else {
 25         var difference = parseInt(new Date().getTime() / 1000) - ticket.at;
 26         if (difference > 7100) refreshTicket(appid, appsecret, page, ticket, res);
 27         else {
 28           var json = ticket.toJSON();
 29
 30           var timestamp = parseInt(new Date().getTime() / 1000);
 31           json.at = timestamp;
 32           json.signature = wechatSignature(ticket, page, timestamp);
 33
 34           res.json({ticket: json});
 35         }
 36       }
 37     });
 38   });
 39
 40 // 微信 access_token 接口
 41   router.get(‘/wechat/access_token‘, function (req, res) {
 42     getToken(appid, appsecret, function(token, error) {
 43       if(error) console.error(error);
 44       res.json(token);
 45     });
 46   });
 47
 48   function getToken(appid, appsecret, cb) {
 49     WeChatAccessToken.findOne({appid: appid}, function (err, token) {
 50       if(token) {
 51         var difference = parseInt(new Date().getTime() / 1000) - token.at;
 52         if (difference > 7100) refreshToken(appid, appsecret, function(data, err) { cb(data, err); });
 53         else cb(token, null);
 54       } else refreshToken(appid, appsecret, function(data, err) { cb(data, err); });
 55     });
 56   }
 57
 58   function refreshToken(appid, appsecret, cb) {
 59     var access_token_api = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
 60     var url = access_token_api.replace(‘APPID‘, appid).replace(‘APPSECRET‘, appsecret);
 61
 62     // 参考请求: http://localhost:7000/wechat/ticket?appid=wx8160a61c2d53fb74&appsecret=aa2c953465334823e20090156527a957
 63     request.get(url, function (error, response, body) {
 64       if (body) {
 65         WeChatAccessToken.findOne({appid: appid}, function (err, token) {
 66           if (!token) token = new WeChatAccessToken();
 67           var data = JSON.parse(body);
 68
 69           token.appid = appid;
 70           token.access_token = data.access_token;
 71           token.expires_in = data.expires_in;
 72           token.at = parseInt(new Date().getTime() / 1000);
 73           token.save(function (err) { cb(token, err); });
 74         });
 75       } else cb(null, error);
 76     });
 77   }
 78
 79   function refreshTicket(appid, appsecret, page, ticket, res) {
 80     getToken(appid, appsecret, function (token, err) {
 81       if (err === null) {
 82         if (!_.isEmpty(token.access_token)) {
 83           // 获取 jsapi_ticket
 84           var ticket_url = ‘https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=‘ + token.access_token + ‘&type=jsapi‘;
 85
 86           request.get(ticket_url, function (error, response, body) {
 87             var t = ticket === null ? new WeChatTicket() : ticket;
 88             var data = JSON.parse(body);
 89
 90             if(!data.ticket) res.json({error: response});
 91             else {
 92               t.appid = appid;
 93               t.ticket = data.ticket;
 94               t.noncestr = sha1(new Date());
 95               t.expires_in = data.expires_in;
 96               t.at = parseInt(new Date().getTime() / 1000);
 97
 98               var timestamp = parseInt(new Date().getTime() / 1000);
 99               var signature = wechatSignature(t, page, timestamp);
100
101               t.save(function (err) {
102                 var json = t.toJSON();
103                 json.at = timestamp;
104                 json.signature = signature;
105                 res.json({ticket: json, error: err});
106               });
107             }
108           });
109         } else res.json({error: err});
110       } else res.json({error: err});
111     });
112   }
113
114   /* 微信签名实现 */
115   function wechatSignature(t, page, timestamp) {
116     var string = "jsapi_ticket=" + t.ticket + "&noncestr=" + t.noncestr + "&timestamp=" + timestamp + "&url=" + page;
117     return sha1(string);
118   }
119
120   /* 微信授权接口 */
121   router.get(‘/wechat/userinfo‘, function(req, res) {
122     var cb = req.query.cb;
123     res.cookie(wechat_userinfo_callback_url, cb);
124     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";
125     res.redirect(url);
126   });
127
128   router.get(‘/wechat/userinfo/callback‘, function(req, res) {
129     var code = req.query.code;
130     var url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code";
131     request.get(url, function(error, response, body) {
132       var json = JSON.parse(body);
133
134       var refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + appid + "&grant_type=refresh_token&refresh_token=" + json.refresh_token;
135
136       request.get(refresh_url, function(error, response, refresh) {
137         var json = JSON.parse(refresh);
138         var info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + json.access_token + "&openid=" + json.openid + "&lang=zh_CN";
139         request.get(info_url, function(error, response, info) {
140           var callback = req.cookies[wechat_userinfo_callback_url];
141           var str = "?data=";
142           if(callback && callback.indexOf(‘?‘) > -1) str = "&data=";
143           var ret = callback + str + encodeURIComponent(info);
144           res.redirect(ret);
145         });
146       });
147     });
148   });
149
150   /* 微信静默授权接口 */
151   router.get(‘/wechat/silent‘, function(req, res) {
152     var cb = req.query.cb;
153     res.cookie(wechat_silent_callback_url, cb);
154     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";
155     res.redirect(url);
156   });
157
158   router.get(‘/wechat/silent/callback‘, function(req, res) {
159     var code = req.query.code;
160     var url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code";
161
162     request.get(url, function(error, response, body) {
163       var callback = req.cookies[wechat_silent_callback_url];
164       var str = "?data=";
165       if(callback.indexOf(‘?‘) > -1) str = "&data=";
166       res.redirect(callback + str + body);
167     });
168   });
169
170   return router;
171 };
时间: 2024-12-19 15:05:44

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

php 微信开发获取用户信息如何实现

php 微信开发获取用户信息 获取用户信息的大致算法是 用户授权登录第三方网站, 重点:scope参数: snsapi_basic 静默登录,不需要用户授权,只能获取到openid: snsapi_userinfo ,需要用户点击授权,能获取到openid和所有用户信息: 第一步:先获取用户的code值: 第二步:根据code值去获取access_token,每次请求的值都不一样,如果没有使用,每五分钟更新一次: 第三步:根据access_token获取用户信息: 1.获取code代码实现: g

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

获取ticket是需要拼接url,url中需要获得的tocken 1.先判断有无tocken:若有则拼接url: 2.请求url: a.处理回调数据,注意时间戳和签名处理方式,此两项并未存到ticket中, b.存储回调数据,存储时将时间戳和签名存到ticket中:注意此两项并未存到数据库,而是在存储时动态生成的时间戳和签名,签名还有一个签名函数: c.返回存储数据. 1 function refreshTicket(appid, appsecret, page, ticket, res) {

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

起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一天调用2000次.流量一高,就over了,没办法,龙哥不帮我们解决问题,我们就要自己解决,不能等死. 解决思路很简单:建立公共access token数据,有效期内不重新创建access_token. 解决方案:1.微信类库:有效期内直接读取access token数据文件中的json数据,过期失效,重新获取并创建新的access token数据文件2.数据文件

微信定时获取token

为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证. access_token的有效期是7200秒(两小时),在有效期内,可以一直使用,只有当access_token过期时,才需要再次调用接口获取access_token.在理想情况下,一个7x24小时运行的系统,每天只需

c#调用微信接口获取token值

废话不说,一个方法实现,这里的url 参数即为配置好的访问路径, string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + AppID + "&secret=" + AppSecret; 这里的两个参数AppID.AppSecret对应微信公众账号 public static string GetPage(string ur

微信开发--获取用户openID

<?php//获取用户openid //公众号配置跳转至该页面 //https://mp.weixin.qq.com/advanced/selfmenu?action=index&t=advanced/menu-setting&token=1089922883&lang=zh_CN$appid="";$appsecret="";// $client_credential=client_credential;$url="http

mysql保存emoji表情(微信开发用户昵称..)

  java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'name' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) at com.mysql.jdbc.MysqlIO.

【微信开发】2、全局Token获取

Token就是应用服务器访问微信服务器的凭证,微信服务器对这个Token设置一个有效期. 由于Token接口获取有一定的限制,不宜频繁获取,Token在一段时间内也有效,也没有必要不停的获取. 按照官方文档建议,业务服务器保存到本地,有效期之前,各个业务模块本地获取即可. 一.官方文档 http GET方法获取 http请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPI

微信js-sdk开发获取签名和获取地理位置接口示例

### 微信js-sdk开发获取签名和获取地理位置接口示例 前言:在做微信公众号开发时需要获取用户的地理位置信息,之前通过高德或者百度.腾讯等地图的api时发现经常获取不到,毕竟第三方的东西,后来改为采用微信内置的js-sdk中的获取地理位置接口,在这主要记录下签名的获取(麻烦点)和一个获取地理位置的例子. 准备工作: 微信测试号appid和appsecret 获取地址:微信测试账号获取 在测试账号里先填写接口配置信息和js接口安全域名(这个是必须的) 示例:页面中需要点击图标获取地理位置信息