广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java实现微信扫码登录
  • 290
分享到

Java实现微信扫码登录

微信java 2023-09-01 09:09:36 290人浏览 安东尼
摘要

微信扫码登录 1. 授权流程说明第一步:请求 code第二步:通过 code 获取 access_token第三步:通过 access_token 调用接口 2. 授权流程代码3

微信扫码登录

1. 授权流程说明

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

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

微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

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

第一步:请求 code

第三方使用网站应用授权登录前,需要注意已获取相应网页授权作用域(scope = snsapi_login),则可以通过在 PC端打开以下链接:记得替换成自己的参数
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE

返回说明

用户允许授权后,将会重定向到 redirect_uri 的网址上,并带上 code 和 state 参数

redirect_uri?code=CODE&state=STATE

若用户禁止授权,则重定向后不会带上 code 参数,仅会带上 state 参数

redirect_uri?state=STATE

例如:
登录一号店网站应用:https://passport.yhd.com/wechat/login.do
打开后,一号店会生成 state 参数,跳转到 :
https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect
微信用户使用微信扫描二维码并且确认登录后,PC端会跳转到:https://passport.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a4035d839573b04816624a415e

第二步:通过 code 获取 access_token

通过 code 获取 access_token

官方文档:Https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

返回说明

正确的返回:

{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN","openid":"OPENID", "scope":"SCOPE","uNIOnid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}

错误的返回样例:

{"errcode":40029,"errmsg":"invalid code"}
  • AppSecret 是应用接口使用密钥,泄露后将可能导致应用数据泄露、应用的用户数据泄露等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取 AppSecret );
  • access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取 access_token 后导致的用户数据泄露、用户微信相关接口功能被恶意发起等行为;
  • refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新 access_token,但泄露后相当于 access_token 泄露,风险同上。

建议将 Secret、用户数据(如 access_token)放在App云端服务器,由云端中转接口调用请求。

第三步:通过 access_token 调用接口

获取access_token 后,进行接口调用,有以下前提:

access_token 有效且未超时;
2.微信用户已授权给第三方应用账号相应接口作用域(scope)

对于接口作用域(scope),能调用的接口有以下:
在这里插入图片描述

2. 授权流程代码

因为微信开放平台和微信公众平台的 AppID、AppSecret 都是不同的,因此需要配置以下:

