微信小程序授权登录流程

2023-10-30

自我介绍

我是IT果果日记,微信公众号请搜索 IT果果日记
一个普通的技术宅,定期分享技术文章,欢迎点赞、关注和转发,请多关照。

首先,我们要了解什么是微信小程序登录?它的作用是什么?

用户登录

微信小程序登录是为了让开发者的服务器获取用户的openId以及session_key的令牌。

请不要将微信小程序的用户登录理解为传统意义上的登录。虽然从大的方向上讲,登录都是为了确认用户的身份、拿到用户的唯一身份标识,但是微信小程序的登录流程和传统的账号密码流程不太一样。当你进入小程序后,不需要输入任何账号密码,开发者服务器就可以获取你的openId标识。微信小程序的登录流程远比传统的账号密码登录要复杂。

微信小程序提供了wx.login(OBJECT)方法用于用户登录。wx.login方法的主要目的是拿到用户的openId和用户本次登录的session_key

openId是用户对于当前小程序的身份标识,类似于我们自己产品里的用户id号,只不过在微信里有自己的用户账户体系,你可以使用这个openId作为用户的身份标识。当然,也可以建立一套自己的用户标识,不过当你需要调用微信开放接口(比如支付、发送模板消息)时,还是必须知道用户的openId。

session_key是本次用户登录的会话密钥,通常用来对用户的通信数据进行加解密

到目前为止,如果对于openId和session_key的概念还很模糊,不知道这两者的用处,没有关系,在后面的篇幅里我们将陆续讲解和使用这两个参数。

首先要在开发者服务器拿到openId和session_key。图1所示为获取openId和session_key的流程图。这张图非常重要。

图1 登录并获取session_key和openId的流程图

要获取session_key和openId,首先需要在小程序中调用wx.login,并获取code;随后将code发送到开发者服务器,并同appid和appsecret一起发送到微信服务器,微信服务器会返回我们需要的session_key和openId。

我们结合具体代码看看,实现上述流程并最终拿到session_key和openId。

wx.login({
  success: res => {
    // 发送 res.code 到后台换取 openId, sessionKey, unionId
    console.log('code:' + res.code);
    wx.request({
      url:"http://localhost:8080/wxopen/getOpenIdAndSessionKey",
      data:{
        code: res.code
      },
      success: function (res) {
        console.log(res.data);
      }
    })
  }
})

这里调用了wx.login方法,这个方法没有参数,只有回调函数。success回调函数是当微信服务器成功返回结果时调用的函数。

先来看success回调函数返回参数的参数说明。

  • errMsg 错误消息。

  • code 开发者需要将code发送到开发者服务器后台,使用code换取session_key api,将code换成openId和session_key。

重点是返回值code。code是一把钥匙,是得到openId和session_key的关键。code有效期只有5分钟,如果在5分钟之内还没有用code换取openId和session_key,那么就不能再使用了。

可不可以直接在小程序内部用code去微信服务器换取openId和session_key呢?理论上是可以的,但这完全没有意义。无论出于安全性还是实用性,都应该将code发送到开发者服务器由开发者服务器获取openId和session_key。

所以,我们在wx.login的success回调函数中再次发起了一个wx.request请求,将code发送到了本地服务器中。在编写后端接口代码前,首先来学习如何使用code调用微信服务器获取openId和session_key

微信提供了一个https接口用于code换取openId以及session_key。接口地址如下:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

需要以下4个参数才能正确调用该接口:

  • appid 小程序唯一标识。

  • secret 小程序的app secret。

  • js_code 登录时获取的code。

  • grant_type 填写为authorization_code。

appid和secret均来自于微信小程序账号,是2个固定的字符串;js_code是我们在小程序客户端调用wx.login时返回的code;grant_type固定为authorization_code即可。下面编写服务端代码。

Map<String,Object> map = new HashMap<>(7);
map.put("appid",wxAppId);
map.put("secret",wxSecret);
map.put("js_code", param.getCode());
map.put("grant_type",grantType);
WxCode2SessionRet sessionRet = null;
try{
    String url = "https://api.weixin.qq.com/sns/jscode2session";
    String info = HttpUtil.get(url, map);
    sessionRet = JSON.parseObject(info, WxCode2SessionRet.class);
      log.info("openid = {}, session_key = {}", sessionRet.getOpenid(), 
      sessionRet.getSession_key());
} catch (Exception e){
    log.error("code2session失败", e);
    return null;
}

WxCode2SessionRet.java

@Data
public class WxCode2SessionRet implements Serializable {
    private String openid;
    private String session_key;
    private String unionid;
    private String errcode;
    private String errmsg;
}

以上代码请开发者自行将appid和appsecret替换为自己的appid和secret。看到后端代码,开发者可能就会明白为什么不能在小程序客户端中换取openId和session_key。因为调用换取接口需要敏感数据appid和appsecret,特别是secret,一定不可以放在客户端中,这也是腾讯不允许的,是不会通过微信小程序审核的。

