# 微信小程序扫码登录使用指南 ## 概述 扫码登录接口现已全面支持微信小程序端,用户可以通过微信小程序扫码快速登录网页端或其他平台。 ## 支持的平台 - ✅ **网页端** - 传统的网页扫码登录 - ✅ **移动APP** - 原生移动应用扫码登录 - ✅ **微信小程序** - 微信小程序扫码登录(新增) ## 接口说明 ### 1. 生成扫码登录token ``` POST /api/qr-login/generate ``` **响应示例:** ```json { "code": 0, "message": "生成成功", "data": { "token": "abc123def456", "qrCode": "qr-login:abc123def456", "expiresIn": 300 } } ``` ### 2. 检查扫码登录状态 ``` GET /api/qr-login/status/{token} ``` **响应示例:** ```json { "code": 0, "message": "查询成功", "data": { "status": "confirmed", "accessToken": "eyJhbGciOiJIUzI1NiJ9...", "userInfo": { "userId": 123, "username": "user123", "nickname": "张三" }, "expiresIn": 60 } } ``` ### 3. 微信小程序确认登录(专用接口) ``` POST /api/qr-login/wechat-confirm ``` **请求示例:** ```json { "token": "abc123def456", "userId": 123, "platform": "miniprogram", "wechatInfo": { "openid": "oABC123DEF456", "unionid": "uXYZ789ABC123", "nickname": "张三", "avatar": "https://wx.qlogo.cn/..." } } ``` ## 微信小程序端实现示例 ### 1. 扫码功能 ```javascript // 小程序扫码 wx.scanCode({ success: (res) => { const qrContent = res.result; // 例如: "qr-login:abc123def456" if (qrContent.startsWith('qr-login:')) { const token = qrContent.replace('qr-login:', ''); this.confirmLogin(token); } } }); ``` ### 2. 确认登录 ```javascript confirmLogin(token) { // 获取用户信息 wx.getUserProfile({ desc: '用于扫码登录', success: (userRes) => { // 调用确认登录接口 wx.request({ url: 'https://your-api.com/api/qr-login/wechat-confirm', method: 'POST', data: { token: token, userId: this.data.currentUserId, // 当前登录用户ID platform: 'miniprogram', wechatInfo: { openid: this.data.openid, unionid: this.data.unionid, nickname: userRes.userInfo.nickName, avatar: userRes.userInfo.avatarUrl } }, success: (res) => { if (res.data.code === 0) { wx.showToast({ title: '登录确认成功', icon: 'success' }); } } }); } }); } ``` ## 网页端轮询状态示例 ```javascript // 网页端轮询检查登录状态 function checkLoginStatus(token) { const interval = setInterval(() => { fetch(`/api/qr-login/status/${token}`) .then(res => res.json()) .then(data => { if (data.code === 0) { const status = data.data.status; switch(status) { case 'pending': console.log('等待扫码...'); break; case 'scanned': console.log('已扫码,等待确认...'); break; case 'confirmed': console.log('登录成功!'); localStorage.setItem('token', data.data.accessToken); clearInterval(interval); // 跳转到主页 window.location.href = '/dashboard'; break; case 'expired': console.log('二维码已过期'); clearInterval(interval); // 重新生成二维码 generateNewQrCode(); break; } } }); }, 2000); // 每2秒检查一次 } ``` ## 状态流转 ``` pending (等待扫码) ↓ scanned (已扫码) ↓ confirmed (已确认) → 返回JWT token ↓ expired (已过期) ``` ## 特殊功能 ### 1. 微信信息自动更新 当微信小程序用户确认登录时,系统会自动更新用户的微信相关信息: - openid - unionid - 昵称(如果用户昵称为空) - 头像(如果用户头像为空) ### 2. 平台识别 系统会记录用户通过哪个平台进行的扫码登录,便于后续分析和统计。 ### 3. 安全特性 - Token有效期5分钟 - 确认后Token立即失效,防止重复使用 - 支持过期自动清理 - JWT token有效期24小时 ## 注意事项 1. **微信小程序需要配置扫码权限** 2. **确保用户已在小程序中登录** 3. **处理用户拒绝授权的情况** 4. **网页端需要定期轮询状态** 5. **处理网络异常和超时情况** ## 错误处理 常见错误码: - `token不能为空` - 请求参数缺失 - `扫码登录token不存在或已过期` - Token无效 - `用户不存在` - 用户ID无效 - `用户已被冻结` - 用户状态异常 建议在小程序端添加适当的错误提示和重试机制。