# 开放平台wechat.open-app-id = wx6ad144e54af67d87wechat.open-app-secret = 91a2ff6d38a2bbccfb7e9f9079108e2e
@Data@Component@ConfigurationProperties(prefix = "wechat")public class WechatAccountConfig {    //公众号appid    private String mpAppId;    //公众号appSecret    private String mpAppSecret;    //商户号    private String mchId;    //商户秘钥    private String mchKey;        //商户证书路径    private String keyPath;    //微信支付异步通知    private String notifyUrl;    //开放平台id    private String openAppId;    //开放平台秘钥    private String openAppSecret;}
@Configurationpublic class WechatOpenConfig {    @Autowired    private WechatAccountConfig accountConfig;    @Bean    public WxMpService wxOpenService() {        WxMpService wxOpenService = new WxMpServiceImpl();        wxOpenService.setWxMpConfigStorage(wxOpenConfigStorage());        return wxOpenService;    }    @Bean    public WxMpConfigStorage wxOpenConfigStorage() {        WxMpInMemoryConfigStorage wxMpInMemoryConfigStorage = new WxMpInMemoryConfigStorage();        wxMpInMemoryConfigStorage.setAppId(accountConfig.getOpenAppId());        wxMpInMemoryConfigStorage.setSecret(accountConfig.getOpenAppSecret());        return wxMpInMemoryConfigStorage;    }}
@Controller@RequestMapping("/wechat")@Slf4jpublic class WeChatController {    @Autowired    private WxMpService wxMpService;    @Autowired    private WxMpService wxOpenService;    @GetMapping("/qrAuthorize")    public String qrAuthorize() {        //returnUrl就是用户授权同意后回调的地址        String returnUrl = "http://heng.nat300.top/sell/wechat/qrUserInfo";        //引导用户访问这个链接,进行授权        String url = wxOpenService.buildQrConnectUrl(returnUrl, WxConsts.QRCONNECT_SCOPE_SNSAPI_LOGIN, URLEncoder.encode(returnUrl));        return "redirect:" + url;    }    //用户授权同意后回调的地址,从请求参数中获取code    @GetMapping("/qrUserInfo")    public String qrUserInfo(@RequestParam("code") String code) {        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();        try {            //通过code获取access_token            wxMpOAuth2AccessToken = wxOpenService.oauth2getAccessToken(code);        } catch (WxErrorException e) {            log.error("【微信网页授权】{}", e);            throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(), e.getError().getErrorMsg());        }        //从token中获取openid        String openId = wxMpOAuth2AccessToken.getOpenId();        //这个地址可有可无,反正只是为了拿到openid,但是如果没有会报404错误,为了好看随便返回一个百度的地址        String  returnUrl = "http://www.baidu.com";        log.info("openid={}", openId);        return "redirect:" + returnUrl + "?openid="+openId;    }}

请求路径:在浏览器打开
https://open.weixin.qq.com/connect/qrconnect?appid=wx6ad144e54af67d87&redirect_uri=http%3A%2F%2Fsell.springboot.cn%2Fsell%2Fqr%2FoTgZpwenC6lwO2eTDDf_-UYyFtqI&response_type=code&scope=snsapi_login&state=http%3a%2f%2fheng.nat300.top%2fsell%2fwechat%2fqrUserInfo

获取了openid:openid = o9AREv7Xr22ZUk6BtVqw82bb6AFk
在这里插入图片描述

3. 用户登录和登出

@Controller@RequestMapping("/seller")public class SellerUserController {    @Autowired    private SellerService sellerService;    @Autowired    private StringRedisTemplate redisTemplate;    @Autowired    private ProjectUrlConfig projectUrlConfig;    @GetMapping("/login")    public ModelAndView login(@RequestParam("openid") String openid,   HttpServletResponse response,   Map<String, Object> map) {        //1. openid去和数据库里的数据匹配        SellerInfo sellerInfo = sellerService.findSellerInfoByOpenid(openid);        if (sellerInfo == null) {            map.put("msg", ResultEnum.LOGIN_FAIL.getMessage());            map.put("url", "/sell/seller/order/list");            return new ModelAndView("common/error");        }        //2. 设置token至redis        String token = UUID.randomUUID().toString();        //设置token的过期时间        Integer expire = RedisConstant.EXPIRE;        redisTemplate.opsForValue().set(String.format(RedisConstant.TOKEN_PREFIX, token), openid, expire, TimeUnit.SECONDS);        //3. 设置token至cookie        CookieUtil.set(response, CookieConstant.TOKEN, token, expire);        return new ModelAndView("redirect:" + "http://heng.nat300.top/sell/seller/order/list");    }    @GetMapping("/loGout")    public ModelAndView logout(HttpServletRequest request,                        HttpServletResponse response,                        Map<String, Object> map) {        //1. 从cookie里查询        Cookie cookie = CookieUtil.get(request, CookieConstant.TOKEN);        if (cookie != null) {            //2. 清除redis            redisTemplate.opsForValue().getOperations().delete(String.format(RedisConstant.TOKEN_PREFIX, cookie.getValue()));            //3. 清除cookie            CookieUtil.set(response, CookieConstant.TOKEN, null, 0);        }        map.put("msg", ResultEnum.LOGOUT_SUCCESS.getMessage());        map.put("url", "/sell/seller/order/list");        return new ModelAndView("common/success", map);    }}
  • 将上面获取到的 openID 存入数据库
    在这里插入图片描述
  • 将授权后跳转的地址改为登录地址:
//用户授权同意后回调的地址,从请求参数中获取code    @GetMapping("/qrUserInfo")    public String qrUserInfo(@RequestParam("code") String code) {        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();        try {            //通过code获取access_token            wxMpOAuth2AccessToken = wxOpenService.oauth2getAccessToken(code);        } catch (WxErrorException e) {            log.error("【微信网页授权】{}", e);            throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(), e.getError().getErrorMsg());        }        //从token中获取openid        String openId = wxMpOAuth2AccessToken.getOpenId();        //授权成功后跳转到卖家系统的登录地址        String  returnUrl = "http://heng.nat300.top/sell/seller/login";        log.info("openid={}", openId);        return "redirect:" + returnUrl + "?openid="+openId;    }
  • 在浏览器请求这个链接:
    https://open.weixin.qq.com/connect/qrconnect?appid=wx6ad144e54af67d87&redirect_uri=http%3A%2F%2Fsell.SpringBoot.cn%2Fsell%2Fqr%2FoTgZpwenC6lwO2eTDDf_-UYyFtqI&response_type=code&scope=snsapi_login&state=http%3a%2f%2fheng.nat300.top%2fsell%2fwechat%2fqrUserInfo
    第三方应用请求使用微信扫码登录,而不是使用本网站的密码:
    在这里插入图片描述
    用户同意授权后登入第三方应用的后台管理系统中:
    在这里插入图片描述
    在这里插入图片描述

4. spring aop 校验用户有没有登录

@Aspect@Component@Slf4jpublic class SellerAuthorizeAspect {    @Autowired    private StringRedisTemplate redisTemplate;    @Pointcut("execution(public * com.hh.controller.Seller*.*(..))" +    "&& !execution(public * com.hh.controller.SellerUserController.*(..))")    public void verify() {}    @Before("verify()")    public void doVerify() {                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();        HttpServletRequest request = attributes.getRequest();        //查询cookie        Cookie cookie = CookieUtil.get(request, CookieConstant.TOKEN);        //如果cookie中没有token说明已经登出或者根本没有登录        if (cookie == null) {            log.warn("【登录校验】Cookie中查不到token");            //校验不通过,抛出异常            throw new SellerAuthorizeException();        }        //去redis里查询        String tokenValue = redisTemplate.opsForValue().get(String.format(RedisConstant.TOKEN_PREFIX, cookie.getValue()));        //如果redis中没有对应的openid,同样表示登出或者根本没有登录        if (StringUtils.isEmpty(tokenValue)) {            log.warn("【登录校验】Redis中查不到token");            throw new SellerAuthorizeException();        }    }}

5. 拦截登录校验不通过抛出的异常

拦截及登录校验不通过的异常,让其跳转的登录页面,扫码登录

@ControllerAdvicepublic class SellExceptionHandler {    //拦截登录异常    @ExceptionHandler(value = SellerAuthorizeException.class)         public ModelAndView handlerAuthorizeException() {        //拦截异常后,跳转到登录界面        return new ModelAndView("redirect:".concat("https://open.weixin.qq.com/connect/qrconnect?" +                "appid=wx6ad144e54af67d87" +                "&redirect_uri=http%3A%2F%2Fsell.springboot.cn%2Fsell%2Fqr%2F" +                "oTgZpwenC6lwO2eTDDf_-UYyFtqI" +                "&response_type=code&scope=snsapi_login" +                "&state=http%3a%2f%2fheng.nat300.top%2fsell%2fwechat%2fqrUserInfo"));    }        @ExceptionHandler(value = SellException.class)         @ResponseBody         public ResultVO handlerSellerException(SellException e) {        return ResultVOUtil.error(e.getCode(), e.getMessage());    }        @ExceptionHandler(value = ResponseBankException.class)         @ResponseStatus(HttpStatus.FORBIDDEN)         public void handleResponseBankException() {}}

好事定律:每件事最后都会是好事,如果不是好事,说明还没到最后。

来源地址:https://blog.csdn.net/Cike___/article/details/128901949

--结束END--

本文标题: Java实现微信扫码登录

本文链接: https://www.lsjlt.com/news/388060.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现微信扫码登录
    微信扫码登录 1. 授权流程说明第一步:请求 code第二步:通过 code 获取 access_token第三步:通过 access_token 调用接口 2. 授权流程代码3...
    99+
    2023-09-01
    微信 java
  • php怎么实现微信扫码登录
    本文操作环境:windows10系统、php 7、thinkpad t480电脑。微信已经成为我们日常生活中必不可少的一部分,为了让更多的用户更加方便地使用微信及相关产品,微信扫一扫功能越来越普遍。那么如果我们要自己实现这个功能该如何做呢?...
    99+
    2018-06-26
    php 微信
  • Spring Boot怎么实现微信扫码登录功能
    本文小编为大家详细介绍“Spring Boot怎么实现微信扫码登录功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot怎么实现微信扫码登录功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-30
  • 企业微信扫码登录网页功能实现代码
    企业微信扫码登录网页功能,代码如下所示: //jq写法完善版 <!DOCTYPE html> <html lang="en"> <head> ...
    99+
    2022-11-13
  • 如何使用PHP实现微信扫码登录功能
    随着移动互联网的快速发展,微信作为一种重要的社交工具,已经逐渐成为人们日常生活中必不可少的一个部分。在许多网站和应用程序中,微信登录功能已经成为了一种趋势,因为它可以让用户直接使用已有的微信账号来登录,不需要再创建新的账户,同时也能提供更便...
    99+
    2023-05-14
    微信扫码登录 php
  • 怎么使用PHP实现微信扫码登录功能
    这篇文章主要讲解了“怎么使用PHP实现微信扫码登录功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用PHP实现微信扫码登录功能”吧!一、准备工作在开始实现微信扫码登录功能之前,我们需...
    99+
    2023-07-05
  • 不扫码怎么登录电脑微信
    这篇文章主要讲解了“不扫码怎么登录电脑微信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“不扫码怎么登录电脑微信”吧!不扫码登录电脑微信的方法:如果要登录电脑版微信,一定是要扫码的。 不过手机...
    99+
    2023-07-02
  • Spring Boot实现微信扫码登录功能流程分析
    目录1. 授权流程说明第一步:请求CODE第二步:通过code获取access_token第三步:通过access_token调用接口2. 授权流程代码3. 用户登录和登出4. Sp...
    99+
    2022-11-13
  • PHP实现微信关注公众号扫码登录功能
    PHP微信扫码登录看起来简单,但做起来有点复杂,微信接口的坑有点多,稍不注意,就费很多时间。PHP判断是否首次关注公众号,扫码关注公众号获取微信用户头像、openid和省市等信息源码。        ...
    99+
    2023-06-05
  • vue3如何实现微信扫码登录及获取个人信息
    这篇文章主要讲解了“vue3如何实现微信扫码登录及获取个人信息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3如何实现微信扫码登录及获取个人信息”吧!一、流程:微信提供的扫码方式有两种...
    99+
    2023-07-06
  • vue3怎么实现微信扫码登录及获取个人信息
    本篇内容介绍了“vue3怎么实现微信扫码登录及获取个人信息”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、流程:微信提供的扫码方式有两种,...
    99+
    2023-07-05
  • php对接微信公众号扫码登录开发实录(H5微信扫描登录、服务出现故障调试、模版消息设置、扫码轮询交互)
    微信公众号扫码登录开发实录 前言一、服务器配置1.微信公众号配置2.本地服务器验证程序 二、生成登录二维码1.生成微信登录二维码2.封装成便于刷新的函数 三、扫码验证和交互四、模版消息...
    99+
    2023-10-06
    微信 php 开发语言
  • 微信扫码登录原理的示例分析
    小编给大家分享一下微信扫码登录原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!微信扫码登录原理解析扫码登录是现在流行...
    99+
    2022-10-19
  • 网站使用微信小程序扫码登录的实现方法
    前言 传统网站一般都会使用账号密码登录,但这种方式总有用户会忘记密码,找回密码需要一系列验证,也挺麻烦的,于是学习了一下扫码登录,这种方式不仅不会有忘记密码的烦恼,登录还十分快捷。用户体验较好. ...
    99+
    2023-09-20
    微信小程序 小程序 前端
  • PHP实现微信扫码登录功能的两种方式总结
    官方文档 微信扫码登录目前有两种方式: 1:在微信作用域执行 ,就是条一个新页面 前端点击一个按钮,请求后端接口条微信作用域 后端php代码如下: $redirect_ur...
    99+
    2022-11-13
  • 基于Java怎么实现扫码登录
    这篇文章主要介绍了基于Java怎么实现扫码登录的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Java怎么实现扫码登录文章都会有所收获,下面我们一起来看看吧。原理解析1. 身份认证机制在介绍扫码登录的原理之前...
    99+
    2023-06-30
  • java微信扫描公众号二维码实现登陆功能
    本文实例为大家分享了java微信扫描公众号二维码实现登陆的具体代码,供大家参考,具体内容如下前提条件: 微信公众平台为服务号, 2.服务号实现了账号绑定功能,即将open_id 与业务系统中的用户名有对应关系具体实现原理: 用户访问业务系统...
    99+
    2023-05-31
    java 二维码
  • vue3微信扫码登录及获取个人信息实现的三种方法
    目录一、流程:二、前置条件:三、具体登录实现实现方式一:方式二:方式三:结合后端获取到二维码四、登录微信后获取微信中用户头像和昵称一、流程: 微信提供的扫码方式有两种,分别是: 跳转...
    99+
    2023-03-02
    vue3 微信扫码登录 vue3 微信获取信息
  • 第三方网站微信登录java代码实现
    前两个星期在公司中的项目加上了微信登录、绑定的功能,在这里做个记录!一、开发前知识微信开放平台与微信公众平台的区别 1.1 微信公众平台:   ① 地址:https://mp.weixin.qq.com/cgi-bin/loginpage&...
    99+
    2023-05-31
    java 网站 微信登录
  • 基于Java实现扫码登录的示例代码
    目录基本介绍原理解析1. 身份认证机制2. 流程概述代码实现1. 环境准备2. 主要依赖3. 生成二维码4. 扫描二维码5. 确认登录6. PC 端轮询7. 拦截器配置效果演示1. ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作