微信小程序授权登录流程

news2024/11/26 0:28:08

自我介绍

我是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

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

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

相关文章

使用Fetch时,post数据时,后端接收的Content-Type为text/plain

在使用 Fetch做一个前端的post请求时&#xff0c;直接从网上抄了一段代码 export async function postData(url, data){const response await fetch(url, {method: POST, // *GET, POST, PUT, DELETE, etc.mode: no-cors, // no-cors, *cors, same-originheaders: { Content-…

xshell 工具连接不上本地的 Centos 7虚拟机,4种情况,逐个分析

导读 小编之前使用过 VMware workstation 工具搭建 Centos 7 版本的虚拟机集群&#xff0c;各项功能都正常&#xff0c;用完了也就清除了&#xff08;节约本地空间&#xff09;。因为最近学习大数据&#xff0c;需要从新安装虚拟机&#xff0c;结果发现并不如第一次那么顺利。所…

TDengine时序数据库的简单使用

最近学习了TDengine数据库&#xff0c;因为我们公司有硬件设备&#xff0c;设备按照每分钟&#xff0c;每十分钟&#xff0c;每小时上传数据&#xff0c;存入数据库。而这些数据会经过sql查询&#xff0c;统计返回展示到前端。但时间积累后现在数据达到了百万级数据&#xff0c…

Qt使用workflow

Qt工程设置 QMAKE_CFLAGS_DEBUG -MTd QMAKE_CXXFLAGS_DEBUG -MTd上述内容必须设置&#xff0c;否则会报错&#xff1a;error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug。 libworkflow.pri的文件内容如下&#xff1a; …

算法第十五期——动态规划(DP)之各种背包问题

目录 0、背包问题分类 1、 0/1背包简化版 【代码】 2、0/ 1背包的方案数 【思路】 【做法】 【代码】 空间优化1&#xff1a;交替滚动 空间优化2&#xff1a;自我滚动 3、完全背包 【思路】 【代码】 4、分组背包 核心代码 5、多重背包 多重背包解题思路1:转化…

MySQL8 创建用户,设置修改密码,授权

MySQL8 创建用户,设置修改密码,授权 MySQL5.7可以 (创建用户,设置密码,授权) 一步到位 &#x1f447; GRANT ALL PRIVILEGES ON *.* TO 用户名% IDENTIFIED BY 密码 WITH GRANT OPTION&#x1f446;这样的语句在MySQL8.0中行不通, 必须 创设和授权 分步执行&#x1f447; CR…

如何动态生成列字段?请看向这里哟

&#x1f343; 场景前言 &#x1f420;一般而言&#xff0c;某个简单查询接口涉及到得表结构不超过三个。如果不是单表操作的话&#xff0c;多个表中间用到联合查询的SQL也可以解决相关问题。但是&#xff0c;事与愿违的是我们的业务是跟着场景走的&#xff0c;并不是所有的业务…

python+django宠物销售商城网站vue

宠物销售商城,在宠物销售商城可以查看首页、商品信息、商品资讯、个人中心、后台管理、购物车、在线客服等内容 用户登录、用户注册,通过注册获取用户名、密码、姓名、联系电话等信息进行注册、登录 商品信息,在商品信息页面可以查看商品名称、商品分类、图片、品牌、规格、价…

java易错题锦集二

源码 补码 int i 5; int j 10; System.out.println(i ~j);有个公式&#xff0c;-n~n1 另一种解题思路 ~代表对n按位取反 10的源码是: 00000000 00000000 00000000 1010 所以对10按位取反就是 11111111 11111111 11111111 0101 由于计算机中-1表示为 11111111 11111111 111…

[docker]笔记-镜像 管理

1、镜像管理 docker search xxxx ①查找镜像,例如查找httpd [rootlocalhost ~]# docker search httpd ②下载镜像 docker pull xxxx [rootlocalhost ~]# docker pull httpd ③列出本地镜像 docker images [rootlocalhost ~]# docker images ④删除镜像 docker rmi xxx…

Linux(十)线程安全 上

