微信扫描登录

19 篇文章 0 订阅

1、微信扫描登录流程时序图

在这里插入图片描述

2、注册微信开发者并且拿到appId、appSecret、redirectUrl

3、导入maven依赖

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

4、在application.properties中添加wx相关的配置参数

# 微信开放平台配置参数
wx.open.appId=wxed9954c01bb89b47
wx.open.appSecret=a7482517235173ddb4083788de60b90e
wx.open.redirectUrl=http://localhost:8160/api/ucenter/wx/callback

5、创建常量类

package com.tuzhi.ucenter_service.constants;

import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
public class WxOpenConstants implements InitializingBean {

    /**
     * 微信开放平台appId
     */
    @Value("${wx.open.appId}")
    private String appId;

    /**
     * 微信开放平台appSecret
     */
    @Value("${wx.open.appSecret}")
    private String appSecret;

    /**
     * 微信开放平台 重定向url
     */
    @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;
    }
}

6、使用

package com.tuzhi.ucenter_service.controller;

import com.google.gson.Gson;
import com.tuzhi.base_service.exceptionhandler.GuiException;
import com.tuzhi.ucenter_service.constants.WxOpenConstants;
import com.tuzhi.ucenter_service.pojo.UcenterMember;
import com.tuzhi.ucenter_service.service.UcenterMemberService;
import com.tuzhi.ucenter_service.util.HttpClientUtils;
import com.tuzhi.utilcommon.JwtUtils;
import com.tuzhi.utilcommon.result.ResultCode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Objects;


@Api(tags = "微信扫描接口")
@CrossOrigin
@Controller
@RequestMapping("/api/ucenter/wx")
public class WxApiController {

    @Autowired
    UcenterMemberService ucenterMemberService;

    /**
     * 1.生成微信扫描二维码
     */

    @ApiOperation("生成二维码")
    @GetMapping("/login")
    public String getWxCode(){
        //固定地址,后面拼接参数
//        String url = "https://open.weixin.qq.com/" +
//                "connect/qrconnect?appid="+ ConstantWxUtils.WX_OPEN_APP_ID+"&response_type=code";

        // 微信开放平台授权baseUrl  %s相当于?代表占位符
        String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s" +
                "&redirect_uri=%s" +
                "&response_type=code" +
                "&scope=snsapi_login" +
                "&state=%s" +
                "#wechat_redirect";

        //对redirect_url进行URLEncoder编码
        String redirectUrl = WxOpenConstants.WX_OPEN_REDIRECT_URL;
        try {
            redirectUrl = URLEncoder.encode(redirectUrl, "utf-8");
        }catch(Exception e) {
        }

        //设置%s里面值
        String url = String.format(
                baseUrl,
                WxOpenConstants.WX_OPEN_APP_ID,
                redirectUrl,
                "tuzhi"
        );

        //重定向到请求微信地址里面
        return "redirect:"+url;
    }

    /**
     * 2.获取扫描人信息、添加信息
     */

    @GetMapping("/callback")
    public String callBack(String code,String state){


        try {
            //1.获取code值,临时票据,类似于验证码
            //2.拿着code请求,微信固定的地址,得到两个值 access_token 和openId

            String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                    "?appid=%s" +
                    "&secret=%s" +
                    "&code=%s" +
                    "&grant_type=authorization_code";
            //拼接三个参数 :id  秘钥 和 code值
            String accessTokenUrl = String.format(
                    baseAccessTokenUrl,
                    WxOpenConstants.WX_OPEN_APP_ID,
                    WxOpenConstants.WX_OPEN_APP_SECRET,
                    code
            );

            //请求这个拼接好的地址,得到返回两个值 access_token 和 openId
            //使用httpclient发送请求,得到返回结果

            String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);
            //从accessTokenInfo 字符串出来两个值 accessToken 和 openId
            //把accessTokenInfo 字符串转换成map集合,根据map里面可以 获取对应的值

            //使用json转换工具
            Gson gson = new Gson();
            HashMap<String,String> accessTokenMap = gson.fromJson(accessTokenInfo, HashMap.class);

            String accessToken = accessTokenMap.get("access_token");

            String openid = accessTokenMap.get("openid");

            //把扫描人信息添加到数据库里面
            //判断数据库表里面是否存在相同微信信息,根据openid判断
            UcenterMember member = ucenterMemberService.getMemberByOpenid(openid);

            if(Objects.isNull(member)){
                //3.拿着得到access_token和openid ,再去请求微信提供的固定地址,获取到扫描人信息
                // 访问微信的资源服务器,获取到用户信息

                String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
                        "?access_token=%s" +
                        "&openid=%s";
                //拼接两个参数
                String userInfoUrl = String.format(
                        baseUserInfoUrl,
                        accessToken,
                        openid
                );

                //发送请求
                String userInfo = HttpClientUtils.get(userInfoUrl);
                HashMap<String, String> userInfoMap = gson.fromJson(userInfo, HashMap.class);

                //昵称
                String nickname = userInfoMap.get("nickname");
                //头像
                String headimgurl = userInfoMap.get("headimgurl");

                member = new UcenterMember();
                member.setOpenid(openid);
                member.setNickname(nickname);
                member.setAvatar(headimgurl);
                ucenterMemberService.save(member);
            }

            //使用jwt根据member对象生成token字符串
            String token = JwtUtils.getJwtToken(member.getId(), member.getNickname());

            //最后: 返回首页面,通过路径传递token字符串

            return "redirect:http://localhost:3000?token="+token;

        } catch (Exception e) {
            e.printStackTrace();

            throw GuiException.from(ResultCode.LOGIN_ERROR);
        }

    }

}
 返回首页面,通过路径传递token字符串

            return "redirect:http://localhost:3000?token="+token;

        } catch (Exception e) {
            e.printStackTrace();

            throw GuiException.from(ResultCode.LOGIN_ERROR);
        }

    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Spring Security结合微信扫描登录,可以按照以下步骤进行操作: 1. 首先,在Spring Security的配置文件中添加微信登录的相关配置。可以使用`WeChatAuthenticationFilter`来处理微信登录请求,并配置相应的`AuthenticationProvider`来验证微信登录的凭证。 2. 在微信登录的Controller中,实现生成微信授权链接的方法。可以使用类似于上面提供的代码片段中的`login`方法来生成微信授权链接,并将其返回给前端。 3. 前端页面中,可以使用生成的微信授权链接来生成二维码,并展示给用户进行扫描。 4. 当用户扫描二维码并授权登录后,微信会将授权码返回给后端。在后端的微信登录Controller中,可以通过回调接口获取到微信返回的授权码,并使用该授权码来获取用户的微信信息。 5. 根据用户的微信信息,可以进行用户的认证和授权操作。可以使用Spring Security提供的相关功能来实现用户的认证和授权。 综上所述,通过配置Spring Security的微信登录相关的组件和Controller,结合微信的授权登录流程,就可以实现Spring Security结合微信扫描登录的功能。 #### 引用[.reference_title] - *1* [SpringBoot实现微信授权登录、二维码登录](https://blog.csdn.net/qq_42552574/article/details/107208558)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [基于 Java Spring Security 的关注微信公众号即登录的设计与实现 ya](https://blog.csdn.net/m0_67698950/article/details/124027245)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值