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

文章目录

前言

一、引入相关依赖

二、操作步骤

1.生成微信登录二维码

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

总结


前言

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

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

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


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

一、引入相关依赖 


    org.apache.httpcomponents
    httpclient



    commons-io
    commons-io



    com.google.code.gson
    gson

使用到的工具类:

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.javaicon-default.png?t=M85Bhttps://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.java2、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.javaicon-default.png?t=M85Bhttps://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


二、操作步骤

1.生成微信登录二维码

所需前置参数: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;
}
此时,就可以根据接口,查看到到微信二维码了 。

整合第三方登录之微信扫码登录_第1张图片

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

注意:这里接口的请求地址,必须要和您配置的重定向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("请求失败!");
    }
}

总结

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

官方文档参考:微信开放平台https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

你可能感兴趣的:(java)