要特别注意,以上代码为了演示效果,所以将拿到的openId以及session_key返回到了客户端。但在真实的项目中,将session_key和openId返回客户端是极其危险的,也完全没有必要。因为需要使用session_key和openId的场景都会被放置在服务器进行,所以将这两个参数返回小程序中没有任何意义,反而会增加数据泄露的风险。

session_key肯定是有失效期的。要注意的是,在session_key的有效期内,开发者最好不要重复调用wx.login接口、不断用code换取session_key,而应该将session_key保存在服务器中。等到session_key失效后,再重新获取新的session_key。

那么如何知道session_key是否已经过期呢?小程序提供了一个wx.checkSession(OBJECT)用来校验session_key是否过期。只有在session_key确实过期后,才会再次调用wx.login。wx.checkSession的使用非常简单,下面直接给出示例代码。如图2所示。

图2 检查 session 是否过期

这里还要注意,wx.login得到的code只能使用一次,一旦你使用code换取了openId和session_key,这个code就会马上失效,不能再次使用。当然,如果5分钟内这个code还没有被使用,那么也会失效。

总结

微信小程序用户登录主要做了两件事情:

  • 客户端调用微信小程序登录接口wx.login获取code;

  • 调用服务器端接口,服务端接口带上code参数和本地保存的appId、secret,从微信服务器获取到openId和session_key

另外,session_key有过期时间,我们可以通过调用wx.checkSession(OBJECT)接口校验session_key何时过期。

那么,拿到了 openId 和 session_key 该怎么使用呢?关注我不迷路,答案在我的其他文章里可以找到。

请联系我

我是IT果果日记,微信公众号请搜索 IT果果日记
一个普通的技术宅,定期分享技术文章,欢迎点赞、关注和转发,请多关照。

微信公众号 IT果果日记

https://gitee.com/chenzhaoplus

https://github.com/chenzhaoplus

https://blog.csdn.net/cz285933169?spm=1010.2135.3001.5421

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

微信小程序授权登录流程 的相关文章

  • Python 列表反转

    在 Python 中使用列表时 有时可能需要反转列表的元素 反转列表意味着列表的第一个元素成为最后一个元素 第二个元素成为倒数第二个元素 最后一个元素成为第一个元素 依此类推 在 Python 中 有几种不同的方法可以反转列表 具体取决于您
  • 如何在 CentOS 7 上安装 Java

    Java 是世界上最流行的编程语言之一 用于构建不同类型的应用程序和系统 本教程介绍如何在 CentOS 7 上安装 Java 的各种版本和实现 我们将向您展示如何安装 OpenJDK 以及 Oracle Java 先决条件 在继续本教程之
  • 如何在Ubuntu 18.04上配置MySQL主从复制

    MySQL 复制是一个允许数据从一台数据库服务器自动复制到一台或多台服务器的过程 MySQL 支持多种复制拓扑 其中主 从拓扑是最著名的拓扑之一 其中一台数据库服务器充当主服务器 而一台或多台服务器充当从服务器 默认情况下 复制是异步的 主

