springboot实现 伪微信登录

news2025/1/12 18:20:20

众所周知,微信扫码登陆的功能,个人网站是无法申请的,我们想在本地想测一下微信登录也是无法实现。

要实现微信登录,首先你得是一个企业单位,有公章才能申请,申请还要花费300块大洋。

如果我们只是想学习和体验一下微信登录,可以自己本地搭建个微型服务模拟一下,过一把瘾也是可以的。

如果你是企业用户,并顺利完成了微信开发者认证,就会得到一个 AppID 和 AppSecret。AppID 是公开的,谁都可以知道。 而 AppSecret 是私密的,只有开发者自己知道。

假设我们得到的 AppID 是 wx123456,AppSecret 是 87wjef4453deg432

网站使用微信扫码登录,得有个码对不对?

这个码是微信平台提供的,浏览器就是跳转到微信的网址上面有一个二维码。

比如 https://open.weixin.qq.com/connect/qrconnect?appid=wx123456&redirect_uri=http://localhost:8080/wx.html&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect

在这个地址我们传了appid,就是常规渠道我们去微信开发平台申请的应用ID。

http://localhost:8080/wx.html 这个是回调地址,就是说如果用户扫了码,点击确认,就会回调到这个地址。事实上我们不会写localhost,而是单位网址的域名,这个也是要提交材料审核的(还要加盖公章)。

需要明确一点,回调地址不一定是一个页面的地址,也可以是我们接口的地址,比如回调到我们controller中的某一个方法,也是没问题的。

接下来,我们就开始模拟。

二维码页面

要扫码,我们得有一个二维码的页面。

WxController:

/**
 * 二维码页面
 * @return
 */
@RequestMapping("wx/connect/qrconnect")
public String qrCode(){
    return "qrconnect";
}

qrconnect.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>微信扫码登录</title>
    <script src="/js/jquery.min.js" ></script>
    <script src="/js/jquery.qrcode.min.js" ></script>
</head>
<body>
    <h1>请扫码登录</h1>
    <a href="/wx/confirm">
        <div id="qrcode"></div>
    </a>

    <script>
        $(function(){
            $('#qrcode').qrcode({render:'canvas',text:"http://localhost:8080",width:160,height:160});
        });
    </script>

</body>
</html>

因为我们没有在线的网址,所以就给二维码加了一个点击事件,模拟扫码跳转。

点一下就跳转到:http://localhost:8080/wx/confirm

/**
 * 用户授权页面
 * @return
 */
@RequestMapping("/wx/confirm")
public String confirm(){
    return "confirm";
}

模拟扫码登录的授权页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>授权页面</title>
</head>
<body>
  <a href="/wx/pass?appid=wx123456&redirect_uri=wx&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect">同意</a>
</body>
</html>

