# 二维码登录API接口文档(已适配后端) ## 概述 二维码登录功能允许用户通过手机APP或小程序扫描Web端生成的二维码来完成登录,提供更便捷和安全的登录体验。 **后端实现状态:** ✅ 已完成 **前端适配状态:** ✅ 已完成 ## 接口列表 ### 1. 生成登录二维码 **接口地址:** `POST /api/qr-login/generate` **请求参数:** 无 **响应数据:** ```json { "code": 0, "message": "生成成功", "data": { "token": "abc123def456", "qrCode": "qr-login:abc123def456", "expiresIn": 300 } } ``` **字段说明:** - `token`: 二维码唯一标识token,用于后续状态查询 - `qrCode`: 二维码内容(后端生成的原始内容) - `expiresIn`: 过期时间(秒),默认300秒(5分钟) ### 2. 检查二维码状态 **接口地址:** `GET /api/qr-login/status/{token}` **请求参数:** - `token`: 二维码token(路径参数) **响应数据:** ```json { "code": 0, "message": "查询成功", "data": { "status": "pending", "expiresIn": 280 } } ``` **状态说明:** - `pending`: 等待扫码 - `scanned`: 已扫码,等待确认 - `confirmed`: 已确认登录 - `expired`: 已过期 **登录成功时的响应:** ```json { "code": 0, "message": "登录成功", "data": { "status": "confirmed", "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "userInfo": { "userId": 1, "username": "admin", "nickname": "管理员", "avatar": "https://example.com/avatar.jpg" }, "expiresIn": 60 } } ``` ### 3. 扫码标记 **接口地址:** `POST /api/qr-login/scan/{token}` **请求参数:** - `token`: 二维码token(路径参数) **响应数据:** ```json { "code": 0, "message": "操作成功", "data": true } ``` ### 4. 确认登录 **接口地址:** `POST /api/qr-login/confirm` **请求参数:** ```json { "token": "abc123def456", "userId": 1, "platform": "web" } ``` **响应数据:** ```json { "code": 0, "message": "确认成功", "data": { "status": "confirmed", "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "userInfo": { "userId": 1, "username": "admin", "nickname": "管理员" }, "expiresIn": 60 } } ``` ### 5. 微信小程序确认登录 **接口地址:** `POST /api/qr-login/wechat-confirm` **请求参数:** ```json { "token": "abc123def456", "userId": 1, "platform": "miniprogram", "wechatInfo": { "openid": "wx_openid_123", "unionid": "wx_unionid_456", "nickname": "微信用户", "avatar": "https://wx.qlogo.cn/..." } } ``` **响应数据:** ```json { "code": 0, "message": "微信小程序登录确认成功", "data": { "status": "confirmed", "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "userInfo": {...}, "expiresIn": 60 } } ``` ## 实现流程 ### Web端流程: 1. 用户点击扫码登录 2. 前端调用 `/qr-login/generate` 生成二维码 3. 显示二维码给用户 4. 前端轮询调用 `/qr-login/status` 检查状态 5. 当状态为 `confirmed` 时,获取token完成登录 ### 移动端流程: 1. 用户扫描二维码,跳转到确认页面 2. 页面加载时调用 `/qr-login/scan` 标记已扫码 3. 用户点击确认后调用 `/qr-login/confirm` 确认登录 4. 或用户点击取消后调用 `/qr-login/cancel` 取消登录 ## 安全考虑 1. **二维码有效期**:建议设置5分钟有效期,过期后需要重新生成 2. **一次性使用**:每个二维码只能使用一次,确认或取消后立即失效 3. **用户验证**:移动端需要验证用户的登录状态 4. **IP限制**:可以记录生成二维码的IP,限制异地登录 5. **频率限制**:限制同一IP生成二维码的频率 ## 数据库设计建议 ```sql CREATE TABLE qr_login_records ( id BIGINT PRIMARY KEY AUTO_INCREMENT, qr_code_key VARCHAR(64) UNIQUE NOT NULL COMMENT '二维码唯一标识', status ENUM('waiting', 'scanned', 'confirmed', 'expired', 'cancelled') DEFAULT 'waiting' COMMENT '状态', user_id BIGINT NULL COMMENT '扫码用户ID', client_ip VARCHAR(45) COMMENT '客户端IP', user_agent TEXT COMMENT '用户代理', expire_time DATETIME NOT NULL COMMENT '过期时间', scan_time DATETIME NULL COMMENT '扫码时间', confirm_time DATETIME NULL COMMENT '确认时间', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_qr_code_key (qr_code_key), INDEX idx_status (status), INDEX idx_expire_time (expire_time) ); ``` ## 错误码说明 - `0`: 成功 - `400`: 参数错误 - `401`: 未授权 - `404`: 二维码不存在 - `410`: 二维码已过期 - `429`: 请求过于频繁 - `500`: 服务器内部错误