微信小程序登陆,后端接口实现 - springboot

news2024/11/26 0:25:46

登录流程

1、通过调用wx.login获取登录凭证(code)

  • uni-app通过调用uni.login

2、前端将code提交给服务器,springboot访问 auth.code2Session,使用 code 换取 openid、unionid、session_key 等信息。

3、完成登录操作,返回token给前端。

测试发现,个人小程序无法获取unionid


步骤一

通过调用wx.login获取登录凭证(code)

示例:uni-app项目中,使用uni.login获取登录凭证(code)

// 微信小程序
// #ifdef MP-WEIXIN

uni.login({
	provider: 'weixin',
	success: function(loginRes) {
		if (loginRes.errMsg == "login:ok") {
			//提交code到服务器,完成登录操作
			doWxLogin({
				code: loginRes.code
			}).then(res => {
				console.log(res)
				//。。。
			})
		}
	}
});

// #endif

wx.login

调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

code,用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 auth.code2Session,使用 code 换取 openid、unionid、session_key 等信息。

  • openid:指的微信用户在微信的某个应用中的唯一标识。
  • unionid:指的微信用户的唯一标识。(相当于微信用户ID)
  • 微信某个应用:指的是 公众号、小程序、开放平台等。
  • 若要开发多个微信应用,应当获取微信用户的唯一标识 unionid。

目前小程序开发者可以通过 wx.login 接口直接获取用户的 openId 与 unionId 信息,实现微信身份登录。对许多小程序使用场景,用户无需提供头像昵称。如有必要场景需收集用户头像昵称,可在个人中心或设置等页面让用户完善个人资料。如业务需获取用户头像、昵称,可以使用「头像昵称填写能力」。

wx.getUserProfile

获取用户信息。页面产生点击事件(例如 buttonbindtap 的回调中)后才可调用,每次请求都会弹出授权窗口,用户同意后返回 userInfo

属性类型说明最低版本
signaturestring使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,详见 用户数据的签名验证和加解密2.10.4
encryptedDatastring包括敏感数据在内的完整用户信息的加密数据,详见 用户数据的签名验证和加解密2.10.4
ivstring加密算法的初始向量,详见 用户数据的签名验证和加解密2.10.4

2022年11月8日24时起,已废弃。wx.getUserProfile,在uni-app中是uni.getUserProfile。若该方法未失效,可使用code换取的session_key将encryptedData解密,获取用户信息。


步骤二

前端将code提交给服务器,springboot访问 auth.code2Session,使用 code 换取 openid、unionid、session_key 等信息。

  • 在换取到openid/unionid后,查找用户表,若有匹配的用户则自动登录,否则自动注册一个账号再完成自动登录,返回token到前端。以实现微信小程序快速登录。
  • 现在无法通过解密encryptedData(wx.getUserProfile得到)获取用户的昵称、头像、性别、地区等数据,得提供一个类似“个人中心“的页面让用户自己完善(如果用户需要)。

springboot示例

配置在springboot配置文件中的参数:

//https://api.weixin.qq.com/sns/jscode2session
@Value("${wx.online_people_url}")
private String ONLINE_PEOPLE_URL;

//小程序的AppID
@Value("${wx.appId}")
private String APP_ID;

//小程序的AppSecret
@Value("${wx.appSecret}")
private String SECRET;

登录微信公众平台获取小程序的AppID、AppSecret

访问 auth.code2Session,使用 code 换取 openid、unionid、session_key 等信息:

/**
 * 微信登陆,通过code获取session_key
 * @param code 通过wx.login获取到的用户的code(登录凭证)
 * @return 返回session_key,用于解密 前端wx.getUserProfile接口 返回的加密的用户数据(2022-11,微信已弃用该接口,已无法通过其获取用户信息)。
 */
public DataVo<String> getSessionKey(String code) {
    //使用 hutool 解析json
    JSONObject json = JSONUtil.parseObj(getSessionKeyByWX(code));
    if(json.getBool("isSuccess")) {
        log.info("isSuccess = true,成功获取到session_key。session_key = "+json.getStr("session_key"));
        return JSONResult.ok(json.getStr("session_key"));
    }else {
        // 记录日志
        log.error("获取sessionkey失败! code = "+code);
        return JSONResult.errorMsg("获取sessionkey失败! code = "+code);
    }
}

/**
 * 微信登陆,通过code获取session_key、openid。
 *     session_key:用于解密 前端wx.getUserProfile(以前是wx.getUserInfo)接口 返回的加密的用户数据,头像、昵称、性别、地区等信息(2022-11,微信已弃用该接口,已无法通过其获取用户信息)。
 *     openid:用户的身份标识,每个用户在每个公众号或者小程序中都有一个唯一openid,跨公众号/小程序时openid不相同。若想在公众号、小程序、开放平台等地方使用不同账号,则使用openid作为用户标识。
 *
 * @param code 通过wx.login获取到的用户的code(登录凭证)
 * @return 返回session_key、openid、isSuccess,通过isSuccess是否为true来判断是否成功获取到session_key、openid。
 *         示例:{"session_key":"VtyIGnq9U2E8c95XUm2SeQ==","openid":"o60_YvksCvHRpajcmiLVAUYybXcM","isSuccess":"false"}
 */