目录 一、概念 二、互斥锁实现互斥 三、条件变量实现同步 银行家算法 生产者与消费者模型 一、概念 概念&#xff1a;在多线程程序中&#xff0c;如果涉及到了对共享资源的操作&#xff0c;则有可能会导致数据二义性&#xff0c;而线程安全就指的是&#xff0c;就算对共享…

【MFC】菜单与状态栏(15)

菜单 一般菜单的使用步骤&#xff1a; 1.编辑菜单资源&#xff0c;设置菜单属性&#xff08;包括菜单名和ID&#xff09;&#xff1b; 2.用ClassWizard自动映射菜单消息和成员函数&#xff1b; 3.手工编辑成员函数&#xff0c;加入菜单消息处理代码。 单文档窗口可以设置默…

2年时间,涨薪20k,想拿高薪还真不能老老实实的工作...

2016年开始了我的测试生活。 2016年刚到公司的时候&#xff0c;我做的是测试工程师。做测试工程师是我对自己的职业规划。说实话&#xff0c;我能得到这份工作真的很高兴。 来公司的第一个星期&#xff0c;因为有一个项目缺人&#xff0c;所以部门经理提前结束了我的考核期&a…

C语言预处理

文章目录 目录 文章目录 前言 一、程序编译的过程 二、编译阶段 1.预处理(*.i&#xff09; 2.编译(*.s) 3.汇编(*.o) 4.链接 总结 前言 提示&#xff1a;使用vs code(gcc编译器)与vs2022来演示c语言的预处理 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

KEIL编译报错,解决方法汇总

目录 背景 最近在跟着野火码uCosiii的代码时&#xff0c;感觉非常完美&#xff0c;结果一编译&#xff0c;报了120个莫名其妙的问题&#xff0c;下面是踩过的坑&#xff0c;一起记录下&#xff0c;免得下次又掉进去了~ 1. 编译汇编文件&#xff0c;报错 error: unexpected t…

看海泰方圆类ChatGPT技术模型!

ChatGPT&#xff0c;上线2个月便以破亿的用户群引爆了全网。 ChatGPT是由OpenAI公司开发的AI聊天机器人程序&#xff0c;于2022年11月底推出&#xff0c;能够通过学习和理解人类的语言来进行对话、互动&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代码等任务&…

南卡和JBL无线蓝牙耳机哪款更值得买?横向评测后秒懂差距!

蓝牙耳机想必大家都很熟悉&#xff0c;无论是商务办公还是休闲娱乐&#xff0c;它都起到了至关重要的作用。但蓝牙耳机发展速度太快&#xff0c;耳机品质也参差不齐&#xff0c;最近看到大多数人都有一个疑问&#xff1a;买什么蓝牙耳机比较好&#xff1f;作为一个资深的耳机爱…

动态规划:状态压缩DP(2)(P1896 互不侵犯 ,矩阵计数)

文章目录互不侵犯矩阵计数互不侵犯 题目传送门 在NN的棋盘里面放K个国王&#xff0c;使他们互不攻击&#xff0c;共有多少种摆放方案。国王能攻击到它上下左右&#xff0c;以及左上左下右上右下八个方向上附近的各一个格子&#xff0c;共8个格子。 升级版的八皇后问题&#xf…

(一)随处可见的LED广告屏是怎么工作的呢?

笔者前段时间项目上正好用到一块32*128分辨率的单色LED&#xff0c;正式介入开发的时候&#xff0c;才发现网上的资料少之又少&#xff0c;供应商也给不出有价值的参考信息。故打算分成三篇详细的介绍下开发过程中遇到的问题。本篇主要介绍LED屏幕的一些基础信息&#xff0c;第…

C#互联网医院源码 智慧医院小程序源码 在线问诊在线开方源码

互联网医院平台源码 智慧医院管理系统源码 开发环境&#xff1a;ASP.NET C# VS2019 SQL2008 依托于实体医院利用互联网技术对接院内业务信息系统&#xff0c;向患者提供基于线上问诊、预约挂号、缴费结算、医患互动、诊后随访、健康科普和复诊等全面的医疗健康互联网服务。…