我昨晚十一点多还在改我们组那个小李写的登录逻辑,他那代码…唉算了不吐槽了,就说微信登录这个事吧,其实啊,真不难,就是流程有点啰嗦,你们肯定见过——扫个码,手机点一下,然后后台就要换 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 + 微信登录,就三步:
-
前端要个 code -
后端拿 code 换 openid -
后端生成自己的登录态发回前端
真没啥复杂的地方,难的是: ——网不好、code 过期、前端改接口不说、微信限频、测试传 code=123 过来…这种才是麻烦。
哎说多了我又气上来了…算了算了,我咖啡凉了我去热一下,你要我再写个版本带数据库、带用户表、带 token 刷新那种,也可以,你喊我就行。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
🔥东哥私藏精品🔥
东哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》。总量高达650GB。点击下方公众号回复关键字java 全部免费领取

