登录到底在解决什么
小程序里说的「登录」,和传统网站那种输入账号密码不是一回事。你不需要用户注册账号,微信已经替你把身份认好了——小程序要做的,只是在微信和你自己的后端之间,把这个身份对应起来。
整条登录链的核心是三个身份:openid 标识用户在这个小程序里的唯一身份,unionid 跨同一开放账号下的多个应用识别同一个人,你自己发的 token 则代表用户已经在你后端登录过。前端不碰 openid 的秘密,一切换码都在后端做。
前端只负责发起,身份换发全部在后端。
- wx.login前端拿一个临时 code,交给后端换身份。
- code2session后端用 code 换 openid 与 session_key。
- token后端发自己的登录态,前端带着它访问业务接口。
- 隐私合规授权要按需、隐私协议要前置。
wx.login 与 code2session 换 openid
前端调用 wx.login 拿到一个临时 code,把它发给自己的后端;后端再拿 code 去微信服务器换 openid 和 session_key。整个过程 code 只能用一次、有效期很短。
// 前端:拿 code 发给后端
wx.login().then(res => {
return wx.request({
url: "/api/login",
method: "POST",
data: { code: res.code }
});
}).then(res => {
wx.setStorageSync("token", res.data.token);
});
// 后端:code 换 openid(示意)
async function login(code) {
const s = await wxapi.code2session(code);
const user = await db.user.findOrCreate({ openid: s.openid });
const token = signToken(user.id);
return { token };
}
记住一条红线:session_key 绝不下发到前端,它是解密用户敏感数据的钥匙,只能留在后端。
换码这一步是有讲究的:code 只能用一次,而且必须在短时间内用掉。前端拿到 code 后要尽快发给后端,别在本地攒着。如果用户在登录页停留太久才点按钮,最好重新 wx.login 拿个新 code,免得拿个过期的 code 去换,换来一个莫名报错。
自己的登录态:token 怎么维护
拿到 token 之后,前端每次请求业务接口都带上它。token 会过期,所以要设计好刷新逻辑,别让用户突然被踢回登录。
| 时机 | 做法 |
|---|---|
| 进入页面 | 先读本地 token,没有就静默 wx.login |
| 请求 401 | 用刷新 token 换发新 token,重试一次 |
| 退出登录 | 清掉本地 token,下次重新 wx.login |
// 统一请求带上 token
function request(url, data) {
return wx.request({
url: url,
data: data,
header: { Authorization: "Bearer " + wx.getStorageSync("token") }
});
}
用户授权:该问什么、不该强弹什么
登录拿到的只是匿名身份。要拿昵称、头像、手机号这些个人信息,必须走授权。现在的规则是:授权弹窗要在用户主动触发时弹,不能一进小程序就强弹一堆权限。
- 用昵称头像时再调对应接口,别启动就全要。
- 用户拒绝后要优雅降级,别卡死流程。
- 手机号这类敏感授权,要说明用途。
// 用户主动点「获取手机号」按钮后再授权
buttonGetPhone(e) {
const encrypted = e.detail.encryptedData;
wx.request({ url: "/api/bind-phone", data: { data: encrypted } });
}
隐私协议与用户信息保护
现在小程序上线必须配置隐私协议。用户在第一次触碰到需要收集信息的功能前,要先看到隐私保护指引,并获得用户同意。
- 在小程序管理后台填好隐私协议,列明收集哪些信息、用来做什么。
- 首次用到敏感接口前,弹出隐私授权弹窗。
- 用户不同意时,不影响浏览,但相关功能不可用。
隐私合规不是上线前补的文档,而是产品流程的一部分。
很多人以为隐私协议就是后台填一段文字,其实它和产品流程是绑定的:你在什么节点弹授权弹窗、弹的是哪几项、用户拒绝后还能不能继续浏览,都要和协议里写的对得上。审核时,平台会真的点开你的小程序去走一遍这些流程,发现对不上就会打回。
登录失败与静默重登
网络抖动、token 过期、用户换设备,登录总会出岔子。好的做法是把失败藏在后台:自动重试一次静默登录,成功就无感继续,失败再提示用户。
// 请求 401 后静默重登一次
async function authedRequest(url, data) {
const res = await request(url, data);
if (res.statusCode === 401) {
await silentRelogin();
return request(url, data); // 重试一次
}
return res;
}
别在一个请求里无限重试,重登失败就停下,别把用户困在循环里。给个明确的「请重新进入」提示,比一直转圈友好得多。
上线前的合规检查清单
把登录与合规收成一份上线前必过的清单。
- code 只在后端换 openid,session_key 不下发。
- token 有过期与静默刷新机制。
- 授权按需触发,不强弹、不卡流程。
- 隐私协议已配置,首次敏感操作前弹窗。
- 用户拒绝授权后仍能正常浏览。
登录做对了是无感的,合规做对了是看不见的——这恰恰是最好的状态。