大数跨境
0
0

Spring Boot 实现微信登录,So Easy !

Spring Boot 实现微信登录,So Easy ! Java技术图谱
2025-12-02
3

我昨晚十一点多还在改我们组那个小李写的登录逻辑,他那代码…唉算了不吐槽了,就说微信登录这个事吧,其实啊,真不难,就是流程有点啰嗦,你们肯定见过——扫个码,手机点一下,然后后台就要换 code → session → token 的那套东西。

我那会儿在公司工位,网不太好,一直转圈,我还以为自己打错字了…结果是微信那边限频了,气得我一口咖啡差点喷出来。

1. 后端要做的其实就一件事:拿 code 去换 openid

你们知道吧,微信小程序、公众号、APP,它们都给你一个 code,然后你后端要发个请求到:

https://api.weixin.qq.com/sns/jscode2session

我当时写了个最简的 controller,贴给你看看…等下我手滑打错你别笑:

@RestController
@RequestMapping("/wx")
publicclass WxLoginController {

    @GetMapping("/login")
    public Map<String, Object> login(String code) {
        // 就是那个...微信给的 appid 和 secret
        String appid = "your-appid";
        String secret = "your-secret";

        String url = "https://api.weixin.qq.com/sns/jscode2session"
                + "?appid=" + appid
                + "&secret=" + secret
                + "&js_code=" + code
                + "&grant_type=authorization_code";

        RestTemplate rest = new RestTemplate();
        Map<String, Object> resp = rest.getForObject(url, Map.class);

        // 正常会返回 openid、session_key…之类的
        return resp;
    }
}

我记得第一次写的时候那返回值是空的,我还在那里骂 Spring Boot,说是不是 RestTemplate 又抽风了…结果是我 code 传错了,真是服了自己。

2. openid 拿到之后…你得给前端生成自己的 token

我们组的小李之前把 openid 当 token 直接丢前端,我当场就拍他肩膀说:兄弟你这是在裸奔啊

正常是你后端自己搞一个 JWT 或者 session 存 redis 啥的,我随便示个例子:

public String createToken(String openid) {
    return Jwts.builder()
            .setSubject(openid)
            .setIssuedAt(new Date())
            .signWith(SignatureAlgorithm.HS256, "my-secret-key")
            .compact();
}

然后用户后面所有接口就带这个 token 就好了嘛,不然每次还得拿 code 换 openid,你服务器不得累死。

3. 前端那边其实就是调 wx.login()

我不是前端,不过我那天帮小李 debug 小程序的时候,被那个真机调试搞得头都大了…反正就是这样:

wx.login({
  success(res) {
    if(res.code){
      // 把 code 传后端
      wx.request({
        url'https://xxx.com/wx/login',
        data: { code: res.code },
        success(resp){
          console.log("后端返回 token:", resp.data.token)
        }
      })
    }
  }
})

有一次我踩了个坑:手机那边的 code 超时了,我后端还在问“怎么又是空的?怎么又是空的??”,后来才知道 code 只能用一次,还很容易过期,微信这点真的…算了不说了。

4. 注意一点:session_key 千万别乱存

我以前见过一个同事,把用户 session_key 存数据库,理由是“以备不时之需”…我当场说:“你要干啥?解密人家数据啊?”

正确姿势就是: session_key 只用于当前登录流程,不要落库,要落也要加密,不然被攻击了你都不知道怎么掉的坑。

5. 大概流程就是这样…真的不难

你看,其实整个 Spring Boot + 微信登录,就三步:

  1. 前端要个 code
  2. 后端拿 code 换 openid
  3. 后端生成自己的登录态发回前端

真没啥复杂的地方,难的是: ——网不好、code 过期、前端改接口不说、微信限频、测试传 code=123 过来…这种才是麻烦。

哎说多了我又气上来了…算了算了,我咖啡凉了我去热一下,你要我再写个版本带数据库、带用户表、带 token 刷新那种,也可以,你喊我就行。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html


🔥东哥私藏精品🔥


东哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》。总量高达650GB点击下方公众号回复关键字java 全部免费领取

【声明】内容源于网络
0
0
Java技术图谱
回复 java,领取Java面试题。分享AI编程,AI工具,Java教程,Java下载,Java技术栈,Java源码,Java课程,Java技术架构,Java基础教程,Java高级教程,idea教程,Java架构师,Java微服务架构。
内容 1111
粉丝 0
Java技术图谱 回复 java,领取Java面试题。分享AI编程,AI工具,Java教程,Java下载,Java技术栈,Java源码,Java课程,Java技术架构,Java基础教程,Java高级教程,idea教程,Java架构师,Java微服务架构。
总阅读548
粉丝0
内容1.1k