随机推荐

  • 在 CentOS 7 上安装 Odoo 12

    Odoo 是世界上最受欢迎的一体化商业软件 它提供一系列业务应用程序 包括 CRM 网站 电子商务 计费 会计 制造 仓库 项目管理 库存等等 所有这些都无缝集成 在本教程中 我们将向您展示如何安装Odoo12 来自 CentOS 7 计算
  • 如何在 Debian 9 上安装 Google Chrome 网络浏览器

    谷歌浏览器是世界上最流行的网络浏览器 它是专为现代网络打造的快速 直观且安全的浏览器 Chrome 不是开源浏览器 它不包含在默认的 Debian 存储库中 它是基于Chromium Debian 存储库中提供的开源浏览器 在本教程中 我们
  • 如何在 Ubuntu 20.04 上安装 VLC 媒体播放器

    VLC 是最流行的开源多媒体播放器之一 它是跨平台的 几乎可以播放所有多媒体文件以及 DVD 音频 CD 和不同的流媒体协议 本文介绍如何在 Ubuntu 20 04 上安装 VLC 媒体播放器 VLC 可以通过 Snapcraft 商店作
  • 如何在Linux中检查内核版本

    内核是操作系统的核心组件 它管理系统的资源 是计算机硬件和软件之间的桥梁 您可能需要了解 GNU Linux 操作系统上运行的内核版本的原因有多种 也许您正在调试与硬件相关的问题或了解影响旧内核版本的新安全漏洞 并且您想了解您的内核是否容易
  • 如何在 Ubuntu 18.04 上安装 Memcached

    Memcached 是一个免费开源的高性能内存键值数据存储 它最常用于通过缓存数据库调用结果中的各种对象来加速应用程序 在本教程中 我们将介绍在 Ubuntu 18 04 上安装和配置最新版本 Memcached 的过程 相同的说明适用于
  • 配置 Nginx 错误和访问日志

    Nginx 是一个开源的 高性能的 HTTP 和反向代理服务器负责处理互联网上一些最大网站的负载 管理时NGINX对于 Web 服务器 您将执行的最常见的任务之一是检查日志文件 了解如何配置和读取日志在排除服务器或应用程序问题时非常有用 因
  • 如何在 Debian 10 Linux 上安装 VirtualBox 来宾添加

    虚拟盒子是一款开源 跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 VirtualBox 提供了一组可以安装在来宾操作系统中的驱动程序和应用程序 VirtualBox Guest Additions 来宾添加为来宾计算机提供了多种
  • 【JS 逆向百例】百度翻译接口参数逆向

    文章目录 逆向目标 逆向过程 抓包分析 获取 token 获取 sign 完整代码 baidu encrypt js baidufanyi py 逆向目标 目标 百度翻译接口参数 主页 https fanyi youdao com 接口 h
  • 查看: 1280

    查看 1280 回复 0 电容三点式LC振荡器电路组成及工作原理简述 复制链接 husk2012 95 主题 0 听众 3189 积分 VIP会员 收听TA 发消息 电梯直达
  • line-height:1是什么意思

    line height 1是什么意思 其实仍旧是设置行高的一种方法 只不过简化了语句 举个例子 比如此时你设置了font size 20px 之后你设置了line height 1 转义过来的意思就是line height 20px 行高为
  • 傻瓜式-根据自定义规则编码生成

    private final ReentrantLock lock new ReentrantLock public Result addProvider Provider proNew new Provider try lock lock
  • c语言ox是什么意思啊,ox什么意思

    营销树今天精心准备的是 ox什么意思 下面是详解 OX是什么意思 OX是无色透明的化学液体邻二甲苯的英文简写 OX作为英文单词是可数名词 基本含义是牛 读音为 英 ks 美 ks 复数 oxen 同义词 wild ox 例句They are
  • 福大计算机学硕扩招,福州大学2021年推免数据,快来了解这所211大学的保研情况!...

    福州大学是省部共建高校 是 双一流 建设高校 是 211工程 建设高校 学校现有1个国家重点实验室 8个国家级工程研究中心 3个国家国际科技合作基地 3个教育部重点实验室 有11个博士后科研流动站 11个一级学科博士点 2021年推荐优秀应
  • Arthas开源一周年,Github Star 160K,我们一直在坚持什么?

    缘起 最近看到一个很流行的标题 开源XX年 star XXX 我是如何坚持的 看到这样的标题 忽然发觉Arthas从2018年9月开源以来 刚好一年了 正好在这个秋高气爽的时节做下总结和回顾 Arthas Arthas是Alibaba开源的
  • WSL2创建多实例--发行版管理工具wsl2distromanager使用

    简介 wsl2 distro manager是github上的一款WSL的开源实例管理工具 它具有GUI界面 是目前我发现的比较方便的管理工具 项目地址如下 https github com bostrot wsl2 distro mana
  • 氮化镓 服务器电源管理系统报价,基于氮化镓的电源解决方案总体拥有成本评估...

    引言 近年来 电信市场正在朝云计算的方向转变 这导致超大规模数据中心空前快速的增长 而每个机架需要处理的功能也越来越多 反过来 这种趋势也意味着对功率的需求快速增加 而重点则是采用消耗更少电力的更高效 体积更紧凑的电源 散热同样是这里需要考
  • 信息安全保障体系规划方案

    本文转载自公众号爱方案 ID ifangan 本文内容为信息安全技术体系 运维体系 管理体系的评估和规划 是信息安全保障体系的主体 一 概述 1 1引言 本文基于对XX公司信息安全风险评估总体规划的分析 提出XX公司信息安全技术工作的总体规
  • C语言实战例题:必会的 10 个C语言经典练习题,源码分享

    这些都是基本的 C 程序 可以帮助刚踏入 C 编程世界的新手 快来试试吧 1 C 语言编程 Hello World include
  • 虚拟服务器磁盘 厚置备置零,VMware ESXi 虚拟硬盘格式记录:厚置备延迟置零、厚置备置零、精简置备...

    创建磁盘时 会进行两个操作 分配空间 置零 1 厚置备延迟置零 默认的创建格式 创建磁盘时 直接从磁盘分配空间 但对磁盘保留数据不置零 所以当有I O操作时 只需要做置零的操作 磁盘性能较好 时间短 适合于做池模式的虚拟桌面 2 厚置备置零
  • 微信小程序授权登录流程

    自我介绍 我是IT果果日记 微信公众号请搜索 IT果果日记 一个普通的技术宅 定期分享技术文章 欢迎点赞 关注和转发 请多关照 首先 我们要了解什么是微信小程序登录 它的作用是什么 用户登录 微信小程序登录是为了让开发者的服务器获取用户的o