ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

微信小程序登录模块全链路实战:从wx.login到自定义Token

微信小程序登录模块全链路实战:从wx.login到自定义Token 开头就不铺垫了直接说结论微信小程序登录模块是几乎所有小程序后端开发的第一道关卡。不管你的后端是 Java Spring Boot、Python FastAPI 还是 Node.js前面接的是微信原生小程序、uniapp 还是 Taro登录链路的核心都是一套东西wx.login()拿 code、后端拿 code 换 openid、再自己签发一套登录态 token。这篇文章我就从整体设计、后端实现、前端对接和常见问题排查四个维度把整个登录模块完整拆开讲适合正在做微信小程序后端开发、或者刚接手小程序前后端分离项目的同学直接照着落地。1. 登录模块的选型与整体架构设计1.1 为什么选择微信官方登录通道很多人第一反应是微信登录不就是调个接口吗但真正动手才发现选择登录方案本身就是一道分水岭。市面上常见的小程序登录方案无非三种微信官方wx.login()code2session、手机号快捷登录、以及账号密码登录。我的建议很明确凡是纯微信小程序一律优先走微信官方登录通道。原因很简单。微信官方通道不需要用户在页面上再输入任何东西注册成本为零转化率最高。账号密码登录在小程序里体验极差——手机软键盘输入、验证码倒计时、密码找回每一环都是在劝退用户。而手机号登录虽然体验也不错但触发条件多、审核严格更重要的是你依然需要 openid 来关联微信身份绕不开官方通道。这里有个细节很多人忽略wx.login()拿到的 code 是一次性的有效期只有 5 分钟而且只能用一次。这个特性直接决定了代码的设计方式——前端必须在用户即将需要登录态的时候才调wx.login()不能提前几十分钟存着备用。很多新手在这里踩坑提前在onLoad里调了wx.login()拿到 code结果用户真正触发登录动作时 code 已经过期后端拿 code 换 openid 时直接报错。1.2 前后端分离架构下的职责划分登录模块的前后端职责边界必须在写代码之前和团队对齐不然后期全是接口联调的扯皮。我通常这样划分前端职责负责调用wx.login()、把 code 传给后端、保存后端下发的 token、在后续请求的 header 里带上 token、处理 401 跳转回登录。后端职责负责接收 code、调用微信code2session接口、解析 openid 和 session_key、维护用户表、签发和管理自定义 token、提供登出和校验接口。这个划分的目的很明确前端永远不要接触 openid 和 session_key 的敏感信息。openid 虽然不算特别机密的东西但在微信生态里它就是用户身份的钥匙一旦被恶意拿到配合 session_key 可以做很多越权操作。所以前端能看到的只有后端签发的一套自定义 token微信返回的敏感字段全部沉淀在后端。还有个容易扯皮的点是登录态有效期。后端不要自己拍脑袋定一个7 天过期而是要把设计空间留给产品。我的做法是后端预留过期时间参数默认 7 天产品后续说用户总掉线就把有效期拉到 30 天说要安全就缩到 2 小时不用改核心逻辑只调配置。这就是典型的把登录模块当基础设施来做的思路。1.3 和产品经理对齐需求的关键点后端开发跟产品经理对齐登录需求时最忌讳的就是只问一句登录怎么做。我每次都会拿着一个固定的问题清单去开会这里直接分享一下第一登录时机什么时候触发登录是进入小程序就要登录还是用到个人身份时才弹这个决定了你需要在 App 启动时就调wx.login()还是懒加载式调用。第二登录态过期策略过期后是静默重新登录还是强制用户重新授权静默重登体验好但用户感知弱强制重登安全但容易造成流失。第三多端登录策略同一个微信号在多个设备同时登录是互相踢下线还是同时在线这个直接影响 token 存储结构和 session 管理策略。第四用户触达方式登录后要不要绑定手机号如果产品需要用户手机号做运营触达那登录流程里还得嵌套手机号快捷登录。这几个问题如果在设计阶段就对齐后面能少改两轮代码。说句实在话很多后端抱怨产品经理需求变来变去本质上是需求对齐的时候没把边界条件问清楚特别是登录这种横跨前后端的模块。2. 登录核心流程拆解从 wx.login() 到自定义 token2.1 wx.login() 到底返回了什么先理清最基础的一环。前端调用wx.login()后成功回调里会得到一个code这是个临时凭证长度大约 32 位看起来像一串随机字符串。这个 code 本身没有任何用户信息它只是一个兑换券——只有拿它去微信服务器换才能得到真正的用户身份。要注意的是wx.login()的调用不依赖任何用户授权行为也就是说小程序可以静默调用用户不会感知到任何弹窗。这正是微信官方通道的体验优势。但也是因为这个特性前端很容易在不恰当的时机乱调用比如在页面初始化时调一次在用户点击按钮时又调一次导致后端在极短时间内收到多个 code 的兑换请求部分 code 会重复兑换失败。我的经验是前端代码里对wx.login()做一次封装加一个单一飞出的逻辑比如用一个loginPromise变量正在登录时再调用则复用同一个 Promise。这样从源头避免了并发重复登录的问题。2.2 code2session 换取 openid 的细节后端拿到前端的 code 之后需要向微信服务器发起一次 HTTPS 请求调用code2session接口。请求地址是固定的需要带上三个参数appid、secret、js_code前两个来自微信公众平台的开发配置js_code就是前端传过来的 code。微信服务器返回的数据结构如下{ openid: oXXXXXX, session_key: YYYYYY, unionid: ZZZZZZ, errcode: 0, errmsg: ok }其中openid是用户在某个小程序内的唯一标识同一用户在同一小程序下永远是同一个 openidsession_key是会话密钥后续如果需要解密手机号、解析用户敏感信息会用到这个字段如果用户同时绑定了开放平台账号还会返回unionid用于跨小程序识别同一用户。这里我要特别强调一个安全细节session_key属于绝对敏感信息不允许下发给前端。微信官方明确要求session_key 只能在后端保存和使用。因为它可以用来解密用户加密数据一旦泄漏到前端配合伪造的 openid攻击者可以解密用户的手机号等敏感信息。这一点不光是合规要求更是技术底线的红线。另外要补一个细节code2session接口有频率限制。微信对同一个 appid 的调用频率虽然不是特别苛刻但一旦出现异常调用风暴比如前端并发导致 code 被反复兑换会触发微信的风控直接导致短时间内所有登录请求失败。所以后端在调用code2session时需要加超时控制一般 3 秒就足够和熔断降级不要让这个外部依赖拖垮整个登录链路。2.3 为什么不能直接用 openid 作为登录态这是新手最容易犯的认知错误。很多人觉得后端拿到 openid 之后直接把 openid 返回给前端前端再拿着 openid 走接口这不是简单又直接吗错而且错得很危险。openid 是用户的固定身份标识它相当于身份证号是永远不变的。如果你把它当作登录态 token 来使用相当于把身份证号直接当钥匙用任何人只要拿到你的 openid就能冒充你发起所有请求。而且 openid 一旦在网络传输中被抓包泄漏基本就是永久泄漏无法通过更改 token 来撤销。正确做法是后端拿 openid 去数据库里查或建用户记录然后签发一个自定义的登录态 token并把这个 token 返回给前端。这个 token 可以是一段随机字符串、一个 UUID或者更规范一点的 JWT。它的特点是临时性、可过期、可撤销。前端后续所有请求都带上 token后端校验 token 通过后再去数据库里查对应的用户 openid。直接用生活化类比就是openid 是你的身份证号token 是酒店房卡。身份证号固定不变但丢了就麻烦大了房卡会过期、可以被前台作废、可以换新卡丢了也不怕。登录模块的设计思路就是给每个用户发一张限时房卡而不是把身份证号直接印在卡上。3. 后端实操FastAPI 实现登录接口3.1 数据表设计后端我用 Python FastAPI 来演示因为它的异步特性很适合小程序这种 IO 密集型的请求场景而且代码量比 Spring Boot 少一半不止。如果你用 Java Spring Boot 或者 Go思路一模一样只是语言实现不同。用户表的设计核心字段我建议至少包含这些CREATE TABLE app_user ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, openid VARCHAR(64) NOT NULL COMMENT 微信openid业务唯一标识, unionid VARCHAR(64) DEFAULT NULL COMMENT 开放平台unionid, nickname VARCHAR(64) DEFAULT NULL COMMENT 昵称, avatar VARCHAR(255) DEFAULT NULL COMMENT 头像链接, phone VARCHAR(32) DEFAULT NULL COMMENT 手机号, last_login_time DATETIME DEFAULT NULL COMMENT 最后登录时间, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_openid (openid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT小程序用户表;注意到我给openid加了唯一索引。这一点极其关键因为同一用户的 openid 是固定的如果每次登录都新建用户时间长了必然出现大量僵尸账号而且用户的历史数据订单、收藏、浏览记录会因为 openid 不同而无法关联。所以登录接口里必须有先查后建的逻辑查到了就直接复用查不到才新建。另外要提醒的是不要在用户表里存密码字段——微信登录通道没有密码概念存密码是设计冗余。如果后续产品需要账号密码登录那属于另一套身份体系应该单独建一张账号表再通过外键关联到用户表而不是把密码塞进用户表里污染结构。3.2 登录接口代码实现登录接口的代码我直接放出来这是我从多个项目里沉淀出来的最小可用版本import httpx import hashlib import os from datetime import datetime, timedelta from fastapi import APIRouter, HTTPException from pydantic import BaseModel router APIRouter() # 微信配置正式项目请放到配置中心或环境变量 WX_APPID your_appid WX_SECRET your_secret CODE2SESSION_URL https://api.weixin.qq.com/sns/jscode2session class LoginRequest(BaseModel): code: str class LoginResponse(BaseModel): token: str user_id: int nickname: str | None None avatar: str | None None async def code2session(code: str) - dict: 调用微信接口把 code 换成 openid/session_key async with httpx.AsyncClient(timeout3.0) as client: resp await client.get( CODE2SESSION_URL, params{ appid: WX_APPID, secret: WX_SECRET, js_code: code, grant_type: authorization_code } ) data resp.json() if errcode in data and data[errcode] ! 0: raise HTTPException(status_code400, detailf微信登录失败: {data.get(errmsg)}) return data router.post(/api/auth/login, response_modelLoginResponse) async def login(req: LoginRequest): if not req.code: raise HTTPException(status_code400, detailcode不能为空) # 1. 拿 code 换 openid wx_data await code2session(req.code) openid wx_data[openid] session_key wx_data.get(session_key, ) # 2. 查用户不存在则创建 user await get_user_by_openid(openid) if not user: user await create_user(openidopenid, session_keysession_key) else: # 用户已存在更新 session_key 和最后登录时间 await update_user_session(user.id, session_key) # 3. 签发自定义 token token generate_token(user.id, openid) return LoginResponse( tokentoken, user_iduser.id, nicknameuser.nickname, avataruser.avatar )这里面每一步都有讲究。编码上我用 Pydantic 做请求参数校验避免前端传空 code 导致后端空指针用httpx.AsyncClient发起对微信服务器的请求加 3 秒超时避免第三方的慢响应拖垮接口。你可能会问为什么不用 requests因为 FastAPI 是异步框架在 async 函数里用同步的 requests 会阻塞事件循环导致所有接口的并发能力下降。这一点是 FastAPI 开发里很容易被忽视的性能坑。code2session返回结果里如果带errcode且非 0说明 code 要么过期、要么不合法、要么被重复使用了应该直接给前端抛出清晰的错误信息。前端拿到这个错误后会重新调wx.login()换新 code 再请求一次这就是平时说的静默重登策略的一部分。3.3 Token 生成与校验逻辑Token 生成的方案我推荐两个方向随机 token 方案和 JWT 方案。二者各有适用场景别迷信一个。随机 token 方案用secrets.token_hex(32)生成一个 64 位的十六进制字符串核心逻辑三行代码def generate_token(user_id: int, openid: str) - str: raw f{user_id}|{openid}|{os.urandom(16).hex()} return hashlib.sha256(raw.encode()).hexdigest()这种方案生成的 token 没有任何业务含义就是一个纯随机的字符串。它的特点是简单、不可逆、无法被篡改适合对安全要求高、token 需要手动失效的场景比如用户主动退出登录时删除服务端记录。配套方案是内存缓存Redis存储 token 到用户信息的映射设置过期时间。每个请求进来时后端从缓存里根据 token 查出 user_id再加载用户信息。这个方案的优点是可以主动踢人下线——服务端删掉 Redis 里的 key用户的 token 立刻失效。缺点是每次请求都要查一次 Redis增加一次网络开销。JWT 方案把用户信息加密签发出一个三段式字符串后端不需要存任何 session只要用秘钥校验签名即可。优点是天然无状态适合水平扩展的集群部署缺点是你无法主动让一个 token 失效除非引入黑名单机制这变相等于又做了一层存储。所以我个人建议单机或中小项目用随机 token Redis大型分布式项目用 JWT 黑名单。Token 校验中间件也是登录模块的核心部分。FastAPI 里的实现方式是用依赖注入from fastapi import Depends, Header async def get_current_user(authorization: str Header(...)): if not authorization.startswith(Bearer ): raise HTTPException(status_code401, detail无效的token格式) token authorization[7:] user_id await check_token(token) if user_id is None: raise HTTPException(status_code401, detailtoken已过期或无效) return await get_user_by_id(user_id) app.get(/api/user/info) async def user_info(userDepends(get_current_user)): return {nickname: user.nickname, avatar: user.avatar}这个中间件是所有需要用户身份的接口的统一入口。你会发现这样做的好处是接口只需要声明Depends(get_current_user)就自动获得了必须登录的能力全局统一不会出现某个接口漏写校验的问题。3.4 跨域处理与消息中间件小程序的请求虽然走的是微信的运行环境但它本质上仍然受到了 Web 的跨域约束。小程序端请求后端接口时后端必须在响应头里带上Access-Control-Allow-*相关的 CORS 头否则小程序在真机上会报跨域错误。FastAPI 里用 CORSMiddleware 一行就能解决from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins[*], allow_credentialsTrue, allow_methods[*], allow_headers[*], )这里扯一个后端开发的常见坑跨域问题如果本地开发从来没遇到过大概率是因为你用开发者工具的不校验合法域名模式调通了结果真机上一测就挂。微信开发者工具的不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书选项默认是勾选的很多人在工具里调通就以为完事了浑然不知真机上会因为域名校验和跨域双重问题直接黑屏。所以后端 CORS 配置不能只在本地环境生效生产环境也必须加上并且不要开后端请求头校验的 whitelist 限制得太死。另一点是如果你后端已经上了 HTTPS但仍然报跨域那要检查是不是反向代理层Nginx在转发时把 CORS 头吞了。Nginx 加这一行就行add_header Access-Control-Allow-Origin *;很多后端跨域的排查最后都定位在 Nginx 而不是应用代码上。4. 前端对接小程序端完整实现4.1 请求封装与拦截器小程序前端的代码我一般把网络层单独抽出来封装成一个request.js模块里面统一管理 token 的附加和登录态失效的处理。这一步不做后面每个页面都要重复写wx.request代码冗余不说token 过期的时候你还得在每个页面里手动跳转登录想想都痛苦。我的封装思路是这样的// request.js const BASE_URL https://your-api-domain.com function request(path, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL path, method, data, header: { Authorization: Bearer wx.getStorageSync(token), Content-Type: application/json }, success: (res) { if (res.statusCode 200) { resolve(res.data) } else if (res.statusCode 401) { // token过期需要重新登录 handleUnauthorized() reject(new Error(登录态已过期)) } else { reject(new Error(res.data.message || 请求失败)) } }, fail: (err) { if (err.errMsg err.errMsg.includes(request:fail)) { wx.showToast({ title: 网络异常请重试, icon: none }) } reject(err) } }) }) } module.exports { request, BASE_URL }注意我判断 401 后会统一调handleUnauthorized()这个函数负责重新走wx.login()流程拿到新 token 后替换缓存里的旧 token。这就是静默重登的前端实现。但这地方有个细节如果用户在短时间内连续发起多个请求会触发多个 401然后并发执行多次wx.login()造成重复登录。我的解决方案是加一个标志位isRefreshing防止并发重登let isRefreshing false let pendingTasks [] function handleUnauthorized() { if (isRefreshing) { // 正在刷新中把本次请求先挂起等新token出来后重新执行 return new Promise((resolve) pendingTasks.push(resolve)) } isRefreshing true return wx.login() .then(({ code }) request(/api/auth/login, POST, { code })) .then(({ token }) { wx.setStorageSync(token, token) pendingTasks.forEach(resolve resolve()) pendingTasks [] }) .finally(() { isRefreshing false }) }这个单飞设计是我实际项目中反复踩坑后沉淀下来的非常管用。很多小程序在高频操作时出现偶发的登录失败十有八九就是这个并发问题。4.2 登录流程编排小程序的登录编排我不建议在每个页面的onLoad里都调wx.login()。正确做法是把登录做成一个可复用的模块由业务层在真正需要登录态的时机调用。一个典型的启动流程是这样的async function appInit() { // 1. 检查本地是否有token let token wx.getStorageSync(token) if (token) { // 2. 有token先静默校验一下token是否仍然有效 try { const res await request(/api/auth/check, GET) // token有效直接进入主流程 return res.user } catch (e) { // token无效清除本地缓存重新走登录 wx.removeStorageSync(token) } } // 3. 没有token或token失效重新走wx.login const { code } await wx.login() const loginRes await request(/api/auth/login, POST, { code }) wx.setStorageSync(token, loginRes.token) return loginRes.user }这里的wx.login()在工具库里有异步和同步两种风格新版基础库支持 Promise 风格所以我上面的示例直接用了await wx.login()。如果你还在用老的回调风格记得自己包一层 Promise避免回调地狱。还有一个容易被忽略的点wx.login()的成功并不代表登录模块完成真正的成功是后端code2session兑换成功并返回自定义 token。所以前端不要以wx.login()的回调作为登录完成的标记而是要以拿到 token 为准。4.3 页面请求携带 token 的常见遗漏我在代码审查时经常看到一个重复出现的问题开发者在某个页面单独写了wx.request没有走统一的 request 封装导致 token 没带、Content-Type不对、401 不处理——所有问题一起出现。统一封装统一入口这是前端工程化里最重要的纪律之一。再补充几个前端实操经验。第一token 存到wx.setStorageSync就够用了别用globalData。因为globalData在冷启动恢复时会丢失而 Storage 是持久化的。第二不要在wx.login()的回调里直接做页面跳转应该由业务状态来驱动页面路由这样避免用户快速操作时的竞态。第三调试登录流程时打开微信开发者工具的清除全部缓存功能否则工具会把旧的 token 存在本地怎么都测不出真实的登录链路。有时候你会发现小程序 App 冷启动时用户体验很微妙如果每次启动都先静默调wx.login()那用户每次打开都会有一次无感知的后台登录如果只是本地有 token 就直接进页面那 token 失效后用户会被突然 401 弹回。理想的方案是先展示页面再在后台校验 tokentoken 失效了也尽量静默重登只在静默重登也失败时才提示用户。5. 高频问题排查实录5.1 微信小程序 10002 报错深入分析10002这个错误码在登录链路里出现的概率极高几乎每个做过小程序登录的人都会遇到。这个错误码对应的是code2session 应用密钥无效或 code 非法具体可能的原因有几个第一appid 和 secret 不匹配。比如你本地测试时拿的是测试号的 secret却用了正式环境的 appid 去请求微信直接拒绝。这种低级错误最多见于团队多人协作时配置文件被覆盖。第二code 已经使用过。微信的 code 是一次性的后端第一次调用code2session成功后再用同一个 code 调用就直接报错。所以如果你看到10002先去查一下前端是不是重复发生了wx.login()请求。第三code 已过期。前面说了 code 有效期只有 5 分钟前端如果拿到 code 后迟迟不发给后端或者发请求时网络缓慢超过 5 分钟也会报错。排查建议直接看日志。后端日志里如果只有10002而没有更详细的信息建议在调用code2session时把完整 response 打出来重点是errcode、errmsg和对应的 openid。结合日志里的时间戳可以判断是重复使用还是过期从而定位是前端逻辑还是后端逻辑的问题。5.2 code 过期、并发重复提交与幂等设计后端接口幂等性这个话题放在登录模块里特别容易出事。因为前端用户手滑快速点击登录按钮或者网络重试机制可能导致同一个 code 被并发发送到后端。第一个请求兑换成功后第二个请求再用同一个 code 必然失败。解决方案分两层。前端要做「按钮防重」登录中禁用按钮 节流。后端要做「幂等」同一个 code 在极短时间内重复请求直接返回第一次的结果而不是重复兑换。我可以给你一个轻量实现思路——用 Redis 做一个 5 分钟的code - openid token缓存映射请求进来先查缓存有就直接返回没有才去调微信接口。这个方案同时解决了重复兑换报错和接口响应慢两个问题。如果不好上 Redis可以用数据库表加唯一约束但性能会差一些。另外一个容易出问题的场景是用户在弱网环境下页面加载时机不对导致wx.login()被调用了多次前端的 code 用不完还好后端的资源却得扛着。所以我再次强调前端单飞设计的重要性它是幂等性的第一道防线。5.3 跨域与域名校验的排查思路小程序请求后端时微信官方对开发和生产环境的域名要求完全不同。开发阶段可以勾选不校验合法域名可以调通但生产环境必须在微信公众平台配置「服务器域名」并且必须是备案域名 HTTPS。我见过太多项目在开发环境调通后一上传体验版就白屏——这就是没有提前配置服务器域名。排查跨域问题我的思路是三步走先确认小程序端请求是否走到后端看后端日志有没有收到请求再确认后端 CORS 头是否正确返回用 Charles 或 Reqable 抓包看响应头里有没有Access-Control-Allow-Origin最后确认 Nginx 或网关层是否吞掉了跨域头。这三个环节逐层排查十分钟内基本可以定位。还要提醒一句小程序端和后端域名不一致时allow_credentials不能和allow_origins*同时配置否则部分浏览器会拒绝响应这是 CORS 规范里一个容易踩的坑。如果是 FastAPI 的 CORSMiddlewareallow_credentialsTrue时allow_origins必须写成具体域名列表不能是*。5.4 登录态安全加固与防刷登录接口虽然是后端里逻辑最少的接口之一但在安全维度要特别注意。我列几个自己实践过的关键点第一给登录接口加频率限制。/api/auth/login是未登录状态也能调的接口天然容易被刷。用 Redis 计数器实现单 IP 每分钟最多调 10 次超过直接拒绝。这个限流策略也可以在 Nginx 层做但 app 的请求都走后端建议在后端统一控制方便联动用户维度。第二敏感请求二次校验。登录成功后用户修改手机号、绑定银行卡之类的高危操作必须要求重新验证身份——最简单的方案是再走一次wx.login()让用户输入密码或手机号验证码而不是只依赖登录态 token。第三日志审计。登录模块的日志要包含时间、openid、IP、user-agent、code 是否成功兑换这样出了问题能追溯。不要图省事只打 login success。另外说个很多项目容易漏的小程序端session_key的更新时机。如果用户在小程序里改了微信头像session_key等信息必须在后端同步更新否则后续调用解密接口时会报session_key 失效。我的做法是每次登录都无条件更新一次 session_key成本极低但能避免一堆奇奇怪怪的「解密失败」问题。6. 实际项目里的上线检查清单所有代码写完后上线前我习惯过一遍检查清单每一条都是踩过坑换来的。微信公众平台服务器域名是否已配置HTTPS 证书是否有效请求域名是否在合法域名白名单里后端配置appid/secret 是否正确是否放到了配置中心而不是写死在代码里日志级别是否合理敏感信息session_key是否打码接口层面/api/auth/login是否限流401 处理是否统一登出接口是否让 token 失效数据库openid 唯一索引是否建立用户表是否有缓存热键问题比如同一个大 V 用户的 openid 被大量请求前端工程是否统一走了 request 封装token 是否存在 Storage冷启动是否有本地 token 校验每次我看别人项目里登录模块的问题几乎都能在这张清单上找到对应项。做后端这么久最大的感受是登录模块不是写完就完了它需要持续监测、迭代和加固。用户量的增长、微信官方接口的调整、产品策略的变动都会把这个模块牵扯进来。所以设计之初就尽量留好扩展空间别把代码写得像一次性筷子用一次就扔。我今天分享的这套设计在我经手的至少六个小程序项目里跑过从工具类小程序到电商小程序都有稳定性经受住了验证。搜索引擎里其实搜不到这种完整的全链路实战记录多数是零散的知识点。所以如果你正卡在某个登录报错上或者想重构一个不合理的登录模块这篇可以直接拿去对照着改。最后再说一句实操心得登录模块这种老生常谈的东西恰恰最值得花时间把地基打扎实。后面接支付、接消息推送、接客服会话全都依赖于这套身份体系它稳定了整个小程序的后端才能站得稳。
返回列表