网站实现微信扫码登录

article/2025/9/18 8:45:01

网站实现微信扫码登录

  • 1 准备工作
    • 1.1 申请网站应用
  • 2 快速开始
    • 2.1 微信扫码登录流程说明
    • 2.2 生成微信二维码的两种方式
      • 2.2.1 微信提供的二维码生成URL
      • 2.2.2 将微信登录二维码内嵌到自己页面
    • 2.3 系统微信扫码登录示例
      • 2.3.1 流程说明
      • 2.3.2 核心代码
        • 2.3.2.1 前端代码
        • 2.3.2.2 后端代码
  • 3 参考博客

1 准备工作

1.1 申请网站应用

在接入微信扫码登录之前,在微信开放平台注册开发者账号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。
在这里插入图片描述
在这里插入图片描述

找到回调授权域名这一项,修改成要回调的域名,例如:www.baidu.com 不要加http://或https://。
在这里插入图片描述

2 快速开始

2.1 微信扫码登录流程说明

在这里插入图片描述

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

简单来说,我们用手机微信扫描网站应用上的微信登录二维码,会弹出是否允许拒绝按钮,当我们点击允许按钮时,微信会重定向到授权回调域地址上。若用户禁止授权,则不会发生重定向。授权回调域映射的是我们网站应用后端接口,来处理相关登录逻辑。

2.2 生成微信二维码的两种方式

2.2.1 微信提供的二维码生成URL

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect

参数说明:

参数是否必须说明
appid应用唯一标识
redirect_uri请使用urlEncode对链接进行处理
response_type填code
scope应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login
state用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
lang界面语言,支持cn(中文简体)与en(英文),默认为cn

正确填写微信提供的二维码生成URL参数后,在浏览器上访问会生成二维码。例如:
在这里插入图片描述

2.2.2 将微信登录二维码内嵌到自己页面

步骤1:在页面中先引入如下JS文件(支持https)

http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js

步骤2:在需要使用微信登录的地方实例以下JS对象:

 var obj = new WxLogin({self_redirect:true,id:"login_container", appid: "", scope: "", redirect_uri: "",state: "",style: "",href: ""});

参数说明:

参数是否必须说明
self_redirecttrue:手机点击确认登录后可以在 iframe 内跳转到 redirect_uri,false:手机点击确认登录后可以在 top window 跳转到 redirect_uri。默认为 false
id第三方页面显示二维码的容器id
appid应用唯一标识,在微信开放平台提交应用审核通过后获得
scope应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
redirect_uri重定向地址,需要进行UrlEncode
state用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
style提供"black"、"white"可选,默认为黑色文字描述。
href自定义样式链接,第三方可根据实际需求覆盖默认样式。

2.3 系统微信扫码登录示例

2.3.1 流程说明

① 对于我们系统来说,微信扫码登录的本质就是将自己系统用户与微信用户进行绑定,我这里是通过微信openid进行绑定。
② 用户扫描微信二维码允许登录,微信会重定向到授权回调域,并且带上codestate参数,授权回调域与/user/callback接口进行映射。
/user/callback接口处理时,通过appIdappSecretcode参数去调用 https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code接口,调用接口的凭证,有了它可以获取里面的openid等信息。
④ 通过openid去自己系统数据库查询用户,如果查到用户,就允许微信登录成功,查不到用户,就微信登录失败。
⑤ 关于扫码登录成功跳转系统首页,可以在/user/callback接口中直接发起页面重定向。这种重定向适合简单业务的微信扫码登录,复杂的就不适用。

2.3.2 核心代码

2.3.2.1 前端代码

<div *ngIf="loginWayFlag" class="login-WX"><div id="login_container"></div>
</div>
initWxLogin () {new WxLogin({self_redirect: true,id: 'login_container',appid: 'xxx',scope: 'snsapi_login',redirect_uri: encodeURIComponent('https://xxx.com/'),state: '@platformId@:@' + this.user.platformId + '@,@systemId@:@' + this.user.systemId + '@,@scanType@:@login@,@wxRandomId@:@' + this.user.wxRandomId + '@',style: 'black',href: 'data:text/css;base64,IC5pbXBvd2VyQm94IC5xcmNvZGUge3dpZHRoOiAxNTBweDt9Ci5pbXBvd2VyQm94IC50aXRsZSB7ZGlzcGxheTogbm9uZTt9Ci5zdGF0dXNfaWNvbiB7ZGlzcGxheTogbm9uZX0KLmltcG93ZXJCb3ggLnN0YXR1cyB7dGV4dC1hbGlnbjogY2VudGVyO30KLmltcG93ZXJCb3ggLmljb24zOF9tc2cuc3VjY3t3aWR0aDogMzBweDtoZWlnaHQ6IDMwcHg7ZGlzcGxheTogYmxvY2s7bWFyZ2luLWxlZnQ6IDExMXB4O30KLmltcG93ZXJCb3ggLmljb24zOF9tc2cud2Fybnt3aWR0aDogMzBweDtoZWlnaHQ6IDMwcHg7ZGlzcGxheTogYmxvY2s7bWFyZ2luLWxlZnQ6IDExMXB4O30KaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcHtmb250LXNpemU6IDE0cHg7fQ==',});
}

2.3.2.2 后端代码

微信常量类

/*** 微信常量类*/
public class WxConstant {/*** APPID*/public static final String APP_ID = "xxx";/*** APP密钥*/public static final String APP_SECRET = "xxx";/*** 授权回调域*/public static final String CALLBACK_SERVER = "http://xxx.com";/*** 获取二维码接口URL*/public static final String QRCODE_URL = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";/*** 获取access_token和openid接口URL*/public static final String OPENID_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
}

