Spring学习笔记(二十三)——实现网站微信扫码登录获取微信用户信息Demo

news/2024/5/10 5:10:15/文章来源:https://blog.csdn.net/qq_42038623/article/details/114468240

目录

  • 微信扫码登录介绍
    • 开发步骤
    • 微信扫码登录示例
    • 微信开放文档
    • 遇到的问题
  • 使用第三方工具实现网站微信扫码登录
    • 开发前介绍
    • 开发步骤
    • 微信扫码登录获取微信用户信息Demo实现流程
      • 实现效果
      • 实现过程
      • 实现源码
  • 源码下载

微信扫码登录介绍

微信扫码登录是指微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

开发步骤

  1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
  3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

微信扫码登录示例

如进去下面的网站时
https://passport.yhd.com/wechat/login.do
需要微信进行授权登录
在这里插入图片描述
当我们进行扫码登录后,服务器就可以通过微信开放平台获取登录用户的信息,达到对第三网站更为安全,更为人性化的体验。

微信开放文档

地址链接:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
具体微信提供给开发者的文档非常详细,具体可以参照开发文档进行操作。

遇到的问题

  1. 使用微信开放平台必须注册一个微信开放平台账号
    微信开放平台链接:https://open.weixin.qq.com/
    注册需要提供很详细的资料
    在这里插入图片描述
    必须要提供已备案的域名网站,最后提交信息后会进行审核
  2. 如果需要使用微信开放平台,必须要进行开发者资质认证
    这个是一个很麻烦的事情。
    在这里插入图片描述
    在这里插入图片描述
  3. 当认证完成之后,我们即可以创建网站应用
    在这里插入图片描述
    接着又是填写一大堆资料,最后进行审核(1-3天,很麻烦)
    在这里插入图片描述
  4. 当创建网站应用成功后,我们就可以使用改应用的域名开开心心的根据开发文档进行开发了
    由于开放平台的开发者资质认证的要求比较苛刻,个人开发者难以达到要求,所以具体实现我并没有实践过,但是我重点要分享的时下面使用第三方工具进行微信授权。
    如果有条件,要从事微信开发,可以尽量申请开发者资质。申请后不仅网站上可以进行微信授权开发,还有一下项目都可以进行微信开发。
    在这里插入图片描述
    但还是想吐槽微信开发不友好,每次新建一个项目或者申请都需要进行审核,有很大的被打回的风险,也很耗费时间,跟客服沟通经常联系不到,所以个人开发者真的比较困难。

使用第三方工具实现网站微信扫码登录

开发前介绍

本次要介绍的实现微信扫码登录的第三方工具叫做:码上登录
官网地址:http://login.vicy.cn/
码上登录,是一个为各网站提供微信扫一扫登录能力的平台。
支持个人网站接入,无需企业认证, 使您的网站即刻拥有微信 [扫一扫] 登录能力!
在官网中有使用场景案例和功能介绍,可以自行查看

其中官网中最重要的一个东西:就是API文档啦
API文档:http://login.vicy.cn/apiWord.html
里面的介绍也比较详细,不过第一次使用也会有写困难,慢慢就熟悉了。

