首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot整合微信(公众号)实现扫码登录(两种方式,两种实现)

springboot整合微信(公众号)实现扫码登录(两种方式,两种实现)

作者头像
一只牛博
发布于 2025-05-31 01:19:10
发布于 2025-05-31 01:19:10
47802
代码可运行
举报
运行总次数:2
代码可运行
springboot整合微信扫码登录
  • 基于公众号推送消息实现的扫码登录
    • 前期准备
    • *服务器配置中的token到底怎么配置
    • 使用测试号
    • 代码实现
      • maven坐标
      • 配置类实现
      • 获取登录二维码
      • 前端轮询回调实现登录
      • 微信事件推送接口实现
  • 基于转发实现的扫码登录
    • 前期准备
    • 代码实现
      • 接口实现

首先说一下这个微信扫码登录它的方式有两种,一种是基于网页的redirect实现,一种是基于公众号推送消息实现,二者实现的效果是不一样的

基于公众号推送消息实现的扫码登录

贴一个官方文档

前期准备

  1. 需要有自己的域名(这里你可以使用内网穿透,会生成一个自己的域名,网上一大堆,自己奥利给吧)
  2. 需要申请微信认证(如果你是我这种情况,那么同是天涯沦落人,往下走)
  1. 这一步需要具备以上条件,否则没什么用(上面没有的就继续下)
image-20230506083452648
image-20230506083452648

如上图,获取到appid,appsecret(项目中会用到)之后,再将服务器配置修改并启用就可以了,

*服务器配置中的token到底怎么配置

微信官方文档公众号介入指南说明(里面有一个PHP示例代码下载,其实这里不止PHP的)

image-20230509090536781
image-20230509090536781

上面的是微信文档说明,下面一定要注意,很关键

  1. 首先说一下URL,这个URL是微信服务器需要使用get方式请求的你的路径,其次它是白名单的(当你配置拦截器或过滤器或AOP的时候)。这个get请求仅仅是验证token的。
  2. 其次是token,这里的token可以随意填写,但是你的程序中的token必须与这个保持一致(这里就是访问你上面URL的接口中的token)
  3. 代码实现如下:这里的代码实现在下面贴

使用测试号

image-20230509222432710
image-20230509222432710

配置的话和上面一样的操作

代码实现

maven坐标
代码语言:javascript
代码运行次数:1
运行
AI代码解释
复制
<dependency>
  <groupId>com.github.binarywang</groupId>
  <artifactId>weixin-java-open</artifactId>
  <version>3.8.0</version>
</dependency>
配置类实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author xiaobo
 * @date 2023/4/10
 */
@Configuration
public class WeChatCodeConfig {

    @Value("${wx.appid}")
    private String appId;

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

    /**
     * 定义WxMpService bean
     */
    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
        config.setAppId(appId);
        config.setSecret(appSecret);
        wxMpService.setWxMpConfigStorage(config);
        return wxMpService;
    }
}

上面的wx.appid,wx.appsecret是定义到配置文件中的,是在前期准备的第三点中获取到的

获取登录二维码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		@PostMapping("/getLoginQrCode")
    @ResponseBody
    public RespResult getLoginQrCode() throws WxErrorException, UnsupportedEncodingException {
        // 设置场景id,登录的时候需要根据这个获取redis中存在的openid
        String sceneStr = IdUtil.getSnowflake().nextIdStr();
        WxMpQrCodeTicket wxMpQrCodeTicket = wxService.getQrcodeService().qrCodeCreateTmpTicket(sceneStr, 3600);
        // 这里获取到的是二维码,前端只需要用<img>标签中的src接收就可以展示
        String s = wxService.getQrcodeService().qrCodePictureUrl(wxMpQrCodeTicket.getTicket());
        return RespResult.success(s, sceneStr);
    }

上面的实现建议可以再做一步redis存一个有过期时间的key,防止后面一直轮询调用

