整合第三方登录之微信扫码登录


🎓前言

前置条件:具备微信开发者资质。

通过微信开放平台注册、完善开发者资料、申请开发者资质认证(需要300大洋,大概7个工作日内审核)

申请完成之后,在微信开发平台配置扫码登录成功后的重定向url地址即可。


提示:以下是本篇文章正文内容,下面案例可供参考

🏷️引入相关依赖

<!--httpclient-->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>
<!--commons-io-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
</dependency>
<!--gson-->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>

加粗样式使用到的工具类:

1、HttpClientUtils.java
https://edu-qihang.oss-cn-shenzhen.aliyuncs.com/%E6%95%B4%E5%90%88%E7%AC%AC%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95%E4%B9%8B%E5%BE%AE%E4%BF%A1%E6%89%AB%E7%A0%81%E7%99%BB%E5%BD%95%E6%96%87%E7%AB%A0/HttpClientUtils.java

2、JwtUtils.java
https://edu-qihang.oss-cn-shenzhen.aliyuncs.com/%E6%95%B4%E5%90%88%E7%AC%AC%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95%E4%B9%8B%E5%BE%AE%E4%BF%A1%E6%89%AB%E7%A0%81%E7%99%BB%E5%BD%95%E6%96%87%E7%AB%A0/JwtUtils.java

🧱操作步骤

📔生成微信登录二维码

所需前置参数:app_id、app_secret、redirect_url(资质申请完成后,获取到相应参数信息)

代码如下(示例):

@ApiOperation("生成微信登录二维码")
@GetMapping("/login")
public String getWxCode() {
    // 生成微信二维码的固定写法
    String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
            "?appid=%s" +
            "&redirect_uri=%s" +
            "&response_type=code" +
            "&scope=snsapi_login" +
            "&state=zbinyds" +
            "#wechat_redirect";
    String redirectUrl = '您配置的扫码登录成功后的重定向url地址';
    try {
        // 对url进行编码
        redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        throw new QiHangException("20001", "url编码异常");
    }
    String url = String.format(baseUrl, '您的app_id', redirectUrl);
    return "redirect:" + url;
}

在这里插入图片描述

📔获取微信用户信息并实现微信注册登录

注意:这里接口的请求地址,必须要和您配置的重定向url一致,扫码成功之后就会调用这个接口。

代码如下(示例):

@ApiOperation("获取微信用户信息并实现微信注册登录")
@GetMapping("/callback")
public String getUserInfo(@ApiParam("临时票据") String code, @ApiParam("请求状态") String state) {
    // 获取扫描二维码的微信用户信息
    try {
        /**
         * 第一步:根据code响应码,请求官方提供的指定接口,得到access_token(接口调用凭证)。
         */
        // 拼接好指定接口的参数信息
        String AccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                "?appid=%s" +
                "&secret=%s" +
                "&code=%s" +
                "&grant_type=authorization_code";
        AccessTokenUrl = String.format(
                AccessTokenUrl,
                '您的app_id',
                '您的app_secret',
                code
        );
        // 发送请求,获取到accessTokenInfo,里面包含了我们需要的字段access_token和openid。
        String accessTokenInfo = HttpClientUtils.get(AccessTokenUrl); // 此时类型为String
        log.info("accessTokenInfo:" + accessTokenInfo);
        // 使用Gson进行类型转换,从String转换成Map类型。
        Gson gson = new Gson();
        HashMap accessTokenMap = gson.fromJson(accessTokenInfo, HashMap.class);
        String accessToken = (String) accessTokenMap.get("access_token");
        String openId = (String) accessTokenMap.get("openid"); // 微信用户唯一标识
 
        // 查询该用户是否已注册
        Member member = memberService.getOpenIdMember(openId);
        // 未注册进行注册
        if (Objects.isNull(member)) {
            /**
             * 第二步:根据access_token,请求官方提供的指定接口,得到微信登录用户的基本信息。
             */
            // 拼接获取用户基本信息的url
            String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
            String userInfo = HttpClientUtils.get(userInfoUrl);
            log.info("当前登录微信用户的基本信息(用户昵称、头像):" + userInfo);
            // 进行类型转换,从String转换成Map类型。
            HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);
 
            // 将微信登录用户进行注册
            String headImgUrl = (String) userInfoMap.get("headimgurl"); // 用户头像
            String nickName = (String) userInfoMap.get("nickname"); // 用户昵称
            member = new Member();
            member.setNickname(nickName);
            member.setAvatar(headImgUrl);
            member.setOpenid(openId);
            memberService.save(member);
        }
        // 根据member对象,生成token字符串。
        String token = JwtUtils.getJwtToken(member.getId(), member.getNickname());
 
        // 登录成功,携带token并跳转到首页面。
        return "redirect:http://localhost:3000?token=" + token;
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException("请求失败!");
    }
}

💗总结

到这里,就是项目整合微信登录的全过程啦~

官方文档参考

1.如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “👍点赞”✍️评论” “💙收藏” 一键三连哦!
2.💗【👇🏻👇🏻👇🏻关注我| 💬获取更多源码 | 优质文章】 带您学习各种前端插件、3D炫酷效果、图片展示、文字效果、以及整站模板 、大学生毕业HTML模板 、期末大作业模板 、等! 「在这里有好多
前端 开发者,一起探讨 前端 Node 知识,互相学习」!

posted @ 2022-12-20 12:03  克隆窝  阅读(247)  评论(0编辑  收藏  举报