接着上一个版本在上一个分离access-token和ticket的版本

上代码;

本次修改将获取token和ticket分离出来,分别封装在函数中;

每个函数最后一个参数是一个回调参数;

回调函数的参数,是这一步中需要处理的结果;

结果怎么处理,根据传递进去的函数;

 1 var express = require(‘express‘);
 2 var cookieParser = require(‘cookie-parser‘);
 3 var bodyParser = require(‘body-parser‘);
 4 var OAuth = require(‘wechat-oauth‘);
 5 var request = require(‘request‘);
 6 var sha1 = require(‘sha1‘);
 7 var path = require(‘path‘);
 8 var app = express();
 9 app.use(bodyParser.json());
10 app.use(bodyParser.urlencoded({ extended: false }));
11 app.use(cookieParser());
12 app.use(express.static(‘public‘));
13 var port = 18080;
14 var appid = ‘wx75340481908402a8‘;
15 var appsecret = ‘2b6ee0cbeec0114eb539e68ba356329b‘;
16
17 //首先拼接url
18 var  url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx75340481908402a8&redirect_uri=http%3a%2f%2fwechatapp1.duapp.com%2fcallback&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"
19 app.get(‘/test‘,function(req,res){
20     res.redirect(url);
21 });
22 //四步请求打法;
23 //第一步:获得code;
24 app.get(‘/callback‘,function(req,res){
25     var code  = req.query.code;
26     var url = ‘https://api.weixin.qq.com/sns/oauth2/access_token?appid=‘ + appid + ‘&secret=‘ + appsecret + ‘&code=‘ + code + ‘&grant_type=authorization_code‘;
27     //第二步:获得token
28     request.get(url,function(err,response,body) {
29         var json = JSON.parse(body);
30         var refreshUrl = ‘https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=‘ + appid + ‘&grant_type=refresh_token&refresh_token=‘ + json.refresh_token;
31         //第三步:获得refreshtoken和openId;
32         request.get(refreshUrl,function (err,response,refresh) {
33             var json = JSON.parse(refresh);
34             var infoUrl = ‘https://api.weixin.qq.com/sns/userinfo?access_token=‘ + json.access_token + ‘&openid=‘ + json.openid + ‘&lang=zh_CN‘;
35             //第四步:通过上一步刷新得来的refresh和openId请求用户信息;
36             request.get(infoUrl,function(err,response,info) {
37                 var info = JSON.parse(info);
38                 res.send(info);
39             });
40         });
41     });
42 });
43 //分离access_token和jsapi_sdk;
44 //获取token;
45 function getToken(appid,appsecret,cb){
46     var url = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=‘+appid+‘&secret=‘+appsecret;
47     request.get(url,function(err,response,body) {
48         var token = JSON.parse(body);
49         cb(token);
50     })
51 }
52 //分离ticket
53
54 function getTicket(page,appid,appsecret,cb) {
55     getToken(appid,appsecret,function(token) {
56         var ticketUrl = ‘https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=‘ + token.access_token + ‘&type=jsapi‘;
57         request.get(ticketUrl, function(err, response, ticket) {
58             var data = JSON.parse(ticket);
59             var timestamp = parseInt(new Date().getTime() / 1000);
60             t.ticket = data.ticket;
61             t.noncestr = sha1(new Date());
62             t.timestamp = timestamp;
63             var string = ‘jsapi_ticket=‘ + t.ticket + ‘&noncestr=‘ + t.noncestr + ‘&timestamp=‘ + timestamp + ‘&url=‘ + page;
64             t.signature = sha1(string);
65             cb(t);
66         });
67     });
68 }
69
70 var t = {};
71 //1、设置api接口,使前端通过ajax可以获取jsapi-sdk;
72 app.get(‘/wechat/ticket‘,function (req, res) {
73     var page = req.query.page;
74
75     getTicket(page,appid,appsecret,function(data,err) {
76         res.json(data);
77     })
78 });
79
80
81
82 app.listen(port);
时间: 2024-10-07 09:15:25

接着上一个版本在上一个分离access-token和ticket的版本的相关文章

头像截图上传三种方式之一(一个简单易用的flash插件)(asp.net版本)

flash中有版权声明,不适合商业开发.这是官网地址:http://www.hdfu.net/ 本文参考了http://blog.csdn.net/yafei450225664/article/details/12855915     并且加入了自己的解析,以供之后的参考. 官网提供的demo包,包含了php,jsp,asp,aspx的demo. 1.Demo中,avatar.swf是执行上传的flash文件:default.jpg是默认显示的图片:demo.html是demo,可以直接复制里面

