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(三)--- Node.js模块
May 25 NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
Jan 04 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
在nodejs中创建child process的方法
Jan 26 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
生成php程序的php代码
2008/04/07 PHP
php xml 入门学习资料
2011/01/01 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
JS原型对象通俗"唱法"
2012/12/27 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
Python yield 使用浅析
2015/05/28 Python
Python实现的购物车功能示例
2018/02/11 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
python实现大学人员管理系统
2019/10/25 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
一款基于css3的动画按钮代码教程
2014/11/23 HTML / CSS
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
试用期员工考核制度
2014/01/22 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
教师节表彰会主持词
2015/07/06 职场文书
运动会广播稿20字
2015/08/19 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers