微信扫码登录流程

news2024/9/23 1:20:20

微信官方文档使用

  • 搜索“微信开放平台”
  • 点击导航栏的“资源中心”
  • 点击“网站应用”下的“微信登录功能”
  • 地址
  • 微信扫码登录是基于OAuth2的,所以需要第三方应用(就是实现微信扫码登录的应用)成为微信的客户端,获取AppId和AppSecret。

获取AppId和AppSecret

  • “微信开发平台”下方的“网站应用开发”
  • 点击导航栏的“注册”注册信息,注册地址
  • 最好使用企业邮箱注册,填写注册信息进行注册
    在这里插入图片描述
  • 开发者认证:注册成功之后点击登录——>开发者资质认证,这需要填写个人身份信息,企业盖章等,认证一次300元,所以我们只有在真实企业开发中才会去做,平时练习是做不了的。
    在这里插入图片描述
  • 审核成功后就可以创建应用了,同样需要企业签字盖章
    在这里插入图片描述
  • 应用中就可以看到AppId和AppSecret,需要配置回调域(就是应用的域名),供微信回调返回用户的授权结果。
    在这里插入图片描述

请求code

  • 向以下链接发送请求
https://open.weixin.qq.com/connect/qrconnect?appid=你的APPID&redirect_uri=http://你的授权回调域&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect 

访问该地址会得到一个微信登录的二维码
在这里插入图片描述

  • 用户扫了二维码之后会选择是否同意授权,如果授权成功会跳转到如下地址,地址中就包含code。
http://你的授权域/?code=获取的code&state=STATE
  • 需要注意的是,如果你的项目域名还没有注册的话,这个地址是访问不了的,我们知道域名解析是先看我们本地的hosts文件(C:\Windows\System32\drivers\etc下),如果hosts中没有的话,会使用DNS(域名解析服务器)进行域名解析后访问,所以我们可以在本地的hosts文件中配置(项目所在地址ip和回调域之间用空格隔开)
    在这里插入图片描述

获取access_token

  • 向以下地址发送请求获得access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的AppId&secret=你的AppSecret&code=上一步获取到的code&grant_type=authorization_code
  • 得到的结果格式如下,包含access_token
{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

【注意事项】如果发送请求后的结果是{"errcode":40029,"errmsg":"invalid code"},那就说明token已经过期。

  • access_token默认时间是两小时,如果access_token过期了,需要使用refresh_token进行刷新,可以发送请求到以下地址进行refresh_token。
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=你的APPID&grant_type=refresh_token&refresh_token=获取access_token时的REFRESH_TOKEN
  • access_token刷新的两种结果
    1)若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
    2)若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
    【注意】refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
    也就是说,不管access_token在是否超时时刷新,都要在refresh_token过期之前,刷新一次,access_token的超时时间都会变成两小时,不同的是,access_token是否还是原来的值。
  • refresh_token正确的返回结果示例如下:
{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN", 
"openid":"OPENID", 
"scope":"SCOPE" 
}
  • 如果是{"errcode":40030,"errmsg":"invalid refresh_token"},说明refresh_token已经过期,需要重新获得access_token和refresh_token。

通过access_token调用用户信息接口

  • access_token和用户的openId都在上一步获取到
https://api.weixin.qq.com/sns/userinfo?access_token=你的ACCESS_TOKEN&openid=用户的OPENID
  • 获取到的正确结果示例,这些信息其实都可以保存到自己平台的用户注册表中。
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"

}

【微信官方提示】如果你有多个应用,并且允许用户在这多个应用中进行数据共享的话,使用的是unionid,unionid是唯一的,也就是一个微信号对应一个unionid,而一个微信号会对应多个openid,openid在不同的应用中是不同的,但是在同一个应用中是相同的(微信通过用户唯一标识,例如微信号和应用id加密后生成openid)。同时,微信提醒,用户在修改头像之后,修改前的url会失效,为了保证url失效后的异常情况,应该保存好微信头像地址。

总结

  • 微信登录其实就5步
    1)注册企业邮箱,填写信息,获取appid,appscret,绑定回调域
    2)通过appid和回调域,请求微信扫码登录界面,用户扫码授权,获取code
    3)通过appid,appsecret和code获取access_token和用户的openid
    4)通过access_token和用户的openid获取用户信息
    5)通过用户信息注册本平台的账号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1421294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP备考笔记:模拟考试知识点总结

1. 答题思路:优先看问题,可节省时间。 2. 考试就按照考试的套路来做,不要过多考虑。 开发团队只专注当前冲刺目标,产品负责人对PB排优先级。 收集需求工具-原型法:能够让用户提前体验,减少返工的风险。 …

基于ldap实现登录认证

最近开发的应用需要外协人员实现登录认证,外协人员的密码等信息已经录入到ldap, 需要连接ldap进行登录认证。下面先介绍一下登录的网络旅程图。 一.nginx实现AES加密 nginx请求处理入口(前端请求为json格式) location /aes {default_type te…

解锁Web3:数字未来的大门

随着科技的不断推进,我们正站在数字时代的新门槛上。Web3,作为互联网的下一个演进阶段,正在逐渐揭开数字未来的面纱。本文将深入探讨Web3的本质、对社会的影响以及在数字时代中所扮演的关键角色。 什么是Web3? Web3是互联网发展的…

数据分析讲课笔记02:科学计算库Numpy

文章目录 零、学习目标一、认识NumPy数组对象(一)N维数组对象ndarray(二)ndarray对象重要的属性(三)ndarray数组案例演示 二、创建NumPy数组(一)采用array()函数创建数组&#xff08…

父元素flex:1 高度却被子元素撑开的问题

问题 当父元素设置了flex: 1; 的情况下,想在其中子元素超出父元素高度的情况下,产生滚动条,在父元素区域滚动。由于子元素高度不固定,故父元素设置为display: flex; flex-direction: column; 子元素设置flex: 1; overflow: auto;…

select的change方法如何传递多个参数

element-ui中select的change方法传递多个参数 element-ui中的select,checkbox等组件的change方法的回调函数只有当前选择的val,如果想再传入自定义参数怎么办? 不能够传入自定义的参数,在进行某些操作时,会比较困难&…

【Java程序设计】【C00179】基于SSM的电影在线购票管理系统(论文+PPT)

基于SSM的电影在线购票管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的电影在线购票管理系统 本系统分为前台用户和后台管理员2个功能模块。 前台用户:当游客打开系统的网址后,首先看到…

【开源】基于JAVA+Vue+SpringBoot的用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

一张图搞清楚HTTP状态码

HTTP状态码的基本概念 在客户端和服务器连接交互的时候,一般是客户端先给服务器发送请求,然后服务器返回结果。客户端和服务器之间的交互非常频繁,涉及到很多种不同类型的操作,大多数的时候服务器能成功返回结果,有时…

Vue3使用setup-extend简化组件名写法

如果我们在Vue3中要使用setup的语法糖,就需要使用两个script标签,一个用于设置组件的name属性,一个用于编写setup中的代码。如下: 但是我们有觉得光是因为一个name属性就多写一个script标签有点麻烦了。 因此我们可以使用插件来进…

[每日一题] 01.30

文章目录 数列求和质数口袋奇怪数求和 数列求和 n int(input()) print(sum([i for i in range(1,n 1)]))质数口袋 n int(input()) i 2 sum 0 count 0 while n - i > sum:flag Truefor j in range(2,i): # 判断i是否为素数if i % j 0:flag Falsebreakif flag:sum i…

如何解决 DNS 解析错误(DNS_PROBE_FINISHED_NXDOMAIN)问题

如何解决 DNS 解析错误(DNS_PROBE_FINISHED_NXDOMAIN)问题 导语: 当你在访问网站时遇到 DNS 解析错误(DNS_PROBE_FINISHED_NXDOMAIN)时,可能是由于本地 DNS 缓存导致的问题。这里介绍一种简单且常见的解决…

MongoDB安装以及卸载

查询id: docker ps [rootlocalhost ~]# docker stop c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rm c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rmi mongo sudo docker pull mongo:4.4 sudo docker images 卸载旧的 sudo docker stop mong…

【Linux】vim的简单使用

我们知道在Windows下的VS2019是一个集成开发环境,也就是说,集编辑,编译,调试等功能都放在了一起;但是在Linux下,这些步骤都是分开的,我们这篇博客就来说一说vim这个编辑器,它只有编辑…

Focaler-IoU:更聚焦的IoU损失

摘要 边界框回归在目标检测领域中起着至关重要的作用,而目标检测的定位精度在很大程度上取决于边界框回归的损失函数。现有的研究通过利用边界框之间的几何关系来提高回归性能,而忽略了难易样本分布对边界框回归的影响。本文分析了难易样本分布对回归结…

Kotlin基础——高阶函数和内联函数

高阶函数 高阶函数以另一个函数作为参数或者返回值,其可用Lambda或函数引用表示 函数类型 下面将Lambda存储在sum变量中,其是函数类型 val sum { x: Int, y: Int -> x y }完整的函数类型为(para1,prar2…) -> returnValue val a: Int 0 va…

【MBtiles数据索引和服务发布】GeoServer改造Springboot番外系列二

xyz地图服务访问示例:http://192.168.1.240:8081/gmserver/raster/xyz/firstWP:Imagery-raster/{z}/{x}/{y}.jpg 访问示例如下: mbtiles目录结构 根据z,x,y获取对应mbtiles文件路径的工具方法 说明:重点是使用getMb…

堆宝塔

L2-1 堆宝塔 分数 25 作者 陈越 单位 浙江大学 堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明…

第六讲_JavaScript原型

JavaScript原型 1. 原型的概念2. 原型继承2.1 原型链 3. class类的原型对象 1. 原型的概念 原型是 JavaScript 对象相互继承特性的机制。 每个函数都有一个 prototype 属性,这个属性指向一个对象,这个对象称为原型对象。每个对象都有一个 [[Prototype]…

在线mockjson

在线mockjson体验地址 在调一个问题的时候,但是问题的数据可能并不能随着想到的场景就变化,譬如说又个数组长度的情况,可能默认的情况下是返回4个元素,但是想要返回为空的时候,如果联系服务给改一下,那么流…