public String getSessionKeyByWX(String code) {
    String baseUrl = ONLINE_PEOPLE_URL + "?appid=" + APP_ID + "&secret=" + SECRET + "&js_code=" + code + "&grant_type=authorization_code";
    log.info("---微信登陆,通过code获取sessionkey");
    log.info("---baseUrl ="+baseUrl);
    //使用 hutool 发起get请求
    //基于JDK的HttpUrlConnection封装
    String result = HttpUtil.get(baseUrl);
    log.info("---拿到GET结果 ="+result);
    //使用 hutool 解析json
    JSONObject jsonObject = JSONUtil.parseObj(result);
    if(!jsonObject.isNull("session_key")) {
        //成功获取到session_key等数据
        return result.substring(0,result.length()-1)+",\"isSuccess\":\"true\"}";
    }else {
        //失败,没获取到session_key等数据
        return "{\"session_key\":\"\",\"openid\":\"\",\"isSuccess\":\"false\"}";
    }
}

使用 session_key 解密encryptedData数据,获取用户信息(已废弃,encryptedData中没有用户数据):

/**
 * 微信登陆,解密encryptedData数据。
 *     但因为微信调整了用户信息权限,只能获取unionid,不能再获取头像、昵称、性别、地区等信息。
 *     unionid,微信用户的唯一标识(相当于微信用户ID),若想在公众号、小程序、开放平台等地方使用同一个账号,则使用unionid
 * @param encryptedData 被加密的数据
 * @param signature 加密秘钥(即getSessionKey方法返回的sessionKey)
 * @param iv 偏移量
 * @return 解密后的encryptedData(用户信息)
 */
public DataVo<String> getUserInfo(String encryptedData, String signature, String iv){
    // 被加密的数据
    byte[] dataByte = Base64.getDecoder().decode(encryptedData);
    // 加密秘钥
    byte[] keyByte = Base64.getDecoder().decode(signature);
    // 偏移量
    byte[] ivByte = Base64.getDecoder().decode(iv);

    log.error("被加密的数据 encryptedData= "+encryptedData);
    log.error("加密秘钥 sessionKey= "+signature);
    log.error("偏移量 iv= "+iv);

    //hutool AES解密
    AES aes = new AES("CBC","PKCS7Padding",keyByte,ivByte);
    String res = aes.decryptStr(dataByte);
    log.info("---解密后 ="+res);
    // 解密并返回
    return JSONResult.ok(res);
}

说明

本博客中的案例,使用的maven依赖如下:http请求、AES解密均使用的是hutool

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.2</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!--        启用web支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--        hutool-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.10</version>
</dependency>



笔记摘自:CSDN-、楽. 、 知乎-微信小程序获取用户unionId 、 微信官方文档 • 小程序

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

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

相关文章

数学计算-C语言实现

任务描述 计算如下公式的值: 其中π=3.1415926 本关知识 C语言常用数学函数及其用法 在使用C语言数学函数时候,应该在该源文件中使用以下命令行包含库文件: #include <math.h> 或 #include "math.h" 本题中用到的C语言数学函数如下: abs函数: 求整型…

Pytorch模型自定义数据集训练流程

文章目录Pytorch模型自定义数据集训练流程1、任务描述2、导入各种需要用到的包3、分割数据集4、将数据转成pytorch标准的DataLoader输入格式5、导入预训练模型&#xff0c;并修改分类层6、开始模型训练7、利用训好的模型做预测Pytorch模型自定义数据集训练流程 我们以kaggle竞…

交互与前端20 APIFunc.DataBase监控

说明 APIFunc.DataBase的第一版有一个监控一直在做agg,造成数据库的无谓消耗,所以一定得修补。在修补的同时,做了一些主要的修改: 1 【自增ID】给Mongo的In和Out增加了数据的自动编号和随机数生成。2 【使用缓存】通过Redis缓存,极大的的减轻了Mongo(主库)的负担这样,使得…

Kruskal重构树学习笔记(C++)

Kruskal重构树学习笔记 提示&#xff1a; 学习Kruskal重构树之前建议先了解一下Kruskal算法&#xff0c;虽然不了解这个影响不会很大 但一定要了解一下并查集的算法 接下来如果想要应用Kruskal重构树&#xff0c;一定要了解一下LCA算法 什么是Kruskal重构树 这里先简单说…

exec函数族详解

文章目录exec介绍exec族execl函数execlp函数execv函数exec介绍 通过命令查看帮助&#xff1a;man 3 exec exec 函数族的作用是根据指定的文件名找到可执行文件&#xff0c;并用它来取代调用进程的内容&#xff0c;换句话说&#xff0c;就是在调用进程内部执行一个可执行文件。…

基于多线程版本的定时器