前端轮询回调实现登录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	 	@PostMapping("wechatOpenIdLogin")
    @ResponseBody
    public RespResult wechatOpenIdLogin(String sceneStr, HttpServletRequest request) {
      // 这里的sceneStr是上面接口返回的,这步操作是微信事件推送之后会存一个redis 
      Boolean exists = JedisUtil.exists(sceneStr);
        if (exists) {
          	// TODO 业务操作,其中JedisUtil.getStr(sceneStr)能得到微信扫码用户的openid
            return weChatCodeService.wechatLogin(JedisUtil.getStr(sceneStr), request);
        } else {
            return RespResult.fail(sceneStr);
        }
    }
微信事件推送接口实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping("/sign")
public void sign(HttpServletResponse response, HttpServletRequest request) throws Exception {
  String method = request.getMethod();
  // 微信加密签名
  String signature = request.getParameter("signature");
  // 随机字符串
  String echostr = request.getParameter("echostr");
  // 时间戳
  String timestamp = request.getParameter("timestamp");
  // 随机数
  String nonce = request.getParameter("nonce");
  // 签名验证是get请求
  if ("GET".equals(method)) {
    String[] str = {"123456token", timestamp, nonce};
    // 字典排序
    Arrays.sort(str);
    String bigStr = str[0] + str[1] + str[2];
    // SHA1加密
    String digest = sha1(bigStr);
    // 确认请求来至微信
    if (digest.equals(signature)) {
      response.getWriter().print(echostr);
    }
  } else {
    // 获取WxMpXmlMessage
    WxMpXmlMessage wxMpXmlMessage = WxMpXmlMessage.fromXml(request.getInputStream());
    // OpenId
    String fromUserName = wxMpXmlMessage.getFromUser();
    // 消息类型,event
    final String msgType = wxMpXmlMessage.getMsgType();
    // 事件类型
    final String event = wxMpXmlMessage.getEvent();
    String sceneStr = "";
    log.error("微信返回验签是:{},{},{}", msgType, event, fromUserName);
    if (WxConsts.XmlMsgType.EVENT.equals(msgType)) {
                if (event.equals(WxConsts.EventType.SUBSCRIBE)) {
                    if (ticket != null) {
                        sceneStr = wxMpXmlMessage.getEventKey().replace("qrscene_", "");
                    }
                }
                //注:事件类型为SCAN即已关注
                else if (event.equals(WxConsts.EventType.SCAN)) {
                    if (ticket != null) {
                        sceneStr = wxMpXmlMessage.getEventKey();
                    }
                }
                // 如果sceneStr不为空代表用户已经扫描并且关注了公众号
                if (CharSequenceUtil.isNotEmpty(sceneStr)) {
                    // 将微信公众号用户ID缓存到redis中,标记用户已经扫码完成,执行登录逻辑。
                    JedisUtil.setStr(sceneStr, fromUserName, OpenIdRedisExpireTime);
                }
            }
    response.getWriter().write("可以随便写");
  }
}

微信公众号接收事件推送

基于转发实现的扫码登录

这个和上面的不一样,这个用微信官方来说的话就是==网页授权获取用户基本信息==

前期准备

这里只需要获取到appid,appsecret,还有一个就是配置服务器域名如下图

image-20230509223346900
image-20230509223346900

代码实现

接口实现

这里需要用到上面公众号推送消息实现的->代码实现->(maven坐标,配置类实现)

代码语言:javascript
代码运行次数:1
运行
AI代码解释
复制
/**
 * 获取微信扫码登录二维码
*/
@RequestMapping("/getLoginQrCode")
public RespResult getLoginQrCode() throws WxErrorException {
  // 重定向URl,这里必须配置公众号对应的域名
  String redirectUrl = "http://localhost:8080/login";
  // 这里只获取用户扫码地址
  String url = wxService.oauth2buildAuthorizationUrl(redirectUrl, WxConsts.OAuth2Scope.SNSAPI_BASE, null);
  return RespResult.success(url);
}

