別再手擼登錄框!20行Spring Boot代碼教你秒開微信登錄
很多人聽到“微信登錄”就條件反射地覺得麻煩:OAuth2 授權?回調?access_token?聽起來就像要寫半天接口。 其實真不復雜——只要你抓住流程的核心邏輯,20 行 Spring Boot 代碼就能讓“掃碼登錄”從無到有跑起來。
那天晚上,我正準備收工,團隊的小伙伴忽然發(fā)消息說:“哥,明天產(chǎn)品要看個能跑的微信登錄 Demo,先糊一個能掃的吧!” 沒辦法,咖啡一口干下去,我就在工位上拉了條最短路徑。 不搞綁定、不加風控、不引登錄態(tài),目標就一個:能掃、能回調、能拿到 openid。
微信登錄的核心流程
不管是網(wǎng)站掃碼登錄、公眾號登錄還是小程序授權,微信的登錄邏輯都可以抽象成四步:
- 用戶點擊“用微信登錄”,前端跳轉到微信授權頁;
- 用戶確認授權后,微信回調到你的服務端地址,并帶上 code 參數(shù);
- 后端用 code 換取 access_token 和 openid;
- (可選)用 access_token 獲取用戶的頭像、昵稱等資料。
至于安全、綁定、會話、風控,那都是第二階段的事。 演示用的 Demo,只需要把上面這條鏈打通就行。
Spring Boot 最小實現(xiàn)(僅 20 行核心代碼)
控制器代碼
package com.icoderoad.wx;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.Map;
/**
* 微信掃碼登錄控制器
* 實現(xiàn)最簡流程:掃碼 → 回調 → 換 token/openid → 可選用戶信息
*/
@RestController
@RequestMapping("/wx")
public class WxLoginController {
@Value("${wx.appid}")
private String appId;
@Value("${wx.secret}")
private String secret;
/**
* 第一步:跳轉到微信掃碼授權頁
*/
@GetMapping("/login")
public void login(HttpServletResponse resp) throws Exception {
String redirectUri = URLEncoder.encode("https://your.com/wx/callback", "UTF-8");
String url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + appId
+ "&redirect_uri=" + redirectUri
+ "&response_type=code&scope=snsapi_login&state=antiCsrf#wechat_redirect";
resp.sendRedirect(url);
}
/**
* 第二步:回調地址,用 code 換取 access_token + openid,并獲取用戶資料
*/
@GetMapping("/callback")
public Map<String, Object> callback(@RequestParam String code, @RequestParam String state) {
RestTemplate rt = new RestTemplate();
// 1. 用 code 換 token 和 openid
Map<String, Object> token = rt.getForObject(
"https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId
+ "&secret=" + secret
+ "&code=" + code
+ "&grant_type=authorization_code",
Map.class
);
String accessToken = (String) token.get("access_token");
String openid = (String) token.get("openid");
// 2. 可選:獲取用戶詳細信息
return rt.getForObject(
"https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken
+ "&openid=" + openid,
Map.class
);
}
}這樣就能實現(xiàn)最簡版掃碼登錄:點擊 → 掃碼 → 回調 → 獲取 openid/用戶資料。
關鍵配置與要點
- 開放平臺配置
- 在微信開放平臺添加網(wǎng)站應用,配置授權回調域名(必須備案且為 https)。
- 獲取 appid 和 secret,寫入配置文件:
wx:
appid: your-app-id
secret: your-app-secreta.state 校驗防 CSRFstate 參數(shù)不能隨便寫,要在會話中生成隨機串,回調時比對一致性,防止偽造請求。
b.unionid vs openid
- openid:單應用唯一標識用戶;
- unionid:同一主體下多個應用的統(tǒng)一用戶標識,建議后續(xù)賬號合并時使用。
- access_token 生命周期 微信網(wǎng)頁授權的 token 有時效,通常只在當前登錄流程使用,不建議長期緩存。
- 錯誤處理與日志
- 網(wǎng)絡超時、重復回調、code 已失效等情況都要打印日志;
- 最少捕獲異常打印一行 log,別“無聲失敗”。
業(yè)務落地:如何接入你自家的用戶系統(tǒng)
掃碼拿到 openid 后,業(yè)務側通常有兩種邏輯:
- 已有綁定: 查詢表 user_auth_third,通過 (wx_appid, openid) 找到已綁定的用戶,簽發(fā) JWT 或建立 Session。
- 首次登錄: 如果查不到,就走綁定流程:
user_auth_third(wx_appid, openid, unionid, user_id, created_at)
user(id, phone, nick, avatar, ...)新用戶插入綁定記錄;老用戶點擊綁定時命中已有記錄即可。 注意:要做冪等處理(唯一索引 + 沖突重試),防止一個人綁定成兩個賬號。
常見場景拓展
場景 | 調整點 |
公眾號內 H5 授權 | 授權地址改為 |
小程序登錄 | 使用 |
PC 大屏掃碼登錄 | 可增加“輪詢掃碼狀態(tài)”機制,用于顯示掃碼結果狀態(tài) |
結語
在很多項目中,微信登錄往往是“首屏必須能用”的功能,但也最容易被復雜文檔勸退。 其實真正落地時,只要理解 OAuth2 的四步鏈路,用 Spring Boot 的 RestTemplate 寫幾行調用,就能輕松跑通。
不必一開始就追求“完美登錄體系”,先讓 Demo 能掃、能跳、能拿到 openid,再逐步補齊綁定、安全、風控、灰度。
記?。嚎焖衮炞C閉環(huán)比完美架構更重要。
等你把第一版跑起來,再去加 JWT、風控、掃碼態(tài)輪詢……那時再喝杯咖啡,慢慢調。



























