记录:Java实现微信扫码登录

准备工作

微信开放平台进行开发者资质认证(只有企业才能认证),然后得到 appidapp_secret,然后配置’redirect_url’也就是扫码成功后跳转的地址

开始

根据上面的appid等信息跳转扫码页面,返回一个 code类似于验证码,根据 code 访问另一个固定地址获取openidaccsess_token,然后再根据 openid和access_token 访问另一个固定地址获取用户信息

1. 将上面的信息配置到 application.yml

wx:
  open:
    appid: 你的appid # 微信开放平台 appid
    appsecret: 你的appsecret # 微信开放平台 appsecret
    redirecturl: 重定向url # 微信开放平台 重定向url(需要在微信开放平台配置)

2. 为了方便管理,创建一个常量类

@Component
public class ConstantProperties implements InitializingBean {
    @Value("${wx.open.appid}")
    private String appId;

    @Value("${wx.open.appsecret}")
    private String appSecret;

    @Value("${wx.open.redirecturl}")
    private String redirectUrl;

    public static String WX_OPEN_APP_ID;
    public static String WX_OPEN_APP_SECRET;
    public static String WX_OPEN_REDIRECT_URL;
    @Override
    public void afterPropertiesSet() throws Exception {
        WX_OPEN_APP_ID = appId;
        WX_OPEN_APP_SECRET = appSecret;
        WX_OPEN_REDIRECT_URL = redirectUrl;
    }
}

3. 编写接口

因为要跳转到微信扫码的界面,所以必须标记 @Controller 而不是 @RestController

3.1 二维码页面

@GetMapping("login")
    public String genQrConnect() {
        // 微信开放平台授权baseUrl,固定的地址
        String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
        "?appid=%s" +
        "&redirect_uri=%s" +
        "&response_type=code" +
        "&scope=snsapi_login" +
        "&state=%s" +
        "#wechat_redirect";
        // 回调地址
        String redirectUrl = ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL; //获取业务服务器重定向地址
        try {
            redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8"); //url编码
        } catch (UnsupportedEncodingException e) {
            throw new GolbalException( e.getMessage());
        }
        // 防止csrf攻击(跨站请求伪造攻击)
        String state = UUID.randomUUID().toString().replaceAll("-", "");//一般情况下会使用一个随机数
        //生成qrcodeUrl
        String qrcodeUrl = String.format(
                baseUrl,
                ConstantPropertiesUtil.WX_OPEN_APP_ID,
                redirectUrl,
                state);
        return "redirect:" + qrcodeUrl;
    }

3.2 扫码成功后的 callback接口(登录逻辑在这里实现)

    @GetMapping("/callback")
    public String callback(String code,String state){
        // 获取code值,拿着 code 请求微信固定地址,得到 accsess_token 和 openId
        String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
        "?appid=%s" +
        "&secret=%s" +
        "&code=%s" +
        "&grant_type=authorization_code";
        String accessTokenUrl = String.format(baseAccessTokenUrl,
                ConstantPropertiesUtil.WX_OPEN_APP_ID,
                ConstantPropertiesUtil.WX_OPEN_APP_SECRET,
                code);
        String result = restTemplate.getForObject(accessTokenUrl,String.class);
        HashMap<String,String> hashMap = JSON.parseObject(result, HashMap.class);
        String accessToken =  hashMap.get("access_token");
        String openid =  hashMap.get("openid");
        log.info("token:{},openid:{}",accessToken,openid);

        // 查询数据库当前用用户是否曾经使用过微信登录
        User user = userService.getByOpenId(openid);
        if (user == null){
            log.info("新用户注册");
            //访问微信的资源服务器,获取用户信息
            String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
            "?access_token=%s" +
            "&openid=%s";
            String userInfoUrl = String.format(baseUserInfoUrl, accessToken, openid);
            String resultUserInfo = null;
            resultUserInfo = restTemplate.getForObject(userInfoUrl,String.class);
            log.info("用户信息:{}",resultUserInfo);
            //解析json
            HashMap<String,Object> mapUserInfo = JSON.parseObject(resultUserInfo, HashMap.class);
            // 获取微信名
            String nickname = (String)mapUserInfo.get("nickname");
            // 获取头像
            String headimgurl = (String)mapUserInfo.get("headimgurl");
            //向数据库中插入一条记录
            user = new User();
            user.setNickname(nickname);
            user.setOpenid(openid);
            user.setAvatar(headimgurl);
            userService.save(member);
        }
        // @TODO 登录逻辑,生成token等
        return "redirect:http://localhost:3000";
    }
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java实现微信扫码登录,您可以按照以下步骤进行操作。 首先,您需要在微信公众平台上创建一个开发者账号,并获取到您的AppID和AppSecret。这些信息将用于后续的认证和授权操作。 然后,您可以使用微信提供的SDK或API来实现扫码登录功能。根据您提供的引用内容,您可以参考微信官方文档中的扫码登录部分来了解具体的实现流程。 在Java中,您可以通过后台的Controller来处理微信的认证和授权逻辑。您可以根据微信返回的参数(如code和state)来调用相应的方法进行验证和授权操作。 在前端页面中,您可以使用微信提供的JS SDK来生成扫码登录的二维码并显示在页面上。同时,您需要在前端页面中添加相应的点击事件,以触发微信登录功能。 在后台的Controller中,您可以通过调用微信的API来获取扫码登录所需的参数,如AppID和redirect_uri。然后将这些参数传递给前端页面,以便生成正确的扫码登录二维码。 总结起来,您需要进行以下步骤来实现Java中的微信扫码登录: 1. 在微信公众平台上创建开发者账号,并获取AppID和AppSecret。 2. 在后台的Controller中处理微信的认证和授权逻辑。 3. 在前端页面中使用微信的JS SDK生成扫码登录二维码,并添加相应的点击事件。 4. 调用微信的API来获取扫码登录所需的参数,并将这些参数传递给前端页面。 希望以上信息能帮助到您实现Java中的微信扫码登录功能。如有更多问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [java集成微信扫码登录](https://blog.csdn.net/weixin_48214611/article/details/120134304)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [java实现微信二维码登录功能](https://blog.csdn.net/weixin_42132143/article/details/89206215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值