H5 及 web 页面微信授权登录流程

2023-11-17

一、事先准备工作

配置参数测试公众平台信息(测试号相关配置示例):

1、打开公众平台的测试账号

在这里插入图片描述

2、配置js接口安全域名

在这里插入图片描述

3、扫码关注测试公众号

在这里插入图片描述

4、修改网页授权地址

在这里插入图片描述
配置授权回调的域名,至于什么是OAuth2.0,大家自行百度吧。这里的域名也要与上面的域名一致。配置成功会有通过安全监测的提示,这里不上截图了。
在这里插入图片描述
注意:

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鉴权

以上信息配置正确后。将参数传给后端(redirect_uri 需要 urlEncode 对链接进行处理后端更好处理)拼接起来。用返回的地址 window.locahost.href=‘xxxx’。调整新的地址并携带 code

二、授权登录

1、微信登录的几种情况:

PC端:

PC端微信浏览器 -> 网页内嵌二维码方式(需要扫码,使用微信服务号的 appid 和 appsecret)

PC端其他浏览器 -> 跳转微信的扫码登录页面(需要扫码,使用微信开放平台注册的PC应用 appid 和 appsecret)

移动端:

微信客户端打开 -> 直接调用微信授权(不扫码,使用微信服务号的 appid 和 appsecret)

其他手机浏览器打开 -> 跳转微信的扫码登录页面(需要扫码,使用微信开放平台注册的PC应用 appid 和 appsecret)

2、区分是否是PC环境的方法:
2.1、判断是PC环境还是移动环境是为了相应切换应用的布局,目前采用css媒体查询来做判断:
/* 屏幕宽度小于等于1070像素时识别为移动端(1070像素是使推荐页常用情报站栏不现实滚动条的最小宽度) */
@media screen and (max-width: 1070px) {
    /* 移动端布局css样式 */
}
/* 屏幕宽度大于1071像素识别为PC端 */
@media screen and (min-width: 1071px) {
    /* PC端布局样式 */
}

2.2、js判断客户端是PC端还是移动端访问

function IsPC(){  
     var userAgentInfo = navigator.userAgent;
     var Agents = new Array("Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod");  
     var flag = true;  
     for (var v = 0; v < Agents.length; v++) {  
         if (userAgentInfo.indexOf(Agents[v]) > 0) { flag = false; break; }  
     }  
     return flag;  
  }
if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
    //alert(navigator.userAgent);  
    window.location.href ="iPhone.html";
} else if (/(Android)/i.test(navigator.userAgent)) {
    //alert(navigator.userAgent); 
    window.location.href ="Android.html";
} else {
    window.location.href ="pc.html";
};

3、PC网页微信授权登录
3.1、网页外链跳转的方式

1)、请求后台的接口,会返回一个微信扫码的界面地址,使用js跳转过去即可

wxlogin () {
       User.wxlogins().then(res => {
        console.log(res)
        window.location.href = res.result.url
      })
},

2)、用户在扫完码点击确定授权后,后台会拿到微信授权用户的信息后,会帮我们跳转到事先给后台重定向的地址页面(这里我是新建了一个空白页用来接收后台返回的数据),在地址后面后台会拼接一个token,我们拿到这个token,去获取用户信息,跳转到首页,即可完成登录

let token = this.$route.query.token
    if (token) {
      this.getUserInfo().then(ures => {
        this.$router.push({
          name: 'home'
        })
      })
    }
3.1、网页内嵌二维码方式

1)、配置好下面相关参数,即可生成微信授权登录/绑定二维码,(注意:setWxerwma ()此方法需在mounted中调用)

