微信扫码登录实现

article/2025/9/18 8:50:18

需求

使用微信扫码登录的授权方式登录系统

实现

此扫码登陆过程中使用了,微信开放平台(需支付300开通开发者认证)的网站应用实现的。

官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

流程:

image-20220205204119502

大概就是:前端调接口获取后端生成的state(可以用验证登录授权的有效性)——>用户扫码后确认授权——>前端开始调用微信开放平台的接口之后回调服务端接口——>回调时传入了两个参数,code和state——>根据code,appid和appSecret调用接口获取access_token——根据access_token获取微信用户的个人信息

代码:

前端vue:

安装一个插件:
npm install vue-wxlogin --save-dev
引入组件:
<wxloginappid="xxxxxx":scope="'snsapi_login'"theme="black"redirect_uri="redirectUrl":state="xxxxxx":self_redirect="'true'"rel="external nofollow"/>

注:重定向地址需要使用urlEncode对链接进行处理

后端SpringBoot:

后端生成state接口
@ApiOperation(value = "企业端:获取扫码登录的state", notes = " \n author:ZhuGuangLiang")
@AnonymousGetMapping("/wx/qrcode")
public Result<Object> getQrCode() throws IOException {//生成票据String state= IdUtil.simpleUUID();//可以将state参数作为存放在redis中的授权用户信息key键redisUtils.set(state, JSON.toJSON(new CompanyWxDTO()), 5 * 60);return Result.success(state);
}
回调接口,并携带state和code参数

注:回调接口,尽量不要抛出异常,异常可以在登录接口抛出

@ApiOperation(value = "企业端:微信用户授权后,回调地址", notes = " \n author:ZhuGuangLiang")
@AnonymousGetMapping("/wx/callback")
public void callback(String code, String state) {companyAuthService.callback(code, state);
}
//方法中所有第三方接口都可在官方文档中找到
@Override
public void callback(String code, String state) {//authurl获取access_token的接口,可以看官方文档中的第二步JSONObject resultAuthUrl = JSONObject.parseObject(HttpUtil.get(String.format(authUrl, appid, secret, code)));boolean isSuccess = true;if (resultAuthUrl.containsKey("errcode")) {log.error("授权失败");isSuccess = false;//			throw new BadRequestException(ResultEnum.USER_NO_AUTH);}String openid = resultAuthUrl.getString("openid");String accessToken = resultAuthUrl.getString("access_token");String refreshToken = resultAuthUrl.getString("refresh_token");//根据code获取access_tokeLambdaQueryWrapper<SpiritCompanyUser> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(SpiritCompanyUser::getOpenid, openid);CompanyWxDTO companyWxDTO = loginUtils.noExceptinCheckCompanyUser(queryWrapper);int type = companyWxDTO.getType();if (!isSuccess) {//登录失败,此时我使用type类型去记录每一种异常companyWxDTO.setType(7);}if (type == 1 && isSuccess) {//校验授权凭证JSONObject resultCheckToken = JSONObject.parseObject(HttpUtil.get(String.format(checkTokenUrl, accessToken, openid)));if (resultCheckToken.getInteger("errcode") == 40003) {//刷新token,防止出现token失效JSONObject resultRefreshToken = JSONObject.parseObject(HttpUtil.get(String.format(refreshTokenUrl, appid, refreshToken)));accessToken = resultRefreshToken.getString("access_token");}//获取用户信息JSONObject resultUserInfoUrl = JSONObject.parseObject(HttpUtil.get(String.format(userInfoUrl, accessToken, openid)));log.info("resultUserInfoUrl:" + resultUserInfoUrl.toString());if (resultUserInfoUrl.containsKey("errcode")) {log.error("获取用户信息失败");//同上companyWxDTO.setType(8);}companyWxDTO.setAvatarUrl(resultUserInfoUrl.getString("headimgurl"));companyWxDTO.setNickName(resultUserInfoUrl.getString("nickname"));companyWxDTO.setOpenid(openid);companyWxDTO.setUnionid(resultUserInfoUrl.getString("unionid"));log.info("微信用户授权成功");}companyWxDTO.setTicket(state);redisUtils.set(state, JSON.toJSON(companyWxDTO), 5 * 60);
}

http://chatgpt.dhexx.cn/article/cBw6TAeQ.shtml

相关文章

web扫码登录

文章目录 需求流程交互流程服务交互流程 关键思路代码生成二维码&#xff0c;返回给PC展示轮询查询二维码状态APP扫码请求登录 总结 需求 pc端实现app扫码登录 流程 交互流程 服务交互流程 关键思路 主要问题在于如何识别APP端用户&#xff0c;然后传递给PC端已经登录成功 …

开放平台–扫描微信二维码登录

准备 如不了解第三方登录流程&#xff0c;建议先大概了解一下&#xff0c;在来看看代码。 说明&#xff1a; 由于开放平台无测试号测试&#xff0c;所以只能上开放平台进行配置信息。公众平台的测试号并不能给开放平台使用。 微信开放平台地址&#xff1a;https://open.weixi…

二维码登陆

上一段时间研究微信公共账号,发现微信提供了一个扫码登陆验证的功能。近期头痛于经常忘记用户名密码,因此考虑是否可以结合这个功能,完成免密码登陆。百度后发现&#xff0c;有很多仁兄已经做过类似的功能了。 如这篇文章: 实现网站二维码扫描登录 仔细研究后&#xff0c;发现很…

二维码登录(三)扫码登录

承接上篇博客&#xff0c;在进行二维码生成之后&#xff0c;app进行扫码&#xff0c;扫码成功之后&#xff0c;手机点击登录&#xff0c;进行绑定登录关系&#xff0c;后台做自动关联与自动登录。 本文git地址&#xff1a;https://github.com/xvshu/qrlogin 1&#xff0c;扫码…

