SpringBoot 实现微信扫码登录的示例代码

 更新时间:2025年10月22日 16:17:18   作者:一个不懂管理的项目经理  
本文主要介绍使用SpringBoot框架和微信开放平台实现微信扫码登录的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

以下是支持 微信扫码登录 的服务端核心代码实现(基于 Java+Spring Boot 框架,附带详细注释):

一、准备工作

  1. 注册微信开放平台

    • 申请网站应用,获取AppIDAppSecret(需 ICP 备案域名)
    • 设置授权回调域名(如 www.yourdomain.com
  2. 添加 Maven 依赖

    <!-- HTTP请求工具 -->
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>4.9.3</version>
    </dependency>
    <!-- JSON解析 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.3</version>
    </dependency>
    

二、核心代码实现

1. 生成微信登录二维码(Controller 层)

@RestController
@RequestMapping("/auth/wechat")
public class WechatAuthController {

    // 从配置文件读取(application.yml)
    @Value("${wechat.appid}")
    private String appId;

    @Value("${wechat.callback}")
    private String callbackUrl;

    /**
     * 生成微信登录二维码的URL
     */
    @GetMapping("/qrcode-url")
    public String getQrCodeUrl() {
        // 微信开放平台生成二维码的固定URL格式
        String url = "https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s" +
                "&redirect_uri=%s" +
                "&response_type=code" +
                "&scope=snsapi_login" +  // 固定值
                "&state=YOUR_STATE";     // 防CSRF攻击随机字符串(需存储校验)

        return String.format(url, appId, URLEncoder.encode(callbackUrl, StandardCharsets.UTF_8));
    }
}

2. 处理微信回调(获取用户信息)

/**
 * 微信回调接口(需与开放平台配置的回调地址一致)
 */
@GetMapping("/callback")
public ResponseEntity<?> callback(@RequestParam String code, @RequestParam String state) {
    // 1. 校验state参数(防止CSRF攻击)
    if (!validateState(state)) {
        return ResponseEntity.badRequest().body("非法请求");
    }

    // 2. 用code换取access_token
    String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
            "?appid=%s" +
            "&secret=%s" +
            "&code=%s" +
            "&grant_type=authorization_code";

    String response = OkHttpUtil.get(String.format(tokenUrl, appId, appSecret, code));
    JsonNode tokenJson = JsonUtil.parse(response);

    // 3. 获取用户信息
    String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
            "?access_token=%s" +
            "&openid=%s";

    String userResponse = OkHttpUtil.get(
            String.format(userInfoUrl, tokenJson.get("access_token").asText(),
                                   tokenJson.get("openid").asText()));
    JsonNode userInfo = JsonUtil.parse(userResponse);

    // 4. 处理用户登录(示例:创建本地用户或绑定已有账号)
    User user = userService.createOrUpdateWechatUser(userInfo);

    // 5. 生成JWT或Session(此处以JWT为例)
    String jwtToken = JwtUtil.generateToken(user.getId());

    return ResponseEntity.ok().header("Authorization", jwtToken).build();
}

3. 工具类封装

public class OkHttpUtil {
    /**
     * 发送GET请求
     */
    public static String get(String url) throws IOException {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();
        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }
    }
}

public class JsonUtil {
    private static final ObjectMapper mapper = new ObjectMapper();

    /**
     * JSON字符串转对象
     */
    public static JsonNode parse(String json) throws JsonProcessingException {
        return mapper.readTree(json);
    }
}

三、关键安全措施

  1. State 参数校验
    生成随机 state 字符串并存储(如 Redis),回调时验证是否匹配。

  2. 敏感信息保护

    • AppSecret必须存储在服务端,不可暴露给前端
    • 用户 openid 等敏感信息需加密存储
  3. 错误处理

    // 在回调接口中添加异常处理
    try {
        // ... 业务逻辑
    } catch (WechatApiException e) {
        // 处理微信接口错误(如code过期)
        return ResponseEntity.status(500).body("微信登录失败:" + e.getMessage());
    }
    

四、配置示例(application.yml)

wechat:
  appid: wx1234567890abcdef  # 微信应用ID
  app-secret: your_app_secret_here  # 微信应用密钥
  callback: https://www.yourdomain.com/auth/wechat/callback  # 授权回调地址

五、前端对接建议

  1. 前端通过 /auth/wechat/qrcode-url 获取二维码 URL,使用微信官方 JS 库渲染
  2. 扫码成功后,前端通过轮询或 WebSocket 检查登录状态

到此这篇关于SpringBoot 实现微信扫码登录的示例代码的文章就介绍到这了,更多相关SpringBoot 微信扫码登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Servlet虚拟路径映射配置详解

    Servlet虚拟路径映射配置详解

    这篇文章主要介绍了Servlet虚拟路径映射配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Java中让界面内的时间及时更新示例代码

    Java中让界面内的时间及时更新示例代码

    这篇文章主要给大家介绍了关于Java中让界面内的时间及时更新的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 浅谈SpringBoot如何自定义Starters

    浅谈SpringBoot如何自定义Starters

    今天带大家来学习SpringBoot如何自定义Starters,文中有非常详细的图文介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Spring Boot条件注解之@ConditionalOnProperty完全解析

    Spring Boot条件注解之@ConditionalOnProperty完全解析

    这篇文章主要介绍了SpringBoot中的@ConditionalOnProperty注解,通过配置文件属性值控制Bean或配置类的加载,实现功能开关和环境配置,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • 关于mybatis使用${}时sql注入的问题

    关于mybatis使用${}时sql注入的问题

    这篇文章主要介绍了关于mybatis使用${}时sql注入的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java容器详细解析

    java容器详细解析

    本文主要介绍了java容器的详细解析。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 详解Java中的JDK、JRE、JVM

    详解Java中的JDK、JRE、JVM

    本文主要介绍了Java中的JDK、JRE、JVM的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Elasticsearch term 查询之精确值搜索功能实现

    Elasticsearch term 查询之精确值搜索功能实现

    term查询是Elasticsearch中用于精确值搜索的一种基本方式,通过了解 term 查询的工作原理和使用方法,你可以更好地利用 Elasticsearch 进行结构化数据的搜索和分析,本文将详细介绍 term 查询的工作原理、使用场景以及如何在 Elasticsearch 中应用它,感兴趣的朋友一起看看吧
    2024-06-06
  • ScheduledThreadPoolExecutor巨坑解决

    ScheduledThreadPoolExecutor巨坑解决

    这篇文章主要为大家介绍了使用ScheduledThreadPoolExecutor遇到的巨坑解决示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Maven Assembly实战教程

    Maven Assembly实战教程

    MavenAssembly插件用于创建可分发包,如JAR、ZIP或TAR文件,通过配置pom.xml,可以生成包含所有依赖的JAR文件或自定义格式的归档文件,示例展示了如何使用默认描述符和自定义描述符创建JAR包,以及在多模块项目中使用Assembly插件
    2024-12-12

最新评论