setWxerwma () {
      const s = document.createElement('script')
      s.type = 'text/javascript'
      s.src = 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'
      const wxElement = document.body.appendChild(s)
      wxElement.onload = function () {
        var obj = new WxLogin({
          id: '', // 需要显示的容器id
          appid: '', // 公众号appid wx*******
          scope: 'snsapi_login', // 网页默认即可
          redirect_uri: encodeURIComponent(''), // 授权成功后回调的url
          state: Math.ceil(Math.random() * 1000), // 可设置为简单的随机数加session用来校验
          style: 'black', // 提供"black"、"white"可选。二维码的样式
          href: '' // 外部css文件url,需要https
        })
      }
    },

2)、后面的逻辑根据后台返回的数据来处理即可,同方法一步骤二类似

或者也可以用下面步骤:

1)、在页面中先引入如下JS文件(支持https):
http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js

2)、在需要使用微信登录的地方实例以下JS对象:

var obj = new WxLogin({
  self_redirect:true,
  id:"login_container", 
  appid: "", 
  scope: "", 
  redirect_uri: "",
  state: "",
  style: "",
  href: ""
});

参数说明:
在这里插入图片描述
redirect_uri 为回调链接,由后端提供给前端

引入远程js的方法:

mounted () {
  const wxJs = document.createElement('script')
  wxJs.type = 'text/javascript'
  wxJs.src = 'http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'
  document.body.appendChild(wxJs)
},
beforeRouteLeave (to, from, next) {
  document.body.removeChild(wxJs)
  next()
}

tips:用户扫码授权后,进入回调页面,由后端完成与微信开放平台间的数据请求后,重定向回到前端页面链接,链接后面带上参数,然后前端截取链接后面的参数,请求后端接口,进行登录操作,例子如下:

beforeRouteEnter (to, from, next) {
  next(vm => {
    if (JSON.stringify(vm.$route.query) === '{}') {
      console.log('没有参数')
    } else {
      // 使用this.$route.query截取链接后面的参数,请求后端接口
      vm.pWxLogin()
    }
  })
},
4、移动端微信授权登录

静默授权的意思是用户无感知的获取用户信息,不需要用户有任何的操作动作,注意静默授权只能获取到用户的openId。并不能获取到用户的其他信息。

非静默授权的意思是需要用户去操作,点击同意按钮,也就是说,如果产品要求是非静默授权,那么前端会弹起用户授权的按钮,待用户同意之后,就可以获取到用户的openId,个人信息,关注信息等相关内容。

注:静默授权和非静默授权的区别在于调用的接口的 scope 字段是 snsapi_base 还是 snsapi_userinfo