微信扫码登陆(1)---扫码登录流程讲解、获取授权登陆二维码

扫码登录流程讲解、获取授权登陆二维码 具体流程可以看微信官网的扫码登录文档 地址&#xff1a;准备工作 | 微信开放文档 其实官方文档已经讲的非常清楚而且讲的也很明白。 一、扫码登录流程讲解 1、首先准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAut…

二维码扫码登录

项目结构 模块介绍 流程1 pc端&#xff1a;1:打开二维码登录网页index.html2:index.html调用GetQrCodeServlet3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识&#xff0c;该标识贯穿整个流程 b:生成二维码图片&#xff0c;二维码信息&#xff1a;http://60.2…

扫码登录详解

目录 扫码流程分析 流程详解 步骤一&#xff1a;PC端准备二维码 步骤三&#xff1a;状态确认 token认证机制 扫码流程分析 1.扫码前&#xff0c;手机端已经是登陆状态&#xff0c;PC端显示一个二维码&#xff0c;等待扫描。 2.手机端打开应用&#xff0c;扫描PC端的二维码…

新增商品

1、在http代理设置&#xff0c;添加过滤参数&#xff1a; .*pusher\.*\/websocket.* .*/venilog/log/one .*\.(bmp|css|js|gif|ico|jpe?g|png|swf|woff) .*pusher\/info.* 2、启动http代理设置&#xff0c;录制脚本&#xff0c;将登陆和发布商品的脚本修改成’登陆‘&#x…

自定义商品分类,选择分类之后,添加商品附属性;仿淘宝后台添加商品附属性的价格和数量

效果图&#xff08;图片较大&#xff0c;加载较慢&#xff09; 页面部分&#xff1a; <div class"layui-form-item" id"add_attribute"><label class"layui-form-label">商品分类</label><div class"layui-input-i…

javaScript原生版购物车:全选、单选、全删、商品数量增减、计算总价、添加商品(代码)

题目&#xff1a; CSS代码如下&#xff1a; <style> *{ margin: 0px; padding: 0px; } .header,.content,.floot{ width: 800px; margin:0px auto; } .header ul li,.content ul li{ float: left; list-style: none; width: 100px; line-height: 100px; text-align: cen…

商品管理的新增

实现的功能如下&#xff1a; 点击新增弹出新增模态框通过下拉框绑定商品类别和商品单位保存新增 主要代码&#xff1a; 以上就是我的分享&#xff0c;如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔&#xff01;

案例:实现在购物车中添加商品和删除购物车中指定商品的功能

一、向购物车中添加商品 1.1.创建AddCartServlet public class AddCartServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}SuppressWarnings(&q…

14.商品添加功能

商品用例的bean层 添加商品的用例实现首先要有封装商品的bean&#xff0c;还要有封装商品种类的bean。 封装商品种类的bean package cn.bingou.domain;/*** 商品种类的bean* author 吹静静**/ public class ProdCategory {private int id;private String cname;public ProdCate…

二十三、商城 - 商品录入-新增商品(11)

目录 &#x1f33b;&#x1f33b; 一、商品录入【选择商品分类】1.1 需求分析1.2 准备工作1.3 代码实现1.3.1 一级分类下拉选择框1.3.2 二级分类下拉选择框1.3.3 三级分类下拉选择框1.3.4 读取模板ID 二、商品录入【品牌选择】2.1 需求分析2.2 代码实现 三、商品录入【扩展属性…

java添加功能_商品添加功能的实现

返回的结果&#xff1a; package com.taotao.common.utils; import java.util.List; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; /** * 淘淘商城自定义响应结构 */ public class TaotaoResult { // 定义jackson对象…

把商品添加到购物车的方法

因为抢华为荣耀的缘故&#xff0c;研究了下京东添加商品到购物车的方法&#xff0c;具体步骤如下 一&#xff1a;打开商品页面&#xff0c;找到商品的id 例如这个商品的id就是1056970 二&#xff1a;把链接里面的http://gate.jd.com/InitCart.aspx?pid###&pcount1&pt…

php 商品模块添加商品属性,添加新商品

进入添加商品页后&#xff0c;如图1&#xff0c;2 添加新商品 图1 图2 促销价格前台表现 图3 图4 图5 附加价格前台表现 图6 添加新商品 图7 配件和关联商品前台表现形式 图8 图9 通用信息商品分类&#xff1a;商品分类是必填项&#xff0c;用于帮助客户找到需要的商品。如果您…

添加商品

添加商品 步骤分析: 1.在index.jsp添加一个超链接 跳转到add.jsp 2.add.jsp放入一个表单 3.表单提交到 AddProductServlet 封装数据 调用service完成保存操作 跳转到FindAllServlet (请求转发和重定向) 有表单使用的时候若使用请求转发会出现重复提交 方案1:重定向 …

十七、商品添加

&#xff08;1&#xff09;通过编程式导航跳转到商品添加页面 1. 在List.vue页面。点击添加商品&#xff0c;实现页面跳转 2. 创建商品添加组件Add.vue 3. 为Add组件添加路由 &#xff08;2&#xff09; 渲染添加页面的基本UI结构 使用到Alter警告和Steps 步骤条组件 1. 引入…

(三十)商品管理-添加商品(上传图片)

&#xff08;三十&#xff09;商品管理-添加商品(上传图片) 添加商品(上传图片)1.修改页面上添加连接/store/adminProduct?methodaddUI2.在addUI请求转发到 添加页面3.在表单页面上修改action : /store/addProductServlet提交方式: method"post"添加enctype属性: e…