/**
 * 微信扫码登录
*/
@RequestMapping("wechatLogin")
public RespResult wechatLogin(@RequestParam("code") String code, HttpServletRequest request) {
  return weChatCodeService.wechatLogin(code, request);

⚠️: 注意,这里的url并不是一个二维码,而是一个地址,如果你在浏览器中打开的话,它会提示使用微信客户端打开,所以这个就注定了他并非根本意义上的扫码登录,它仅仅是微信扫码然后直接打开你跳转后的页面,也就是你上面定义的重定向URI,如果你的网站是手机端和PC端都兼容,那么可以直接PC出码,手机扫码直接登录。具体实现和上面的差不多,这里贴个图,针对上面的接口。

image-20230509225650967
image-20230509225650967

画的很丑,将就用吧

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信公众号关注或取关后再处理我们自己的业务逻辑
在做微信小程序或公众号开发的有时候,难免会遇到需要在用户关注或取关公众号后处理业务逻辑的需求,只需要几步就可以搞定。
悟空码字
2023/03/04
7500
微信公众号关注或取关后再处理我们自己的业务逻辑
微信公众平台开发(四)——微信网页授权:获取用户openid&用户基本信息
在开发中,如果web产品需要使用到微信的功能,比如微信授权登录、微信支付、微信投票等,我是开发的东东是一个web项目,然而如果需要接入微信的话,就需要使用道微信的微信网页开发相关的功能。 其中我们需要的东西就是拿到微信服务器的回调,比如用户扫码登录我们的web项目时,用户正确授权之后,微信服务器能回调到我们期望的url并且返回相应的参数信息。
不愿意做鱼的小鲸鱼
2023/03/25
16.7K0
微信公众平台开发(四)——微信网页授权:获取用户openid&用户基本信息
微信公众号消息接入(普通消息+模板消息)
  1、“硅谷课堂”公众号实现根据关键字搜索相关课程,如:输入“java”,可返回java相关的一个课程;
别团等shy哥发育
2023/02/25
3.8K0
微信公众号消息接入(普通消息+模板消息)
网站提示用微信扫码登录,他们是怎么实现的?
作为一个技术码农,在使用社区、论坛或者各类AI服务的时,经常会看到这样一个提示:“使用微信公众号扫码登录”。那因为这种的登录方式除了登录,还可以让用户沉淀到公众号上,以后还能接收到公众号推广,可谓是一举两得。那它是怎么做的呢?🤔
小傅哥
2024/02/26
5K0
网站提示用微信扫码登录,他们是怎么实现的?
Java调用微信登录以及eclipse 远程调试前言:一、微信测试号的连接与申请:二、eclipse远程调试:总结:
前言: 这些年微信异常火爆,甚至爷爷奶奶辈的人都会用微信。所以很多网站都支持用微信账号登录,那么接下来就来看看如何当用户通过微信访问我们的链接时,我们如何获取到该用户的微信公开资料,以及如何用eclipse 远程调试代码。 (本文的前提是有一个可以在阿里云上运行的web项目)。 一、微信测试号的连接与申请: 1、编写servlet响应测试号: 当用户关注我们的测试号(公众号)时,微信测试号便会发请求到我们配置好的URL中,我们现在就要编写这个响应的URL对应的程序,这样才能顺利连通。 需要编写两个类:
贪挽懒月
2018/06/22
1.2K0
Spring Boot 开发微信公众号后台,看看松哥公众号后台是怎么实现的!
Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台。
江南一点雨
2019/11/01
1.3K0
Spring Boot 开发微信公众号后台,看看松哥公众号后台是怎么实现的!
公众号开发:获取用户消息和回复消息
最近在看微信公众号的开发文档,觉得很有意思,可以自定义开发一些功能,比如有人关注了公众号之后,你可以做出稍微复杂点的回复(简单的回复在公众号后台配置就好啦);比如关注者发送了「学习」消息,你可以给他推送一些文章,发送「天气」的消息,你可以回复当前的天气状况;还可以进行素材的管理,用户的管理等等。
Java技术编程
2020/06/10
6K0
公众号开发:获取用户消息和回复消息
5行代码实现微信消息推送,springboot实现微信推送,java微信推送
至于springboot怎么创建java后台,我这里就不再唠叨了,大家百度一下,一大堆的文章。这里只需要重点讲解下以下几点。
编程小石头
2020/10/22
7.4K0
5行代码实现微信消息推送,springboot实现微信推送,java微信推送
手把手教你如何微信公众号开发「建议收藏」
最近的话,发现微信开发其实也有很多挺有意思的地方,比如最近很火的一款游戏“跳一跳”,也让我如此着迷。。但是,今天我所要讲的并不是对于小程序的开发,而是要说一下,关于微信开发的另外一个内容,那就是微信公众号。。
全栈程序员站长
2022/09/25
3.6K0
手把手教你如何微信公众号开发「建议收藏」
微信每日早安推送「建议收藏」
一个摸鱼的下午,简单介绍一下怎么做的吧,纯后端java,写的比较随意,仅仅达到了功能要求。
全栈程序员站长
2022/11/11
8250
微信每日早安推送「建议收藏」
Spring Boot + OAuth2.0 实现微信扫码登录,这才叫优雅!!
点击关注公众号,Java干货及时送达 微信开放平台:微信扫码登录功能 官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 1. 授权流程说明 微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可
Java技术栈
2022/04/21
6K0
Spring Boot + OAuth2.0 实现微信扫码登录,这才叫优雅!!
【除夕夜特辑】手把手教你微信公众号开发
各位读者朋友们好,今天是除夕,在这里先祝大家新年快乐。这篇文章其实是一个星期前写的,一直在电脑里放着,赶上今天的好日子,机缘巧合的情况下被我重新发现,于是就发布出来了。
wangweijun
2021/10/25
9460
【除夕夜特辑】手把手教你微信公众号开发
Java微信公众号开发(附源码!!!)
笔者最近在为一个艺考服务团队开发手机端的服务,由于开发app需要的时间较长,所以选择开发微信公众号。本人比较擅长Java开发,所以本文是基于Java语言的公众号开发。话不多说,直接进入正题。
全栈程序员站长
2022/08/29
8120
Java微信公众号开发(附源码!!!)
微信授权登录功能实现
  接口文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
别团等shy哥发育
2023/02/25
4.6K0
微信授权登录功能实现
微信公众平台-微信服务号开发
近期接到了涉及微信开放平台和微信公众平台相关的开发需求,开发过程中踩了许多坑,把相关问题整理记录下来以便巩固记忆,并把总结的经验分享出来,本篇分享微信服务号开发,希望可以给大家提供帮助
全栈程序员站长
2022/07/28
8.8K0
微信公众平台-微信服务号开发
手把手教你用 SpringBoot 开发微信公众号后台
Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台。
江南一点雨
2023/01/04
1.1K0
手把手教你用 SpringBoot 开发微信公众号后台
用java开发微信公众号:公众号接入和access_token管理(二)
本文讲述如何通过Java代码实现微信公众号的自动回复功能,包括关键词回复,图文回复,以及自定义菜单。同时介绍了如何获取Access Token以及注意事项。
古时的风筝
2018/01/08
2.5K0
用java开发微信公众号:公众号接入和access_token管理(二)
使用微信测试账号对网页进行授权
如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。我们在进行公众号网页开发的时候,想要获取用户的基本信息,首先得获取到access_token,从access_token里我们要拿出用户的openid来作为用户在我们系统中的唯一标识,以及通过openid可以保证该用户的只能访问到与其openid相对应的数据,防止越权漏洞。因此,我们需要对网页进行授权,否则是无法在获取到用户的openid的。
端碗吹水
2020/09/23
4.7K0
使用微信测试账号对网页进行授权
申请测试微信公众号流程_如何申请免测
大家好,又见面了,我是你们的朋友全栈君。 申请测试微信公众号 申请的地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showi
全栈程序员站长
2022/09/20
5.1K0
申请测试微信公众号流程_如何申请免测
服务号开发入门
了不起学弟:了不起学长,最近在学习服务号开发,感觉很难啊,文档有些都看不明白啊。。。
灬沙师弟
2023/09/06
3290
服务号开发入门
推荐阅读
相关推荐
微信公众号关注或取关后再处理我们自己的业务逻辑
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档