4.1、创建一个按钮,点击触发事件,跳转到微信授权页面
wxlogin () {
      window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${this.appid}&redirect_uri=${this.url}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`
}
//this.appid 公众号APPID  this.url  用户点击授权后,会跳转到后台帮我们重定向的页面(这里我是新建了一个空白页,专门接收code)

其中:

appid:是应用的appid
redirect_uri:是指回调的url
response_type:只写code
scope:表示授权的作用域,多个可以用逗号隔开,snsapi_base表示静默授权,snsapi_userinfo表示非静默授权
state:用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

4.2、页面会自动跳转到类似以下地址,在重定向的页面拿到给我们返回的 code,会拼接在URL后面

https://www.test.com/?code=021MZkll2DUtR63EuUnl21BZPv0MZklE&state=STATE

注意:如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE

4.3、通过code换取网页授权access_token

在业务代码中,用JS获取code参数,然后访问以下地址:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

其中:

appid:应用的 Appid,
secret: 应用密钥 AppSecret,
code:上一步中获取到的code
grant_type:值为authorization_code

成功后的返回数据如下:(主要是拿access_token和openid字段)

{ 
    "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE" 
}

在这里插入图片描述

4.4、用access_token 和openid获取用户信息

用access_token和openid字段访问以下地址:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

其中:

access_token:上一步的access_token
openid:上一步的openid

返回值如下:

{   
    "openid":" OPENID",
    "nickname": NICKNAME,
    "sex":"1",  //男
    "province":"PROVINCE"
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl":    "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
    "privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

错误时微信会返回JSON数据包如下(示例为openid无效):
{"errcode":40003,"errmsg":" invalid openid "}

值得注意的地方:

用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。

UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。

尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

H5 及 web 页面微信授权登录流程 的相关文章

  • QSplitter(分离器或分隔符)

    QSplitter 分离器或分隔符 本文为原创文章 转载请注明出处 或注明转载自 黄邦勇帅 原名 黄勇 本文出自本人原创著作 Qt5 10 GUI完全参考手册 网盘地址 https pan baidu com s 1iqagt4SEC8PU
  • 顺序表的原理与初始化

    顺序表是简单的一种线性结构 逻辑上相邻的数据在计算机内的存储位置也是相邻的 可以 快速定位第几个元素 中间不允许有空值 插入 删除时需要移动大量元素 顺序表的三个要素 用 elems 记录存储位置的基地址 分配一段连续的存储空间 size
  • crontab的使用方法介绍

    使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令 例如系统管理员安排一个备份任务使其每天都运行 安装 apt get install cron 服务器环境下默认都会安装 使用 crontab e 进入编辑页
  • java常见面试题及答案 11-20(JVM)

    11 JVM内存分哪几个区 每个区的作用是什么 java虚拟机主要分为以下一个区 方法区 1 有时候也成为永久代 在该区内很少发生垃圾回收 但是并不代表不发生GC 在这里进行的GC主要是对方法区里的常量池和对类型的卸载 2 方法区主要用来存
  • 安全测试初体验-XSS

    XSS XSS攻击成功后 攻击者能够对用户当前浏览器的页面植入恶意脚本 通过恶意脚本 控制用户的浏览器 这些用以完成各种具体功能的恶意脚本 被称为 XSS Payload XSS Payload实际上就是JavaScript脚本 所以任何J

随机推荐

  • JS逆向之某头条jsvmp逻辑层算法分析

    今天我们来研究下 某头条的jsvmp逻辑层加密算法 其主要的目的是想在大家在接触此类算法时 给出点实质性的建议和思路 0x01 分析加密 进入到目标网站通过分析请求会发现一个动态的 signature 加密参数 0x02 定位加密 不同于以
  • 在matlab中编译C++和opencv

    1 在matlab中运行 mex setup命令 选择C 类型 2 运行mex build 此时matlab配置基本完成 3在VS中添加matlab中的库目录和头文件目录 附加库目录 matlab安装目录下面的 extern lib win
  • 【Docker】 使用Docker-Compose 搭建基于 WordPress 的博客网站

    引 本文将使用流行的博客搭建工具 WordPress 搭建一个私人博客站点 部署过程中使用到了 Docker MySQL 站点搭建完成后经行了发布文章的体验 WordPress WordPress 是一个广泛使用的开源内容管理系统 CMS
  • 报告老师!AICA 学员交作业了!

    关注 飞桨PaddlePaddle 公众号 获取更多技术内容
  • linux-ssh安全策略(sshd)

    实际使用中 为限制ssh高危端口我们一般做以下策略 1 修改端口 ssh默认用22 2 密码强口令 3 root限制 4 新增ssh登录白名单 5 开启端口防火墙 6 有条件的话整个密钥登录更安全 不过avatar目前不支持密钥登录 所以项
  • 最安全的加密算法

    在密码学里 有一种理想的加密方案 叫做一次一密乱码本 one time pad one time pad的算法有以下要求 1 密钥必须随机产生2 密钥不能重复使用3 密钥和密文的长度是一样的 one time pad是最安全的加密算法 双方
  • “汉堡+奶昔”怎么就成了精致生活的热门标签?

    图片来源 视觉中国 文章来源 DT财经 左手汉堡 右手奶昔 这是新天地Coco的时髦新日常 最近沪上刮起一阵打卡新风潮 汉堡竟然成了标记城市美好生活的一大利器 还在纠结晚餐去金拱门还是汉堡王的DT君 发现自己在吃汉堡这件事上竟然也要被划出潮
  • 一步一步教你怎样给Apache Spark贡献代码

    本文将教大家怎样用10个步骤完成给Apache Spark贡献代码这个任务 到 Apache Spark 的github 页面内点击 fork 按钮 你的github帐户中会出现 spark 这个项目 本地电脑上 使用 git clone
  • 用python开发了一个绘制股票k线图的工具,还可以预测股票涨跌!【文末附源码和教学视频】

    文章目录 聊一聊这个工具 效果展示 股票数据 运行项目 前端界面 后端接口 源码地址 聊一聊这个工具 起初 我并不在意echarts 这不过是一个偶然 一次选择 一条简单的代码 一个图表的诞生 直到我完成了K线图的绘制 股票 一个神奇的发明
  • JS的内存泄露及处理方式

    概念 应用程序不再需要占用内存的时候 由于某些原因 内存没有被操作系统或可用内存池回收 就叫做内存泄漏 memory leak 内存的生命周期 内存分配 当我们声明变量 函数 对象的时候 系统会自动为他们分配内存 内存使用 即读写内存 也就
  • 利用CSS调整图片大小

    通常 我们可以给图片 img 设置一个CSS属性 定义其高度和宽度 但有时候 我们只希望控制图片的最大可见大小 这样的操作 一般有两种办法 1 直接使用CSS属性值 2 使用JavaScript动态设置CSS值 一 固定大小 一般 为了限制
  • 新手傻瓜式推荐教程:anaconda+Tensorflow+keras的安装详细教程

    目录 一 Anaconda的安装 二 Anaconda下配置Tensorflow 三 keras下载 四 出现报错 You are using pip version 9 0 1 however version 21 1 3 is avai
  • Java-用for循环嵌套输出1~100的质数(素数)

    package kjul public class jgtd public static void main String args int i j for i 2 i lt 100 i boolean flag true for j 2
  • pg数据库(七)之备份还原

    一 备份数据库 1 切换到postgres用户 切换到postgres用户即可 不用psql sudo su postgres 2 备份数据库 pg dump host 数据库IP port 端口 user 用户名 password 密码
  • MySQL——规范数据库设计

    文章目录 1 为什么需要设计数据库 2 三大范式 2 1 第一范式 1NF 2 2 第二范式 2NF 2 3 第三范式 3NF 3 规范性和性能的问题 1 为什么需要设计数据库 当数据库比较复杂的时候 我们就需要设计 糟糕的数据库设计 数据
  • postgresql定位未使用的索引(unused index)

    unused index会导致不必要的io开销 如写操作 insert update 期间 必须维护所有index 1 鉴于pg stat reset 函数能够reset统计信息到0 查找unused index时 先参考pg stat d
  • echarts地图的tooltip自定义样式显示图表

    echarts地图的tooltip自定义样式显示图表 最近遇到一个需求 需要在地图中实现鼠标点击或者停留在地图中某一片区域时 该区域显示亮高和显示tooltip提示框信息 但是难点在于需要在tooltip提示框中再绘制一层图表 按以往我们做
  • elasticsearch的版本和支持的jdk版本情况

    elasticsearch的版本和支持的jdk版本情况 参加官网 https www elastic co cn support matrix matrix jvm
  • 快速选择算法

    快速选择算法 我们可以将快速排序算法稍作修改将其应用在选择问题上 该算法称为快速选择算法 复杂度O NlogN 最坏情况为O N 2 令 A 为A中的元素个数 查找A中第k个最小元 算法步骤如下 1 如果 A 1 那么k 1 则将A中的元素
  • H5 及 web 页面微信授权登录流程

    一 事先准备工作 配置参数测试公众平台信息 测试号相关配置示例 1 打开公众平台的测试账号 2 配置js接口安全域名 3 扫码关注测试公众号 4 修改网页授权地址 配置授权回调的域名 至于什么是OAuth2 0 大家自行百度吧 这里的域名也