登录到底在解决什么

小程序里说的「登录」,和传统网站那种输入账号密码不是一回事。你不需要用户注册账号,微信已经替你把身份认好了——小程序要做的,只是在微信和你自己的后端之间,把这个身份对应起来。

整条登录链的核心是三个身份: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 } });
}

隐私协议与用户信息保护

现在小程序上线必须配置隐私协议。用户在第一次触碰到需要收集信息的功能前,要先看到隐私保护指引,并获得用户同意。

  • 在小程序管理后台填好隐私协议,列明收集哪些信息、用来做什么。
  • 首次用到敏感接口前,弹出隐私授权弹窗。
  • 用户不同意时,不影响浏览,但相关功能不可用。
隐私合规不是上线前补的文档,而是产品流程的一部分。

很多人以为隐私协议就是后台填一段文字,其实它和产品流程是绑定的:你在什么节点弹授权弹窗、弹的是哪几项、用户拒绝后还能不能继续浏览,都要和协议里写的对得上。审核时,平台会真的点开你的小程序去走一遍这些流程,发现对不上就会打回。