uni-id需手动配置云函数、微信配置及登录流程,非开箱即用;常见问题包括未上传uni-id-co云函数、config.json缺失weixin.mp配置、误用uniCloud.auth.getUser导致多端ID不统一、登录逻辑错放onLaunch破坏守卫机制。

uni-id不是开箱即用的“插件一装就通”,而是需要你明确控制云函数部署、配置注入和登录时机——它本身不自动接管路由或状态,所有关键链路都得手动串起来。
uni-id-co 云函数没上传?90% 的「登录失败」卡在这一步
很多开发者调用 uniIdCo.loginByWeixin 返回空对象或报错,根本原因不是代码写错,而是云函数压根没部署成功。
- 必须右键
uniCloud/cloudfunctions/uni-id-co文件夹 → 「上传云函数」,不能只点「上传所有 DB Schema」 - 上传前删掉
cloudfunctions/uni-id-co/node_modules(HBuilderX 会自动重装) - 检查
manifest.json中的uniCloud节点是否指向当前激活的服务空间(阿里云 / 腾讯云) - 上传后去云开发控制台确认
uni-id-co状态为「运行中」,且日志里没有Cannot find module 'uni-id'类错误
微信小程序登录拿不到 unionid?config.json 少了关键字段
小程序端调用成功但返回只有 openid、没有 unionid,大概率是 uni-config-center/uni-id/config.json 缺少微信小程序专属配置块。
- 必须显式补全
weixin.mp配置,不能只配weixin.app或留空 - 配置示例:
{
"weixin": {
"mp": {
"appid": "wx1234567890abcdef",
"appsecret": "your_appsecret_here"
}
}
}
-
uni.login({ provider: 'weixin' })必须在真机或微信开发者工具中调用,模拟器生成的code无效 -
code5 分钟过期,不能缓存复用;每次调用loginByWeixin都要传新code - 小程序后台「开发管理 → 接口安全」必须配置合法域名(如
https://xxx.service.tcloudbase.com),否则云函数请求微信接口会因 SSL 握手失败而静默中断
多端用户 ID 不统一?别用 uniCloud.auth.getUser()
默认调用 uniCloud.auth.getUser() 会导致同一微信账号在小程序、App、H5 里生成不同 uid,因为它是按登录渠道隔离的。
- 禁用默认鉴权,改用自定义 token:在云函数中查库匹配
unionid或手机号,再调用uniCloud.auth.createToken({ uid: 'U123456', exp: ... }) - 前端所有端统一用
uni.setStorageSync('token', token)存储,且只在登录成功后写入 - 全局请求拦截器强制携带:
uni.addInterceptor('request', { invoke: (opt) => { const t = uni.getStorageSync('token'); if(t) opt.header.Authorization = `Bearer ${t}`; } }) - 每个需鉴权的云函数开头加
const user = await uniCloud.auth().checkToken(),校验的是你签发的 token,不是默认 auth 的 session
登录逻辑写在 App.vue onLaunch 里?体验和守卫都会崩
官方示例把登录塞进 onLaunch,看似简单,实际破坏了两个核心机制:冷启动弹授权框体验割裂 + Vue Router 守卫无法感知登录态。
- 真实项目应拆成两步:App 启动时只做「静默检查」(读本地 token 并尝试
checkToken),不触发任何 UI - 首次访问受保护页面时,在路由守卫
router.beforeEach中判断是否有有效 token,无则跳转登录页 - 登录页完成授权后,才调用
loginByWeixin换取 token 并写入 storage,再跳回原目标页 - 注意:微信授权弹窗必须由用户主动触发(比如点击按钮),不能在
onShow或定时器里自动唤起,否则会被拦截
真正难的不是调哪个函数,而是理清「谁在什么时候生成 token」「谁负责校验它」「token 失效后前端怎么响应」这三件事的边界。很多问题表面是配置漏了,本质是把 uni-id 当成了黑盒,而它其实是个需要你亲手拧紧每颗螺丝的认证骨架。











