扫码登入

auth/desk、二维码、轮询与 auth/mini

路径未版本化 最后更新:2026-10-25

扫码登入

流程:电脑端创建会话 → 拿到 scene 并显示小程序码 → 手机小程序扫码后把 {scene, code} 交给服务端 → 电脑轮询到 confirmed 后,用 Web 路由 /user/desk/claim?scene=... 换取浏览器会话(scene 不属于当前浏览器会话时 403;已使用或过期时 410)。scene 默认 3 分钟有效(可用 DESK_TTL_MS 调整),内存存储,重启即失效。

POST /api/auth/desk

认证:否(但会绑定到当前浏览器会话)。班级:否。用途:创建一个扫码登入会话。需要服务端已配置小程序 AppID/Secret,否则返回 400。

{
  "ok": true,
  "data": {
    "scene": "d1a2b3c4d5e6",
    "expiresIn": 180,
    "qrcodeUrl": "/api/auth/desk/d1a2b3c4d5e6/qrcode",
    "pollUrl": "/api/auth/desk/d1a2b3c4d5e6"
  }
}

服务端会把 scene 记在当前会话的 deskScene 上;领票时必须使用同一个浏览器会话,否则 /user/desk/claim 返回 403。

GET /api/auth/desk/:scene/qrcode

认证:否。班级:否。用途:生成小程序码图片。

  • 成功时直接返回 image/jpeg,不使用 JSON 信封,可直接作为 <img src>。
  • 查询参数 page 可选,默认 pages/login/login;会传给微信生成小程序码。
  • scene 不存在(unknown)返回 404;成功响应带 Cache-Control: no-store。已过期的 scene 是否还能出图取决于当前实现,客户端应以轮询接口的 expired 状态为准。

GET /api/auth/desk/:scene

认证:否。班级:否。用途:电脑轮询扫码状态。

{ "ok": true, "data": { "status": "pending", "ready": false } }

status 为 pending、confirmed、expired 或 unknown;ready 仅在 confirmed 时为 true。轮询本身不消耗 scene。

POST /api/auth/mini

认证:否。班级:否。用途:小程序扫码后回调,用微信登入凭证换 openid 并确认桌面会话。

参数类型必填说明
codestring是wx.login() 拿到的临时登入凭证;有效期约 5 分钟且一次性
scenestring否桌面会话 scene;不传或过期时仍可能返回用户令牌,但不会确认桌面登入

返回三种情况:

// 这个微信号还没绑定学号
{ "ok": true, "data": { "bound": false, "action": "needBind", "message": "这个微信号还没绑定学号,请先在网页或公众号里绑定一次", "openidHint": "oX7abc12" } }

// 账号还在审核
{ "ok": true, "data": { "bound": false, "action": "pending", "message": "账号还在等待管理员审核" } }

// 已认出用户(scene 有效时 confirmed/sceneValid 为 true)
{ "ok": true, "data": { "bound": true, "confirmed": true, "sceneValid": true, "message": "已在电脑上登入", "user": { }, "token": "<token>", "expiresIn": 2592000 } }
  • 缺少 code 返回 400;微信返回 40029/40163(凭证失效)时返回 400;小程序未配置时返回 400。
  • 即使桌面码过期,只要认出了已绑定用户,仍会返回 bound:true 和令牌,confirmed:false,方便小程序自身登入。
  • 未知 openid 不会自动建号,必须先完成学号绑定。

GET /api/auth/mini/status

认证:否。班级:否。用途:小程序配置诊断,不返回 secret。

// 未配置
{ "ok": true, "data": { "configured": false } }

// 已配置且 access_token 可用
{ "ok": true, "data": { "configured": true, "appid": "wx...", "tokenOk": true } }

// 已配置但换取 token 失败
{ "ok": true, "data": { "configured": true, "appid": "wx...", "tokenOk": false, "error": "..." } }
若本文与源码不一致,以源码和实际响应为准;发现不一致时请更新文档,而不是修改 API 行为。 学生使用指南 · 返回 API 总览