定时器 1)咱们前面学习过的阻塞队列&#xff0c;相比于普通的队列线程安全&#xff0c;相比于普通的队列起到一个更好的阻塞效果 2)虽然使用阻塞队列&#xff0c;可以达到销峰填谷这样的一个效果&#xff0c;但是峰值中有大量的数据涌入到队列中&#xff0c;如果后续的服务器消…

教程:Flutter 和 Rust混合编程,使用flutter_rust_bridge自动生成ffi代码

实践环境&#xff1a;Arch Linuxflutter_rust_bridge官方文档Flutter环境配置教程 | Rust环境配置教程记录使用flutter_rust_bridge遇到的一些坑。假设已经我们配置了Fluuter与Rust环境现在直接使用flutter_rust_bridge模板创建自己的项目运行&#xff1a;git clone https://gi…

W13Scan 扫描器挖掘漏洞实践

一、背景 这段时间总想捣鼓扫描器&#xff0c;发现自己的一些想法很多前辈已经做了东西&#xff0c;让我有点小沮丧同时也有点小兴奋&#xff0c;说明思路是对的&#xff0c;我准备站在巨人的肩膀去二次开发&#xff0c;加入一些自己的想法&#xff0c;从freebuf中看到W13Scan…

进程调度模块

目录 1.进程介绍 2.进程调度 2.1.进程状态 2.2.进程调度函数 ---schedule 2.3.进程切换函数 ---switch_to&#xff08;&#xff09; 1.进程介绍 在进程模块里面&#xff0c;我们知道了进程就是一个task_struct的结构体&#xff0c;里面含有进程的各种信息。进程存放在进程…

AppScan被动手动探索扫描

系列文章 AppScan介绍和安装 AppScan 扫描web应用程序 第三节-AppScan被动手动探索扫描 被动式扫描&#xff1a;浏览器代理到AppScan&#xff0c;然后进行手工操作&#xff0c;探索产生出的流量给AppScan进行扫描。 他的优点是&#xff1a;扫描足够精准&#xff0c;覆盖率更…

注册中心和负载均衡(黑马SpringCloud笔记)

注册中心和负载均衡 目录注册中心和负载均衡一、服务远程调用1. RestTemplate2. 服务调用关系3. 远程调用的问题二、注册中心1. Eureka注册中心1.1 搭建Eureka注册中心1.2 服务注册1.3 服务拉取1.4 小结2. nacos注册中心2.1Nacos搭建2.2 服务注册2.3 服务拉取2.4 服务分级存储模…

虹科新闻 | 虹科与丹麦Eupry正式建立合作伙伴关系

近期&#xff0c;虹科与丹麦Eupry正式建立合作伙伴关系。未来&#xff0c;虹科与Eupry将共同关注最具创新性和稳定性的解决方案&#xff0c;为客户提供温度记录仪、温湿度记录仪、Mapping温度分布验证服务、以及基于云的温湿度自动监测系统。 虹科非常高兴欢迎并宣布我们的新合…

【Linux】基础:进程信号

【Linux】基础&#xff1a;进程信号 摘要&#xff1a;本文将会从生活实际出发&#xff0c;由此掌握进程信号的学习过程&#xff0c;分别为信号的产生、信号的传输、信号的保存和信号的处理&#xff0c;最后再补充学习信号后方便理解的其他概念。 文章目录【Linux】基础&#xf…

echarts柱状图值为0时不显示以及柱状图百分比展示

echarts柱状图值为0时不显示以及柱状图百分比展示 1.效果展示 2.代码 <template><div id"container"><div id"main"></div></div> </template> <script>import * as echarts from echarts import * as lodash…

(JVM)浅堆深堆与内存泄露

​浅堆深堆与内存泄露 1. 浅堆&#xff08;Shallow Heap&#xff09; 浅堆是指一个对象所消耗的内存。在 32 位系统中&#xff0c;一个对象引用会占据 4 个字节&#xff0c;一个 int 类型会占据 4 个字节&#xff0c;long 型变量会占据 8 个字节&#xff0c;每个对象头需要占用…

01.【Vue】Vue2基础操作

一、Vue Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&…

十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

自动化测试 | 这些常用测试平台,你们公司在用的是哪些呢?

本文节选自霍格沃兹测试学院内部教材 测试管理平台是贯穿测试整个生命周期的工具集合&#xff0c;它主要解决的是测试过程中团队协作的问题。在整个测试过程中&#xff0c;需要对测试用例、Bug、代码、持续集成等等进行管理。下面分别从这四个方面介绍现在比较流行的管理平台。…

Spring入门-SpringAOP详解

文章目录SpringAOP详解1&#xff0c;AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念2&#xff0c;AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知…

Anaconda+VSCode配置tensorflow

主要参考https://blog.csdn.net/qq_42754919/article/details/106121979vscode的安装以及Anaconda的安装网上有很多教程&#xff0c;大家可以自行百度就行。在安装Anaconda的时候忘记勾选自动添加path&#xff0c;需要手动添加环境变量path下面介绍tensorflow安装教程:1.打开An…