介绍

在很多微信H5应用里,当用户访问第三方应用时就需要进行微信网页授权,并且很多涉及安全的操作我们必须要先获取用户信息才能继续,本文章简单介绍了微信授权流程,并通过申请微信测试账号来模拟网页授权,用户在授权页点击确定登录后获取用户信息并显示在前端页面,最后效果如下图

工具及开发准备

1. 微信开发者工具及微信测试号

因为是微信授权,所以必须要在微信环境下使用,首先我们要在这里安装微信开发者工具,因为我们没有自己的应用,所以还需要在微信公众平台申请一个接口测试号,这个接口测试号就相当于我们的第三方应用。

2. 参数设置

登陆测试号后可以查看到自己的appId和appsecret信息,将体验接口权限表里的网页服务的网页授权获取用户基本信息修改为127.0.0.1:8800,该地址就是用户确认授权后回调的地址即我们应用的后台处理地址,如下图

最后拿出自己微信扫码关注该测试号即可,如下图所示

微信授权流程介绍

具体流程及详细介绍大家可以到官网微信公众平台技术文档查看,大致分为四步:

1. 引导用户进入授权页面同意授权,此时会调用微信api获取code

2. 授权通过后会带上code参数请求回调地址

3. 后台获取code,再次调用微信接口换取网页授权access_token和openid

4. 通过网页授权access_token和openid获取用户基本信息(如果有unionid还会获取到unionid参数)

正式开始

详细代码可以在github上下载,地址https://github.com/wangfengyuan/wxAuthorize 

1. 原始代码

let express = require("express");const https = require('https');
let app = express();
//appIDlet
appID = `wxec6fa9e9bc03d885`;
//appsecretlet
appSerect = `4c8a0d14cff08959b4e17334cabf9cf0`;
//点击授权后重定向url地址
let redirectUrl = `/getUserInfo`;
let host = `http://127.0.0.1:3000`;
//微信授权api,接口返回code,点击授权后跳转到重定向地址并带上code参数
let authorizeUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=`      `${host}${redirectUrl}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`
app.get("/login", function(req, res) {    res.sendFile(path.resolve(__dirname,'login.html'));
});
app.get("/auth", function(req, res) {    res.writeHead(302, {    'Location': authorizeUrl  });    res.end();
});
app.get("/getUserInfo", function(req, res) {    let code = req.query.code;    let getaccess = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=`   `${appID}&secret=${appSerect}&code=${code}&grant_type=authorization_code`;    //通过拿到的code和appID、app_serect获取access_token和open_id    https.get(getaccess, (resText) => {        var ddd = "";        resText.on('data', (d) => {ddd  = d;        });resText.on('end', () => {// console.log(ddd);var obj = JSON.parse(ddd);var access_token = obj.access_token; var open_id = obj.openid;            //通过上一步获取的access_token和open_id获取userInfo即用户信息let getUserUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${open_id}&lang=zh_CN`;https.get(getUserUrl, (resText) => {user = "";resText.on('data', (d) => {user  = d;});resText.on('end', () => {console.log(user);var userobj = JSON.parse(user);res.send(userobj);console.log(userobj);});})        });}).on('error', (e) => {console.error(e);}); app.listen(3000);

具体使用时要将appID和appSerect换成你对应的参数即可,因为我们的请求是要按一定顺序的,但是node发送请求是异步的,所以我们的请求嵌套了三层,代码很难看,所以这里可以采用ES6的async和await解决异步回调地狱。

2. 使用ES6的async和await的改进代码

