手把手教程用Java实现微信公众号扫码登录功能

article/2025/10/1 21:21:23

文章目录

  • 前言
  • 一、环境准备
  • 二、使用步骤
    • 1. 使用微信工具包
    • 2. 创建数据表
    • 3. 登录页面代码逻辑
    • 4. 验证微信公众号登录
  • 总结


前言

微信现今是我们必不可少的社交工具了,围绕微信这个生态实际上有很多东西可以做,我们经常会看到一些网站通过微信扫码进如公众号登录。一方面方便了用户登录,另外一方面也可以给公众号带来一定的流量,今天就通过Java SpringBoot项目来用微信公众号参数二维码实现扫码登录。实现的方式很多,今天介绍一下我的思路。

⭐⭐⭐ 文末附完整代码获取方式。 ⭐⭐⭐


一、环境准备

  1. Linux/Windows服务器
  2. 微信公众号一个
  3. Java SpringBoot开发环境
  4. MySQL数据库
  5. 会写代码的程序员1个
  6. com.github.binarywang:weixin-java-mp:3.3.0 微信工具包

二、使用步骤

1. 使用微信工具包

build.gradle里面加入如下代码后重新获取依赖

dependencies {...compile 'com.github.binarywang:weixin-java-mp:3.3.0'...
}

2. 创建数据表

数据表是两边沟通的桥梁,qrcode_ticket 主要是参数二维码的主要信息,session_code是用户的登录会话标识。open_id为公众号产生的open_id。