HBase底层存储原理——我靠,和cassandra本质上没有区别啊!都是kv 列存储,只是一个是p2p另一个是集中式而已!

理解HBase(一个开源的Google的BigTable实际应用)最大的困难是HBase的数据结构概念究竟是什么?首先HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式. Google's BigTable论文 清楚地解释了什么是BigTable: Bigtable是一个疏松的分布式的持久的多维排序的map,这个map被行键,列键,和时间戳索引.每一个值都是连续的byte数组.(A Bigtable is a sparse

在ubuntu上使用wxWidgets成功开发一个图形界面程序

编译wxWidgets 下载最新版的源码,wxWidgets-3.0.2.wxWidgets在liunx是通过wxGTK实现的.wxGTK和wxWidgets的源码打包在一起.wxGTK依赖GTK+,当前版本依赖高于2.8.2的版本.我安装了3.0版本的GTK+.apt-get install gtk+-3.0-dev.一般开发用的库,都有个-dev结尾,这是个约定.开发用的库包含了头文件和文档之类的东西. 为了让不同平台wxWidgets编译之后放到各自的文件夹下,先在解压得到的文件夹下创建一

使用MJRefresh遇到的一个问题,上拉刷新后tableview瞬间滑到最底部

最近用MJRefresh上拉刷新时遇到一个问题,就是上拉刷新后,tableview会瞬间滑到最底部,用户还要往回翻才能看到新刷出来的数据,体验十分不好.查了很久没找到原因,最后发现在refreshview停止动画前,我代码里调用了两次tableview reloaddata,抱着尝试的心理,我改了代码结构,删除了一个tableview reloaddata,结果还真被我蒙对了!原因不明,可能是tableview的一个小bug,也可能是我的 MJRefreshView版本太老,是时候更新一下这个第

Jenkins Pipeline+Docker实现流水线自动化构建(上百个项目共用一个脚本方案)

Jenkins Pipeline是一套插件,支持将连续输送Pipeline实施和整合到Jenkins.Pipeline提供了一组可扩展的工具,用于通过PipelineDSL为代码创建简单到复杂的传送Pipeline. 对于单个项目来说,使用这样的Pipeline来构建能够满足绝大部分需求,但是这样做也有很多缺陷,包括: 多个项目的Pipeline打包脚本不能公用,导致一个项目写一份脚本,维护比较麻烦.Jenkins提供了一个更优雅的管理Pipeline脚本的方式,在配置项目Pipeline的时候

设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话。并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击。

收集购物信息  iOS项目 倒计时:588 步骤 /.panel-heading 项目需求 设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话.并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击. #import "TableViewController.h" @interface TableViewController ()<UIAlertViewDelegate> @property (nonatomic, strong)

一个项目中哪些文件是要上传到 git上的,哪些是不必要的

经过测试发现除了上面图中的代码,其他的都是要上传到git上的 , .project文件是一个很关键的文件

虚拟机评估——如何确定一个CPU核上部署的虚拟机数量?

最近研究虚拟化技术,不可避免遇到一个问题:如何评估物理主机上虚拟主机的容量?下面这篇文章的思路有一定的启发性,转发一下. 如何确定一个CPU核上部署的虚拟机数量? 摘要:本文说明一个CPU核上部署虚拟机的理想数量. 用户经常会问我这样一个问题,“在一个CPU核上部署虚拟机的理想数量是多少?”我试图从下面两个答案中其中一方面回答:要么用户基于业内测试实例做出决定,要么基于他们自己的桌面PC机来验证性能.评估CPU需求量. 用业内标准来评判,一个3.0GHz四核心双CPU的服务器通常可以负载的虚拟机

FMX相当于在界面上自己又做了一个小操作系统

FMX的自画界面我也不看好,比如复制粘贴,太丑了,系统做得很好很精细的复制粘贴界面,就是无法调出,比如MIUI,复制粘贴还能有个放大镜,可以选择到屏幕边缘的文字,可以选择剪贴板内多个可粘贴的文字:还有那个Memo,有的时候该折行的不折行,有的文字看不到了.文本输入框,隐藏剪贴板后,再点击就弹不出来了:系统本身的文本框就没有这个问题.底部输入框输入时自动上移界面,好像是操作系统本身就有的吧,FMX还得自己编很多代码,也不一定编好.自己编码补漏洞是另外一回事.FMX给我的感觉是在界面上自己又做了一个