async function wxAuth(req, res) {//解析querystring获取URL中的code值    let code = req.query.code;//通过拿到的code和appID、app_serect获取返回信息let resObj = await getAccessToken(code);//解析得到access_token和open_idlet access_token = resObj.access_token;let open_id = resObj.openid;//通过上一步获取的access_token和open_id获取userInfo即用户信息let userObj = await getUserInfo(access_token, open_id);console.log(userObj);res.render(path.resolve(__dirname,'userInfo.ejs'), {userObj: userObj});// res.send(userObj);}//通过拿到的code和appID、app_serect获取access_token和open_id
function getAccessToken(code) {return new Promise( (resolve, reject) => {let getAccessUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=`   `${appID}&secret=${appSerect}&code=${code}&grant_type=authorization_code`;https.get(getAccessUrl, (res) => {var resText = "";res.on('data', (d) => { resText  = d; });res.on('end', () => {var resObj = JSON.parse(resText);resolve(resObj);});}).on('error', (e) => {console.error(e);});});}
//通过上一步获取的access_token和open_id获取userInfo即用户信息
function getUserInfo(access_token, open_id) {return new Promise( (resolve, reject) => {let getUserUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${open_id}&lang=zh_CN`;https.get(getUserUrl, (res) => {var resText = ""; res.on('data', (d) => {resText  = d;});res.on('end', () => {var userObj = JSON.parse(resText);resolve(userObj);});}).on('error', (e) => {console.error(e);});})}

修改后代码流程清晰了很多,最后点击确认登陆后将获取到的userObj通过ejs模板渲染在前端页面,就能看到文章最开始展现的效果图。

写在最后

我前端刚入门没多久,最近在公司实习,受到身边同事影响,所以也开始写文章来记录自己的学习心得,这是我第一次写文章,所以可能写的不太好,大家对文章和代码有什么建议欢迎提出来一起交流,谢谢!

微信网页授权并获取用户信息相关推荐

  1. 微信公众号网页授权,获取用户信息以及openid -- PHP后台

    微信公众号网页授权,获取用户信息以及openid 这几天做项目,想通过公众号的appid获取用户的openid就,然后在网上查资料,问朋友,最后找到了方法,就是这个网页授权. 起初一直很蒙,这个怎么弄 ...

  2. 公众号h5获取手机号权限_微信公众号开发之网页授权(获取用户信息)

    这次暑假留在学校参与工作室的项目,对微信公众号比较感兴趣,所以参与这方面的学习研究. 昨天完成了关于网页授权,获取用户信息方面的功能,所以乘热打铁,写上一篇.实现本篇涉及的 功能,还需要完成一些基础. ...

  3. 微信公众号开发__微信网页授权并获取用户基本信息(是否关注公众号、头像、昵称等)

    本人最近要做微信公众号网页开发的项目,其中有个需求是判断用户是否关注公众号,由于之前没有接触过微信授权的东西,所以提前开始做调研.在度娘上看了好多博客.百度知道.百度经验.知乎问答等,还仔细阅读了微信 ...

  4. 微信登录——授权登录获取用户信息

    引言 实现微信扫码登录关键之处就是获取到微信用户信息,那么这就涉及到了微信授权,通过微信授权我们可以获取到用户信息:微信官方文档写的还是比较详细的,但是没有代码演示,这里我就用代码演示一下如何实现微信 ...

  5. 微信开发笔记——微信网页登录授权,获取用户信息

    开源源码下载,请参照csdn下载:  http://download.csdn.net/detail/kingmax54212008/9453082 最近做了一个公司的微信的公众号,对微信的流程清楚了 ...

  6. 支付宝微信(登录授权,获取用户信息,支付)

    支付宝登录授权: https://docs.open.alipay.com/20160728150111277227/intro 支付宝获取用户信息: https://docs.open.alipay ...

  7. 微信公众号开发之网页授权认证获取用户的详细信息,实现自动登陆

    原创声明:本文转来源本人另一博客[http://blog.csdn.net/liaohaojian/article/details/70175835]绝非他人处转载 从接触公众号到现在,开发维护了2个 ...

  8. (微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆)http://blog.csdn.net/liaohaojian/article/details/70175835

    从接触公众号到现在,通过不断积累学习,对如何调用微信提供接口有了一定的见解.当然在开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事,必先利其器,先看看开 ...

  9. 微信网页授权,获取微信code,获取access_tocken,获取用户信息

    微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权! 1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的" ...

最新文章

  1. C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()
  2. 规则就够用?还是必须上机器学习?46页ppt教你如何把规则引擎和机器学习融会贯通...
  3. opengl之自动纹理
  4. springmvc4 ajax 406,Spring4 MVC 中,jQuery ajax (406 Not Acceptable)
  5. Ubuntu返回到Gnome经典桌面!
  6. [笔记]C#基础入门(十四)——C#用流程图描述程序逻辑
  7. C#开发XML WebService接口(SOAP)
  8. android 阿里云 maven,Android SDK接入(Maven集成)
  9. Android优化系列之apk瘦身
  10. git配置用户信息_git系列教程(4)-单用户配置
  11. Linux学习笔记-Makefile优化之头文件依赖
  12. 开源视频会议系统:OpenMeetings 安装方法
  13. Zabbix 5.0 下载安装和中文乱码处理
  14. Linux下的通用打开命令
  15. 解决在VsCode中使用CodeRunner中文乱码
  16. Kaminari分页
  17. 微信小程序 环形进度条_微信小程序实现圆形进度条
  18. php新浪微博 登录接口文档,php新浪微博登录接口用法实例,php新浪_PHP教程
  19. 15.Elasticsearch 7.15 Query DSL 之 Wildcard查询、Regexp查询
  20. Android 10(Q)GMS(cts/vts/gts)认证总结

热门文章

  1. IPA第八届少儿模特明星盛典 福州赛区 初赛圆满收官
  2. python分句_Python 中文分句 | 学步园
  3. Hadoop安装配置
  4. 草图vr3.6许可证服务器安装失败,SU2018装Vray3.6出现这个是怎么回事啊
  5. 如何拍出优秀风景摄影作品
  6. 【HTML5】Web前端——第三课:HTML5 表单相关元素和属性
  7. VLC for Android源码下载和编译
  8. win10虚拟机dhcp服务器,怎么解决win10系统关闭虚拟机开机停在dhcp无法启动的问题...
  9. 最近很火的ChatGPT和GPT4
  10. 关于苹果公证(Apple Notarizition)机制的一些总结