点同意后跳转到 /wx/pass ,正常的逻辑是跳转到微信的服务端,微信端会根据你传过来的 appid (因为你已经认证过了,所以会直接跳转到你的回调地址,并且带上临时票据 code

临时票据的作用是你用来获取微信用户的 openidaccess_token ,这个操作需要你在回调接口中处理。

openid 是微信账号的唯一标识,可以用来对应你系统里面的用户,一般第一次登录的时候,你需要在用户表里面创建这个用户的。后面如果openid在你本地存在,就不用重复创建了。

access_token是用来获取微信用户的基本信息的,比如昵称,头像之类的,可以用来填充你的本地用户数据。

回调接口

以下代码就模拟了回调获取openidaccess_token的过程。

/**
 * 用户确认授权
 * @return
 */
@GetMapping("/wx/pass")
public String pass(String appid, String redirect_uri, Model model){
    String appSecret = "87wjef4453deg432";
    String code = "abc"; //模拟临时票据
    //通过 app_id, app_secret 和 code 获取接口调用凭证 access_token 和  授权用户唯一标识 openid
    String getAccessTokenURLFormat = "http://localhost:8080/wx/sns/oauth2/access_token?appid={}&secret={}&code={}&grant_type=authorization_code";
    String getAccessTokenURL = StrUtil.format(getAccessTokenURLFormat, appid,appSecret,code);

    //通过 hutool 工具类 访问url
    String tokenResponse = HttpUtil.get(getAccessTokenURL);
    //通过 hutool 工具类 转换为 json 对象
    JSONObject tokenJson= JSONUtil.parseObj(tokenResponse);

    //获取json 对象相关字段
    Integer errcode = (Integer)tokenJson.get("errcode");
    String errmsg = (String)tokenJson.get("errmsg");
    String openid = (String)tokenJson.get("openid");            //微信用户的唯一标识,可以跟自己数据库的用户进行关联
    String access_token = (String)tokenJson.get("access_token"); //作用是获取该微信用户的具体信息

    model.addAttribute("openid",openid);
    model.addAttribute("access_token",access_token);

    return redirect_uri;
}

http://localhost:8080/wx/sns/oauth2/access_token?appid={}&secret={}&code={}&grant_type=authorization_code

这个地址按理说是微信服务端的,不过我们就模拟一下,在本地写个接口,直接返回即可:

/**
 * 模拟获取AccessToken
 * @return
 */
@GetMapping("/wx/sns/oauth2/access_token")
@ResponseBody
public String getAccessToken(String appid,String secret,String code){
    JSONObject json = new JSONObject();
    json.set("errcode",null);
    json.set("errmsg",null);
    json.set("openid","666");
    json.set("access_token","&HG^FUI");

    return json.toString();
}

用到了hutool的方法,hutool依赖别忘了导入:

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

最终返回的页面是wx.html

<!DOCTYPE html>
<html>
<head>
    <title>Thymeleaf Example</title>
</head>
<body>
<span th:text="'恭喜,微信登录成功。 openid:' + ${openid} + ', access_token:' + ${access_token}"></span>
</body>
</html>

这样一来,当我点同意,就进入回调,回调再模拟远程调用获取openId,得到:

源码下载

https://gitee.com/skyblue0678/shiro-demo

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

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

相关文章

司徒理财:8.29黄金高空思路不变已盈利

黄金周五在鲍威尔的讲话中上蹿下跳&#xff0c;上探1922压制下跌&#xff0c;在1903一线探底回升&#xff0c;日线双十字K。昨日周一震荡上行&#xff0c;美盘还是冲高回落&#xff0c;日线小阳。 当前黄金走势趋于震荡&#xff0c;单从技术面来讲还是偏多&#xff0c;但是鲍威…

小白必看:期权行权前必须了解的问题。

期权的本质是一个买权或是卖权&#xff0c;也就是说你是权利方的话&#xff0c;你拥有以约定价格向对手方买入&#xff08;买权&#xff09;或卖出&#xff08;卖权&#xff09;一定数量标的的权利。期权行权就是从对手方买入&#xff0c;或向其卖出标的&#xff01;下文介绍小…

【实训项目】“魔法”APP-模型爱好者线上线下交流平台

1.设计摘要 自从2018年万代把翻模厂商龙桃子&#xff0c;后国内的模型厂商就开始逐渐慢慢的从单纯的翻模转向做魔改合金模型&#xff0c;一是由于单纯的出翻模的利润太低&#xff0c;二是由于翻模被万代查水表的风险很大。于是&#xff0c;国内的一些厂商把眼光转向合金成品&a…

网卡抓不到带Tag的数据包

Tag抓取修改注册表 用于解决网卡抓不到带Tag的数据包 一、修改查看网卡信息 1、打开网络适配器选项&#xff0c;右键需要修改的网卡–属性 2、在配置–高级中&#xff0c;找到优先级和VLAN&#xff0c;选择优先级和VLAN关闭&#xff0c;确认。 3、确认网卡驱动关键字 网卡右…

vue2 组件库之vetur提示

当我们开发完自定义UI组件库后&#xff0c;在项目中使用时&#xff0c;想要达到以下提示效果&#xff0c;组件提示与属性提示&#xff0c;有什么解决方案呢&#xff1a; 事实上&#xff0c;这是vetur的功能&#xff0c;原文如下&#xff1a; Component Data | Vetur If a pac…

RT_Thread内核机制学习(六)信号量

要传输较大数据时&#xff0c;使用队列。 传输较小数值时&#xff0c;使用邮箱。 队列、邮箱用来传递数据。 如果只是用来传递资源的个数&#xff0c;可以使用信号量。 A车与B车只需要传递信号量&#xff08;代表资源&#xff09;。 信号量 获取信号量 如果value>0&…

PDF可以修改内容吗?有什么注意的事项?

PDF是一种跨平台的电子文档格式&#xff0c;可以在各种设备上轻松阅读和共享。许多人喜欢将文档转换为PDF格式以确保格式的一致性和易读性。但是&#xff0c;PDF文件一般被认为是“只读”文件&#xff0c;即无法编辑。那么&#xff0c;PDF文件是否可以修改呢&#xff1f; 答案是…

CCF HPC China2023|澎峰科技:使能先进计算,赋能行业应用

CCF HPC China2023圆满落幕&#xff01; 桂秋八月&#xff0c;为期三天的中国高性能计算领域最高规格盛会——2023CCF全球高性能计算学术年会&#xff08;HPC China&#xff09;在青岛红岛国际展览中心圆满落幕。行业超算大咖、顶级学界精英、先锋企业领袖参会者齐聚山东青岛&a…

photoshop2022安装教程

安装教程 点击set-up.exe 点击确认&#xff0c;开始安装&#xff0c;需要等待一段时间 出现这个表示安装成功&#xff0c;点击关闭即可 查看版本&#xff1a;打开菜单栏中的“帮助”选项&#xff0c;点击"系统信息" 成功演示 安装包下载 https://ziby0nwxdov.feishu.…

VMware vCenter Server 7.0.3 安装

VMware vCenter Server 7.0.3 安装 文章目录 VMware vCenter Server 7.0.3 安装1. 安装 vcenter1.1 第一阶段1.2 第二阶段 2. exsi 查看 vcenter3. 部署 DNS server3.1 安装 unbound3.2 配置 unbound3.3 vcenter 配置域名访问 1. 安装 vcenter 1.1 第一阶段 双击 192.168.2…

从零开始探索C语言(一)----C语言程序结构、基本语法与数据类型

文章目录 1. 程序结构1.1 Hello World示例1.2 编译并执行C程序 2. 基本语法2.1 C 标记2.2 分号2.3 注释2.4 标识符2.5 关键字2.6 C中的空格 3. 数据类型3.1 整数类型3.2 浮点类型3.3 void类型 从第一次学习C语言到现在已经时隔五年了&#xff0c;大部分知识都还给老师了&#x…

C++day7(封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象【保存+读取】、实现与list相关的函数 )

1.封装一个学生的类&#xff0c;定义一个学生这样类的vector容器, 里面存放学生对象 再把该容器中的对象&#xff0c;保存到文件中。&#xff08;至少3个&#xff09; 再把这些学生从文件中读取出来&#xff0c;放入另一个容器中并且遍历输出该容器里的学生。 #include <…

STM32f103入门(5)定时器中断

STM32 TIM&#xff08;定时器/计数器&#xff09;模块的中断流程如下&#xff1a; 配置TIM寄存器&#xff1a;首先&#xff0c;通过配置TIM相关的寄存器来设置计时器的基本参数&#xff0c;例如预分频系数、计数模式、计数器周期等。 使能TIM中断&#xff1a;使用TIM_ITConfig函…

时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测

时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测 目录 时序预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM和BiLSTM时间序列预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-BiLSTM、PSO-BiLSTM和BiLSTM神经网络时间序列预测…

王老吉与加多宝共同的课题:受困于第二招牌

王老吉曾经凭借凉茶单品反超可口可乐&#xff0c;却在2015年后面临增速下滑、市场规模逐年缩小的增长困境。事实上&#xff0c;王老吉所在的凉茶市场现已成为存量市场&#xff0c;甚至在不断激化的竞争中逐年萎缩。为了打破原有业务的局限&#xff0c;王老吉曾推出过许多新品&a…

网站应用微信登录

准备工作 | 微信开放文档 <template><wxloginid"wxLoginForm"self_redirect"false":appid"appid":scope"scope":state"state":redirect_uri"redirect_uri"></wxlogin> </template><…

智慧实景无人直播带货系统搭建方案,一起来了解一下吧!

随着无人直播和带货的兴起&#xff0c;智慧实景无人直播带货系统成为了电商行业的新宠。本文将提出一种专业的搭建方案&#xff0c;通过技术驱动和商业机遇&#xff0c;实现智慧实景无人直播带货系统的成功落地。我们将深入探讨系统架构、技术支持和商业模式等关键要素&#xf…

安卓学习笔记

文章目录 1. Android系统架构2. Activity2.1 生命周期2.2 生命状态2.3 启动模式 3. Service3.1 定义3.2 两种启动方式3.3 生命周期3.4 跨进程service3.5 IntentService 4. BroadCastReceiver4.1 概念4.2 组成4.3 广播接收器的分类4.4 生命周期4.5 静态注册和动态注册 5. Conten…

C语言初阶学习笔记

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.复杂概念 1.1大小端 1.2 整形提升 1.2.1整形提升的意义…

达梦数据库物化视图介绍

概述 本文将介绍达梦数据库物化视图&#xff0c;给出其概念及相关创建、使用示例。 1.物化视图概念 物化视图 (MATERIALIZED VIEW) 是目标表在特定时间点上的一个副本&#xff0c;占用存储空间&#xff0c;即将查询出来的数据存储在数据库中。当所依赖的一个或多个基表的数据…