开发步骤

  1. 首先使用微信登录码上登录官网,注册账号
  2. 然后就可以直接创建应用了
    在这里插入图片描述
    填写回调url的时候必须填写已备案域名的回调地址(下面细说)
  3. 接着打开API文档,试着请求接口请求地址:https://server01.vicy.cn/8lXdSX7FSMykbl9nFDWESdc6zfouSAEz/wxLogin/tempUserId?secretKey=xxxxxxxxxxxxxxxxxx(即我们创建应用时所生成的secretKey)
    请求成功之后返回以下信息:
    在这里插入图片描述
  4. 如果拿得到qrCodeReturnUrl说明登录成功,接着需要开发服务器进行接受码上登录服务器发出的请求,改请求时post请求,并且携带参数
    在这里插入图片描述
    特别注意:当我们写后台回调时,使用controller,并且创建RequestMapping(""),改请求的路径必须是你创建应用是填写的url
    代码示例:
    /*** @param response* @param map* @return 接收参数回调,是被回调的,第三方码上登录回调*/@RequestMapping("/loginService")@ResponseBodypublic LoginResultVO loginService(HttpServletResponse response,@RequestParam Map<String, String> map) {System.out.println(map);userMap = map;LoginResultVO loginResultVO = new LoginResultVO();//System.out.println("我被调用了");loginResultVO.setErrcode(0);loginResultVO.setMessage("成功");return loginResultVO;}
    
    项目创建的示例:
    在这里插入图片描述
  5. 是很重要的一步:当开发服务器接收到码上登录服务器发送的请求拿到数据时,开发者服务器需要向“码上登录”服务器返回一个是否登录成功的状态码。
    在这里插入图片描述
    返回数据类型有两个字段,返回 0 和 “成功” 即可。

当完成以上5个步骤后,一次微信扫码授权登录的过程才真正完成,也就是开发者服务器真正成功拿到了登录用户的信息数据。

微信扫码登录获取微信用户信息Demo实现流程

实现效果

  1. 登录界面
    在这里插入图片描述
  2. 当微信扫码后
  • 手机端
    在这里插入图片描述

  • PC端
    在这里插入图片描述

  1. 登录成功后
  • 后台拿到数据
    在这里插入图片描述

  • 前端显示信息
    在这里插入图片描述

实现过程

  1. 由于使用码上登录必须使用公网url进行开发,所以先使用内网穿透工具,穿透本地项目到外网。
    推荐使用:NATAPP—内网穿透:https://natapp.cn/
    具体使用查看教程:https://natapp.cn/article

  2. 创建项目编写代码

  3. 使用到的工具

  • 二维码生成包
    <script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script>
    <script src="https://blog-static.cnblogs.com/files/lovling/jquery.qrcode.js"></script>
    
  • 创建二维码示例
    <div id="output"></div>
    <script
    $('#output').qrcode({text: qrCodeReturnUrl, // 二维码的内容render: "canvas", // 设置渲染方式width: 360, // 设置宽度: 默认256height: 360, // 设置高度: 默认256background: "#ffffff", // 背景颜色foreground: "#000000", // 前景颜色// src: "xxx.png", //二维码中间的图片
    });
    </script>
    
  • Ajax轮询请求
    什么是轮询?
    轮询(polling):客户端按规定时间定时向服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接。 Ajax轮询需要服务器有很快的处理速度与快速响应。
    Ajax轮询原理:客户端是按照规定时间(这个时间由你设定,此处默认为1秒)像服务端发送请求,前一次请求完成后,无论有无结果返回,一秒之后下一次请求又会发出。这就叫做Ajax轮询。
    实现Ajax轮询示例
    <script>
    $(function(){var code,status;function getResult(){var params = {code: code,operate: '什么操作TODO:',};$.ajax({type: 'POST',url: "请求地址TODO:",data: params, success: function(response) {console.log('成功啦');//对成功数据的操作TODO:clearInterval(status);               },dataType: 'json',timeout: 30*1000,// 超时时间// 超时意味着出错了error: function (error) {console.log('失败啦');}});}});
    //获取code。如果code存在则调用轮询来获取数据if(code){status = setInterval(getResult, 1000);}</script>
    
  1. 实现登录的原理
    1. 使用ajax调用码上登录获取登录二维码相关信息的接口:https://server01.vicy.cn/8lXdSX7FSMykbl9nFDWESdc6zfouSAEz/wxLogin/tempUserId?secretKey=xxxxxxxxxxxxxxxxxx(即我们创建应用时所生成的secretKey),拿到码上登录服务端为我们提供的qrCodeReturnUrl。
    2. 使用二维码生成工具,生成信息为qrCodeReturnUrl的二维码
    3. 后端编写接口,判断是否拿到了用户信息。
    4. 前端生成二维码之后进行Ajax轮询,发送请求询问后端是否拿到了用户的信息,如果没有拿到,说明没有人扫二维码,继续轮询,如果拿到了,则结束Ajax轮询,设置二维码过期,不许再使用。
    5. 结束轮询,跳转到编写的用户信息页面

实现源码

  1. 前端页面
  • index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<script>window.location.href = "/login"
</script>
</body>
</html>
  • qrcode.html
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>二维码</title><script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script><script src="https://blog-static.cnblogs.com/files/lovling/jquery.qrcode.js"></script>
</head>
<style type="text/css">body {background: #095f88;}/* 登录字体 */.text {color: cornsilk;text-align: center;margin-top: 50px;opacity: 0.7;}/* 二维码 */#output {margin: 50px auto;width: 360px;padding: 0;opacity: 0.8;}
</style><body>
<h1 class="text">请使用微信进行扫码登录</h1><div class="main"><div id="output"></div>
</div>
<h2 style=" text-align: center; color: #cccccc" id="msg"></h2>
</body>
<script type="text/javascript">$.ajax({type: "get",url: "https://server01.vicy.cn/8lXdSX7FSMykbl9nFDWESdc6zfouSAEz/wxLogin/tempUserId?secretKey=62320bcb05f4428ca8b13c462e104777",data: "data",async: false,dataType: "json",success: function (response) {// console.log('response :>> ', response);qrCodeReturnUrl = response.data.qrCodeReturnUrl;}});console.log(qrCodeReturnUrl)$('#output').qrcode({text: qrCodeReturnUrl, // 二维码的内容render: "canvas", // 设置渲染方式width: 360, // 设置宽度: 默认256height: 360, // 设置高度: 默认256background: "#ffffff", // 背景颜色foreground: "#000000", // 前景颜色// src: "http://qkongtao.cn/wp-content/uploads/2020/02/logo1.fa9c5aaa.png", //二维码中间的图片});//ajax的轮询var timer1 = setInterval(checkScan, 1000);//每隔1s执行一次checkScanvar timer2 = null;function checkScan() {$.ajax({type: 'get',url: "/loginData",// async: false,success: function (data) {console.log(data)if (!$.isEmptyObject(data)) {//有用户扫描了该二维码,应停止对checkScanServlet的轮询window.clearInterval(timer1);console.log("拿到数据")$('#msg').html(data.nickname + "已经扫描,请在客户端确认");//将二维码取消,防止其他人再扫timer2 = setInterval(checkConfirm, 1000);//轮询用户是否确认登录}}});}function checkConfirm() {$.ajax({type: 'get',url: "/loginSuccess",// async: false,success: function () {console.log("跳转********")window.clearInterval(timer2);window.location.href = "/loginSuccess"}});}</script></html>
  • userInfo.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>登陆信息</title>
</head>
<body>
<h1 style="text-align: center;">您的登录信息</h1>
<div style="width: 800px;height: 600px;margin: 50px auto;"><h3>用户名:<span th:text="${session.loginUser.nickname}"></span></h3><h3>openid:<span th:text="${session.loginUser.userId}"></span></h3><h3>头像图片:<img th:src="${session.loginUser.avatar}"></h3><h3>登录ip地址:<span th:text="${session.loginUser.ipAddr}"></span></h3></div>
</body>
</html>
  1. 后端实现
  • LoginResultVO.java(返回数据的封装类)
package cn.kt.wxlogin.domain;/*** @author tao* @date 2021-03-06 23:18* 概要:*/
public class LoginResultVO {Integer errcode;String message;public Integer getErrcode() {return errcode;}public void setErrcode(Integer errcode) {this.errcode = errcode;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Overridepublic String toString() {return "LoginResultVO{" +"errcode=" + errcode +", message='" + message + '\'' +'}';}
}
  • WXLoginController.java
package cn.kt.wxlogin.controller;import cn.kt.wxlogin.domain.LoginResultVO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;/*** @author tao* @date 2021-03-06 23:09* 概要:*/
@Controller
public class WXLoginController {/*扫码用户信息*/private Map<String, String> userMap = new HashMap<>();/*** @param response* @param map* @return 接收参数回调,是被回调的,第三方码上登录回调*/@RequestMapping("/loginService")@ResponseBodypublic LoginResultVO loginService(HttpServletResponse response,@RequestParam Map<String, String> map) {System.out.println(map);userMap = map;LoginResultVO loginResultVO = new LoginResultVO();//System.out.println("我被调用了");loginResultVO.setErrcode(0);loginResultVO.setMessage("成功");return loginResultVO;}/*** @return 负责跳转登录*/@RequestMapping("/login")public String login() {return "qrcode";}/*** @author :tao* @date :Created in 2021-03-07 1:24* @param: :* @return: 返回前端用户信息,判断二维码有没有被扫*/@RequestMapping("/loginData")@ResponseBodypublic Map<String, String> loginData() {return userMap;}/*** @author :tao* @date :Created in 2021-03-07 1:30* @return: map* 登陆成功,进行跳转*/@RequestMapping("/loginSuccess")public ModelAndView loginSuccess(HttpServletResponse response,Map<String, String> map,HttpServletRequest request) {HttpSession session = request.getSession();/*如果session中user有值,则不需要重复*/if (request.getSession().getAttribute("loginUser") == null) {session.setAttribute("loginUser", userMap);}//清空用户数据System.out.println(userMap);userMap = null;return new ModelAndView("userInfo");}
}

源码下载

链接:https://pan.baidu.com/s/1qlNECaOmMtWsOCtd_gMSqg
提取码:a9lh
复制这段内容后打开百度网盘手机App,操作更方便哦

把自己毕业设计中用到的小技术写成博客笔记,也花了很长时间整理,如果觉得对大家有帮助,可以点赞、评论、关注,长的帅的可以大方的打赏支持一下 ^ _ ^
有什么问题都可以联系我(评论就可以了!)

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg+nginx+rtmp+web实现视频直播网站

项目简介&#xff1a;视频直播网站由三个部分构成&#xff1a;1.推流端 2.服务器 3.拉流端。在该项目中&#xff0c;推流端用ffmpeg完成&#xff0c;服务器由NGINXRTMP模块完成&#xff0c;拉流端使用VLC完成。 一、开发环境简介&#xff1a; 推流端&#xff1a;系统&#xff1…

网站安装打包 修改app.config[六]

在winform的安装工具中&#xff0c;少不免有一些配置文件要放到app.config去&#xff0c;于是修改也是成了一种需求&#xff01; 无论是修改web.config还是app.config&#xff0c;普遍方式都有两种&#xff0c;用net自带封装的类&#xff0c;或是自定义xml操作。 可参考之前的一…

如何在IIS里对网站限速

不管是ISP或是程序开发者&#xff0c;都可能需要在特定情况下&#xff0c;对使用IIS搭建的Web站点进行限速。 本文就简单说说在IIS中如何限速&#xff0c;因为之前不久&#xff0c;我也象大多数开发者一样&#xff0c;由于程序测试的需要&#xff0c;寻求IIS限速的方法&#xf…

换了无线路由网站打不开的解决方法

一日领导家安装adsl宽带了想用无线上网就购了个dlink双线的无线路由&#xff0c;设置好参数后开始拔号等了很久都没有反应&#xff0c;死活拔不上去。最后没有办法只好另想他法&#xff0c;回到单位一想单位有一个tplink三线无线路由两个换换不就行了。想到这第二天马上拿到领导…

javaweb 网站邮件发送 javaMail

我们这里是使用qq邮箱来演示邮件的发送&#xff0c;需要先对qq邮箱先进行一些设置。在设置-账户我需要开启这个pop3协议&#xff0c;他会生成一个授权码。 常用的邮件传输协议有2种&#xff1a;POP3/SMTP、IMAP/SMTP。 POP和IMAP的区别&#xff1a;在邮箱客户端的操作&#xf…

网站图片延时加载

为什么80%的码农都做不了架构师&#xff1f;>>> 当你看到网页上有很多图片&#xff0c;会不会感觉加载速度超慢&#xff0c;甚至有砸电脑的冲动&#xff1f;其实&#xff0c;我们可以优先加载肉眼能够看到的图片&#xff0c;当用户拖动滚动条时&#xff0c;再加载其…

在线绘图网站

https://www.freedgo.com/

【百度地图API】——国内首款团购网站的地图插件

原文:【百度地图API】——国内首款团购网站的地图插件摘要&#xff1a; 本文介绍了一款应用在团购网站上的地图插件&#xff0c;适用于目前非常流行的团购网站。使用这款地图插件&#xff0c;无需任何编程技术&#xff0c;你就把商家的位置轻松地标注在地图上。 前台地址 http:…

电商网站接入快递查询

网页跳转格式 适用场景&#xff1a;在管理后台中&#xff0c;订单列表点击显示快递详情 和 订单详情页显示快递详情&#xff0c;使用 iframe 嵌入该URL http://www.kuaidi100.com/chaxun?com快递名称&#xff08;可以中文英文&#xff09;&nu快递单号 快递名称&#xff1a…

Python识别网站验证码

http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning 2015/05/28 10:570x00 识别涉及技术 验证码识别涉及很多方面的内容。入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足。 验证码图像处理 验证码图像识别技术主要是操作图片内的像素点,通过…

ASP.NET MVC 网站开发总结(五)——Ajax异步提交表单之检查验证码

首先提出一个问题&#xff1a;在做网站开发的时候&#xff0c;用到了验证码来防止恶意提交表单&#xff0c;那么要如何实现当验证码错误时&#xff0c;只是刷新一下验证码&#xff0c;而其它填写的信息不改变&#xff1f; 先说一下为什么有这个需求&#xff1a;以提交注册信息页…

高并发量网站解决方案

2019独角兽企业重金招聘Python工程师标准>>> 一个小型的网站&#xff0c;可以使用最简单的html静态页面就实现了&#xff0c;配合一些图片达到美化效果&#xff0c;所有的页面均存放在一个目录下&#xff0c;这样的网站对系统架构、性能的要求都很简单。随着互联网业…

Docker -- 2 -- 利用docker部署网站和数据库

在Docker – 系统整洁之道 – 1中已经对Docker的一些命令和Docker镜像的使用及操作做了记录。 这次就利用docker进行一次真正的实例使用&#xff0c;使用docker搭建一个简单的答题系统&#xff0c;这个系统是当时做来给网络安全周做手机答题的系统&#xff0c;很简单&#xff…

《淘宝店铺 大数据营销+SEO+爆款打造 一册通》一一2.1 生意参谋平台概述

本节书摘来自异步社区出版社《淘宝店铺 大数据营销SEO爆款打造 一册通》一书中的第2章&#xff0c;第2.1节&#xff0c;作者&#xff1a;葛存山 , 耿寿礼&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 第2章 生意参谋——大数据分析利器 淘宝店铺 大数据…

[资源推荐] 必须收藏的两个查找论文和代码实现的网站!

参考自&#xff1a;https://juejin.im/post/5c57f86c51882562002aec03 无论是研究方向是 AI 方面的学生&#xff0c;或者是做机器学习方面的算法工程师&#xff0c;在掌握基础的机器学习相关知识后&#xff0c;都必须掌握搜索论文的技能&#xff0c;特别是研究或者工作领域方向…

再陷风波 Equifax又一门户网站被曝安全漏洞

近日&#xff0c;美信用机构Equifax被证实公司在今年5月到7月期间&#xff0c;遭到黑客攻击&#xff0c;导致约有1.43亿用户数据遭到泄露。现在&#xff0c;又一个Equifax门户网站被指出存在安全协议问题。 据最先发现问题的Hold Security LLC指出&#xff0c;一个来自阿根廷名…

ASP.NET Core 一步步搭建个人网站(4)_主页和登录验证

上章节我们已经定制好动态配置的菜单&#xff0c;用户登录网站的第一步就是进入首页内容&#xff0c;那我们先搭建一下我们的首页内容。想着自己的网站内容主要是个人博客类型&#xff0c;所以&#xff0c;首页就展示博主本人的一些基本信息吧&#xff0c;哈哈。当然&#xff0…

Java裸写爬虫技术,运用多线程技术,高效爬取某个医疗机构网站数据

最近喜欢上了数据的庞大的感觉&#xff0c;就爬取了一下某个医疗机构网站医疗数据&#xff0c;由于数据量庞大&#xff0c;只爬取了江西省的各个市的各个医院的各个科室的各个科室。中各种信息。其中用的持久层技术是hibernate框架&#xff0c;和用到一些ioc技术。话不多说&…

解决登录同一个网站,连接失败

2019独角兽企业重金招聘Python工程师标准>>> 程序报错 MaxRetryError: HTTPConnectionPool(host127.0.0.1, port53742): Max retries exceeded with url: /session/7e0b607f-022e-4464-9eb3-461844f59b84/window/maximize (Caused by NewConnectionError(<urllib…

Awesome 书籍源码论文软件下载网站整理

software.informerAAAI会议论文下载Packt出版商的书籍开源代码&#xff0c;目前已经超过6600个仓库