微信工具类

/*** 微信工具类*/
@Log4j2
public class WxUtil {/*** 用于将扫描二维码后重定向的资源url进行编码*/public static String urlEncode(String source){String result = source;try {result = java.net.URLEncoder.encode(source,"utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}/*** 根据code、appid和secret获取access_token(也就是调用接口的凭证,有了它可以获取里面的openid等信息)*/public static WxTokenDTO getTokenWithOpenid(String appId, String appSecret, String code) throws Exception {String baseUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";String requestUrl = baseUrl.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code);// 发起GET请求获取凭证String result = GetUtil.doGet(requestUrl);JSONObject jsonObject = JSON.parseObject(result);WxTokenDTO token = new WxTokenDTO();;token.setOpenId(jsonObject.getString("openid"));token.setAccessToken(jsonObject.getString("access_token"));token.setExpiresIn(jsonObject.getIntValue("expires_in"));return token;}/*** 根据access_token和openid获取微信用户信息*/public static WxUserDTO getWeChatUserInfo(String access_token, String openid) throws Exception {String baseUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";String requestUrl = baseUrl.replace("ACCESS_TOKEN", access_token).replace("OPENID", openid);String result = GetUtil.doGet(requestUrl);JSONObject jsonObject = JSON.parseObject(result);WxUserDTO userDTO = new WxUserDTO();userDTO.setNickname(jsonObject.getString("nickname"));userDTO.setHeadImgUrl(jsonObject.getString("headimgurl"));userDTO.setUnionId(jsonObject.getString("unionid"));return userDTO;}
}

用户控制器类
授权回调域与/user/callback接口进行映射,code和state参数是微信传递过来的,state参数为自定义参数,我们可以通过它进行传递想要的参数。

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/callback")public RequestResult callback(String code, String state) throws Exception {return userService.callback(code, state);}
}

用户服务类

   @Overridepublic RequestResult callback(String code, String state) throws Exception {JSONObject jsonObject = new JSONObject();JSONObject params = JSON.parseObject(String.format("{%s}", state.replaceAll("@", "\"")));WxTokenDTO tokenDTO = WxUtil.getTokenWithOpenid(WxConstant.APP_ID, WxConstant.APP_SECRET, code);log.info("[获取微信openId信息]:" + tokenDTO);if ("login".equals(params.getString("scanType"))) {wxLogin(tokenDTO.getOpenId(), params.getString("wxRandomId"), params.getLong("systemId"), jsonObject);}if ("bindUserOpenId".equals(params.getString("scanType"))) {bindUserOpenId(params.getLong("userId"), tokenDTO.getOpenId(), params.getLong("systemId"), jsonObject);}return RequestResult.success(jsonObject);}/*** 微信扫码登录*/private void wxLogin(String openId, String wxRandomId, Long systemId, JSONObject resultObject) {UserDTO userDTO = baseMapper.getByOpenId(openId, systemId);if (ObjectUtil.isEmpty(userDTO)) {resultObject.put("loginResult", getLoginFailHtml());return;}int result = baseMapper.updateUserLoginWxRandomId(userDTO.getId(), wxRandomId);if (result > 0) {resultObject.put("loginResult", getLoginSuccessHtml());} else {resultObject.put("loginResult", getLoginFailHtml());}}/*** 添加用户信息后,绑定微信openId*/private void bindUserOpenId(Long userId, String openId, Long systemId, JSONObject jsonObject) {UserDTO findUserDTO = baseMapper.getByOpenId(openId, systemId);if (ObjectUtil.isNotEmpty(findUserDTO)) {jsonObject.put("bindUserOpenIdResult", getAlreadyBindOpenIdHtml());return;}User user = new User();user.setId(userId);user.setOpenId(openId);if (baseMapper.updateById(user) > 0) {jsonObject.put("bindUserOpenIdResult", getBindOpenIdSuccessHtml());} else {jsonObject.put("bindUserOpenIdResult", getBindOpenIdFailHtml());}}

3 参考博客

1.微信官方文档
2.微信扫码登录第三方网站 - 爱码网
3.微信第三方扫码登录(亲测可用)


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

相关文章

【一】微信公众号之扫码登录

微信公众号之扫码登录 ​ 原来公司的官网就支持账号密码、手机验证码、QQ扫码授权、微信扫码授权等多种登录方式。今天要分享的就是关于微信扫码授权登录的原理。 一、准备工作 使用的是微信登录功能实现的&#xff0c;需要先在微信开放平台注册开发者帐号&#xff0c;并拥有一…

公众号扫码登录

1.流程概述 1.1 申请公众号 1.2 创建带参数的公众号二维码&#xff0c;参数值为scen_id的值 1.3 微信基础配置接口编写&#xff0c;get方式的接口为微信测试接口&#xff0c;必须能正常访问&#xff0c;post方式的接口为扫码回调接口&#xff0c;从请求中获取微信返回的xml包…

二维码扫描登录,你必须知道的 3 件事!

作者 | 互联网平头哥 本文经授权转载自互联网平头哥&#xff08;ID&#xff1a;it_pingtouge&#xff09; 扫二维码登录现在比较常见&#xff0c;比如微信、支付宝等 PC 端登录&#xff0c;并且好像每款 APP 都支持扫码登录&#xff0c;不搞个扫码登录都不好意思。作为技术人员…

微信扫码登录实现

需求 使用微信扫码登录的授权方式登录系统 实现 此扫码登陆过程中使用了&#xff0c;微信开放平台&#xff08;需支付300开通开发者认证&#xff09;的网站应用实现的。 官方文档&#xff1a;https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wec…

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…