CREATE TABLE `user_login_session` (`id` int(11) NOT NULL AUTO_INCREMENT,`qrcode_ticket` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,`session_code` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`open_id` varbinary(255) DEFAULT NULL,`create_time` timestamp NULL DEFAULT NULL,`update_time` timestamp NULL DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `qrcode_ticket` (`qrcode_ticket`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. 登录页面代码逻辑

后端逻辑,当用户没有session_code的时候跳转到登录页面,这个时候登录页面需要展示一个带参数的二维码。后端核心代码逻辑如下。

@GetMapping("/login")
public ModelAndView login()
{HashMap<String, String> map = new HashMap<String, String>();String marketQrcode;//这里是生成一个任意随机字符串String qrcodeTicket =  RandomUtil.generateDeviceToken(); try{String scene = "login_" + qrcodeTicket;WxMpQrCodeTicket ticket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(scene,600);marketQrcode = UserService.SHOW_QRCODE_WX_BASE_URL + ticket.getTicket();}catch (Exception e) {marketQrcode = "";}map.put("qrcodeUrl", marketQrcode);map.put("qrcodeTicket", qrcodeTicket);//存到上面的表里面userLoginSessionService.create(qrcodeTicket);return new ModelAndView("login", map);
}

前端登录页面显示出来二维码。通过上面代码可以看到qrcodeUrl就是要展示的二维码的地址,qrcodeTicket就是联系二维码和登录状态的中间参数。

<div><img style="width:160px;" src="${qrcodeUrl}" />
</div>

这个参数给到前端,前端会一直带着这个qrcodeTicket每隔3s轮训发起请求,用户扫码登录成功之后,会对这个qrcodeTicket生成一个session_code,当发现这个session_code不为空时候表示用户登录成功了。就可以带着跳转到目标页面了。通过这个session_code去授权。

<script>
loopTimes = 0;
var timer1 = setInterval(function(){checkLogin()
},3000)
function checkLogin() {loopTimes ++if(loopTimes > 30){clearInterval(timer1)}$.ajax({type: 'get',url: '/target/checkLogin',dataType: 'json',data: {qrcodeTicket: '${qrcodeTicket}'},success:function(res){// 如果生成了sessionCode表示登录成功if(res.sessionCode) {window.location.href = "/target/go?sessionCode=" + res.sessionCode}}})
}
</script>

java后端代码检查登录情况。

@GetMapping("/checkLogin")
@ResponseBody
public UserLoginSession checkLogin(@RequestParam String qrcodeTicket)
{HashMap<String, String> map = new HashMap<String, String>();return userLoginSessionService.findByQrcodeTicket(qrcodeTicket);
}

4. 验证微信公众号登录

微信公众号登录成功后,会触发handle方法,这个时候需要在这个方法里面处理相关逻辑,生成sessionCode。核心代码如下。

@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService,WxSessionManager sessionManager) {String eventKey = wxMessage.getEventKey();String scanQrcodeInfo = eventKey.startsWith("qrscene_") ? eventKey.replace("qrscene_", "") : eventKey;String qrcodeTicket = scanQrcodeInfo.replaceAll("login_", "");String sessionCode = RandomUtil.generateDeviceUuid();userLoginSessionService.updateSessionCode(qrcodeTicket, sessionCode, wxMessage.getFromUser());return msg("登录成功", wxMessage);
}

通过以上的操作,基本上就实现了微信公众号扫码登录的功能。


总结

以上就是今天要讲的内容,本文介绍并实现了Java微信公众号扫码登录功能。有疑问的地方,欢迎下方留言讨论哦。更多精彩内容,即将呈现。

⭐⭐⭐ 完整代码获取方式如下 ⭐⭐⭐

最近不少小伙伴关注到我这篇文章,想要完整的代码,拿到完整的代码请记得一定要先看配置说明。
在这里插入图片描述
获取方式一:点击下方链接下载:
Java实现微信公众号扫码登录自己系统的功能,2023最新Java完整代码版本

获取方式二:如果不能下载也可以关注下面公众号与我直接联系。


http://chatgpt.dhexx.cn/article/9I4Ygxo7.shtml

相关文章

[一维前缀和]leetcode303:区域和检索 - 数组不可变(easy)

题目&#xff1a; 题解&#xff1a; 一维前缀和&#xff0c;元素数组[0,j]的前缀和对应prefix[j1] 代码如下&#xff1a; class NumArray { private:vector<int> prefix; public://题解&#xff1a;一维前缀和NumArray(vector<int>& nums) {int nnums.size()…

前缀和矩阵前缀和

前缀和 前缀和是一种重要的预处理&#xff0c;能大大降低查询的时间复杂度。我们可以简单理解为“数列的前 n n n 项的和”。 例题 有 N N N 个的正整数放到数组 A A A 里&#xff0c;现在要求一个新的数组 B B B&#xff0c;新数组的第 i i i 个数 B [ i ] B[i] B[i]…

【算法基础】一维前缀和 + 二维前缀和

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…

前缀和与差分总结

目录 1.前缀和 2.前缀和算法的好处 3.二维前缀和 4.差分 5.一维差分 6.二维差分 1.前缀和 前缀和是指某序列的前n项和&#xff0c;可以把它理解为数学上的数列的前n项和&#xff0c;而差分可以看成前缀和的逆运算。合理的使用前缀和与差分&#xff0c;可以将某些复杂的…

一维前缀和

今天我们来讲讲一维前缀和 首先我们来介绍一下一维前缀和&#xff0c;emmm其实和数列的前n项和差不多&#xff0c;它能在 O ( 1 ) O(1) O(1) 的时间复杂度操作数组的任意子区间&#xff0c;比如我们要找出一段区间的和。 我们先预处理出一个前缀和数组&#xff0c;为了方便使…

【算法】前缀和(一维前缀和与二维前缀和)

前缀和是一种重要的预处理&#xff0c;能大大降低查询的时间复杂度。 【一维前缀和】 给定一个数组A[1,2,……n]&#xff0c;则它的前缀和数组为PrefixSum[1..n]。定义为&#xff1a;PrefixSum[i] A[0]A[1]...A[i-1]&#xff1b; 【例子】 A[5,6,7,8] --> PrefixSum[5,…

【Python 百练成钢】前缀和

文章目录 前言&#x1f607;一维前缀和&#x1f608;问题描述问题分析代码实现 二维前缀和&#x1f47f;问题描述问题分析代码实现 ฅʕ•̫͡•ʔฅ&#x1f4af; 前言&#x1f607; 今天分享一下学到的基础算法前缀和。 首先了解一下前缀和的基础概念&#x1f604; 有一个序列…

【每日一算法】二维前缀和算法 _ 模板应用

&#x1f49b; 前情提要&#x1f49b; 本章节是每日一算法的二维前缀和算法的相关知识~ 接下来我们即将进入一个全新的空间&#xff0c;对代码有一个全新的视角~ 以下的内容一定会让你对数据结构与算法有一个颠覆性的认识哦&#xff01;&#xff01;&#xff01; ❗以下内容…

基础算法:二维前缀和

二维前缀和C模板&#xff1a; S[i, j] 第i行j列格子左上部分所有元素的和 S[i, j] S[i-1,j] s[i,j-1] - S[i-1,j-1] a[i,j](表示当前的数) 以(x1, y1)为左上角&#xff0c;(x2, y2)为右下角的子矩阵的和为&#xff1a; S[x2, y2] - S[x1-1,y2] - S[x2,y1-1] S[x1-1,y1-1]…

二维前缀和

二维前缀和 直接看一个例子 假设给定一个矩阵 1 2 4 3 5 1 2 4 6 3 5 9 那么&#xff0c;可以推出他的二维前缀和矩阵为 1 3 7 10 6 9 15 22 12 18 29 45 在二维前缀和数组中&#xff0c;9 1 2 5 1 15 1 2 5 1 4 2 18 1 5 6 2 1 3… … 即二位前缀和数组中第 …

二维数组前缀和

二维数组前缀和 对于二维数组求前缀和,我们先预处理第一行跟第一列的前缀和 第一行跟第一列的前缀和可以看作一维数组的前缀和 前缀和数组的0,0等于原数组的0,0,第一行为原数组第一行的前缀和,第一列为第一列的前缀和 预处理: //原数组 int arr[110][110]{{},{0,1,2,3,4,5,…

前缀和与经典例题详解

前缀和与及经典例题详解 南昌理工ACM集训队 这是目录 前缀和与及经典例题详解前言前缀和P5638 光骓者的荣耀 二维前缀和P2004 领地选择 最大子段和P1115 最大子段和P1719 最大加权矩形 写在最后 前言 下面的例题都出自于洛谷官方算法2-1题单&#xff0c;有兴趣的同学可以去水…

前缀和(C/C++)

目录 1. 前缀和的定义 2. 一维前缀和 2.1 计算公式 2.2 用途 2.3 小试牛刀 3. 二维前缀和 3.1 用途 1. 前缀和的定义 对于一个给定的数列A&#xff0c;他的前缀和数中 S 中 S[ i ] 表示从第一个元素到第 i 个元素的总和。 如下图&#xff1a;绿色区域的和就是前缀和数组…

前缀和(C++)实现

每日一句&#xff1a;真正让人变好的选择过程都不会很舒服&#xff0c;所以人们明知道什么都不做&#xff0c;会比较轻松&#xff0c;但依旧选择追逐梦想。 前缀和 前言一、一维前缀和1.前缀和是什么&#xff1f;2.暴力做法3.前缀和求区间大小3.1如何构成前缀和的形式&#xff…

差分与前缀和

目录 前言 一、算法原理 二、算法图解 三、算法模板 四、算法应用 前言 天梯赛和省赛快开始了&#xff0c;不想拖后腿&#xff0c;边更边学习吧。 酝酿好久的第一篇博客&#xff0c;缺点不少&#xff0c;多多指教吖。 点赞鼓励一下吧&#xff0c;亲。&#x1f619;&#x1…

算法设计 - 前缀和 差分数列

一维数组前缀和的概念 前缀和的概念很简单&#xff0c;我们用一维数组的前缀和来举例&#xff0c;有如下一维数组&#xff1a; arr [1, 2, 3, 4, 5] 该数组的前缀和数组如下 preSum [1, 3, 6, 10, 15] 关系如下&#xff1a; preSum[0] arr[0]preSum[1] arr[0] arr[1]pre…

python 前缀和总结

前缀和是数据结构与算法中比较重要的知识&#xff0c;前缀和经常可以结合哈希表解决很多有意思的问题。为了方便学习&#xff0c;在这里总结leetcode中出现的前缀和问题。 525. 连续数组 给定一个二进制数组 nums &#xff08;只含有0&#xff0c;1&#xff09;, 找到含有相同…

【c++入门(2)】前缀和

大纲 1.计算前缀和 2.计算字段和 3.后缀和 4.前缀积 5.后缀积 6.例题 1.计算前缀和 基础问题&#xff1a; 思路1&#xff1a; 枚举 cin (); for (int i 1; i < q; i) {cin >> x;int sum 0;for (int j 1; j < x; j){sum a[j];}cout << sum << endl…

前缀和

【前缀和】 什么是前缀和&#xff1f;前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。 设b[]为前缀和数组&#xff0c;a[]为原数组&#xff0c;根据这句话可以得到前缀和的定义式和递推式&#xff1a; 定义式递推式一维前缀和 二维前缀和 【一维前缀和】…

Java前缀和算法

一.什么是前缀和算法 通俗来讲&#xff0c;前缀和算法就是使用一个新数组来储存原数组中前n-1个元素的和&#xff08;如果新数组的当前元素的下标为n&#xff0c;计算当前元素的值为原数组中从0到n-1下标数组元素的和&#xff09;&#xff0c;可能这样讲起来有点抽象&#xff0…