nodejs微信开发之授权登录+获取用户信息


Posted in NodeJs onMarch 17, 2019

上一篇:获取access_token+自定义菜单

这部分代码是之前就已经完成了,但是考虑篇幅的问题就和上篇分开了,这部分相较前面的方式较为复杂一点,但是也是很容易理解的。

这里简单介绍一下微信网页授权。

微信网页授权配置回调域名:

注:下面引自官方文档

1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;

2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权。

比如:需要授权的网页域名为http://xiadd.weixin.qq.com/demo,那么需要配置回调域名为xiadd.weixin.qq.com。其他域名同理。配置图示如下:

在权限里找到这部分,点击修改。

nodejs微信开发之授权登录+获取用户信息

将回调域名改为自己需要的域名:

nodejs微信开发之授权登录+获取用户信息

这样回调域名就修改成功了。

授权登录

关于授权登录的各种参数细节这里就不多说了,但是这里也有一个access_token需要注意一下,和全局缓存的那个注意不要搞混了(话说tx为啥不做一下命名区分)。这里的access_token是oauth的一个凭证,全局缓存的那个是调用微信公众平台各个基础接口所要用到的凭证。
具体而言,网页授权流程分为四步:
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息
这里的第三步不是必须的,这里先不提,也就是授权登录主要是三部分。引导用户点击相应链接获取code,code换区access_token,通过access_token去的相应信息。

引导用户获取code

因为授权登录的权限较高,所以微信平台会对链接的顺序进行校验,顺序是固定的。链接格式如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

其中appid是固定的,就是公众号的appid。
redirect_uri就是授权成功后需要跳转到的链接。
response_type是固定的就是code。
scope就是授权权限,主要有两种:snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)。

这里的scope以snsapi_userinfo为例,获取用户的信息。点进链接进入到授权页面。如图:

nodejs微信开发之授权登录+获取用户信息

授权后得到url形式如下。code就包含在url里:

nodejs微信开发之授权登录+获取用户信息

这样code就得到了。code只能使用一次,5分钟未被使用自动过期。

通过code换取网页授权access_token

再次提醒,这里的access_token和全局缓存的access_token是不一样的。具体返回参数请看文档,这里不一一列出了。
得到code后,通过get请求https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code,参数分别为appid,appsecret,和前一步获取的code,虽然这里可以通过浏览器进行请求,但是因为安全级别高,所以千万在服务端进行请求。代码如下:

//getWebToken.js
function getToken(code) {
 let reqUrl = 'https://api.weixin.qq.com/sns/oauth2/access_token?';
 let params = {
 appid: config.appId,
 secret: config.appSecret,
 code: code,
 grant_type: 'authorization_code'
 };

 let options = {
 method: 'get',
 url: reqUrl+qs.stringify(params)
 };
 console.log(options.url);
 return new Promise((resolve, reject) => {
 request(options, function (err, res, body) {
  if (res) {
  resolve(body);
  } else {
  reject(err);
  }
 })
 })
}

就是很简单的一个请求得到想要的数据。但是注意得到的数据是个字符串,需要进行处理,响应格式如下:

nodejs微信开发之授权登录+获取用户信息

对于scope为snsapi_base的授权,这里是最后一步,会返回openid。如果需要再进行下一步。

拉取用户信息

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
请求方法
http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
这里也很简单。直接看代码:

function getUserInfo(AccessToken, openId) {
 let reqUrl = 'https://api.weixin.qq.com/sns/userinfo?';
 let params = {
 access_token: AccessToken,
 openid: openId,
 lang: 'zh_CN'
 };

 let options = {
 method: 'get',
 url: reqUrl+qs.stringify(params)
 };
 
 return new Promise((resolve, reject) => {
 request(options, function (err, res, body) {
  if (res) {
  resolve(body);
  } else {
  reject(err);
  }
 });
 })
}

具体响应到网页上如图所示:

nodejs微信开发之授权登录+获取用户信息

这样就通过授权登录拉取到了用户信息。

github地址奉上:https://github.com/xiadd/shorthand 欢迎star

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
nodejs中使用monk访问mongodb
Jul 06 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 #NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 #NodeJs
NodeJs入门教程之定时器和队列
Mar 08 #NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 #NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 #NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 #NodeJs
Nodejs让异步变成同步的方法
Mar 02 #NodeJs
You might like
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
python函数返回多个值的示例方法
2013/12/04 Python
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
Python内置函数delattr的具体用法
2017/11/23 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
PyTorch中的Variable变量详解
2020/01/07 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
考试没考好检讨书
2014/01/31 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
感恩的演讲稿
2014/05/06 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
领导参观欢迎词
2015/01/26 职场文书
离婚协议书样本
2015/01/26 职场文书
贫困生证明范文
2015/06/16 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
vue+echarts实现多条折线图
2022/03/21 Vue.js
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电
MySQL分区以及建索引的方法总结
2022/04/13 MySQL