uni-app微信授权登录需分端实现:小程序用uni.login获取code后交后端换openid,并用uni.getUserProfile显式触发获取用户信息;App端须在manifest.json配置微信登录、AppID、AppSecret及签名;H5端必须手拼OAuth2授权URL跳转,不可调用uni.login。

uni-app 实现微信授权登录不是调一个 uni.login 就完事的,它在不同端走的是完全不同的技术路径:小程序用 uni.login + uni.getUserProfile,App 端要配 manifest 并走原生 SDK,H5 则根本不能用这些 API,必须拼 OAuth2 授权 URL 跳转。混用或跳步,必报错。
小程序端:code + 用户信息分两步拿,且交互必须显式触发
小程序里最常踩的坑是把 uni.getUserInfo 当成可用 API —— 它早在 2021 年就被微信废弃,现在调用只会静默返回空对象或报 getUserInfo:fail scope not authorized。正确流程是:
-
uni.login({ provider: 'weixin' })只负责获取临时code,这个code必须立刻传给后端换openid和session_key,前端自己存、解、重用都无效 - 用户信息必须用
uni.getUserProfile获取,且它只能由用户点击按钮等明确交互触发,不能写在onLaunch或自动逻辑里 -
desc参数是必填项,例如"用于登录并同步头像昵称",缺了就直接调用失败 - 真机/体验版才能拿到真实
code,开发者工具里常返回 mock 值或静默失败,别依赖它调试登录逻辑
App 端:manifest 配置漏一项,点击就无响应
App 打包后微信登录点不动,大概率是 manifest.json 没配全。重点检查三处:
- 「App模块配置」→「OAuth」→ 展开后必须勾选「微信登录」子项
- 下方 AppID 和 AppSecret 必须填原始值(星号显示也要重填),不能留空或只填 AppID
- Android 包名、iOS Bundle ID 必须和微信开放平台注册时填的一致,一个字符都不能差;安卓还要额外提供签名证书 SHA1,用官方签名工具生成
鸿蒙(APP-HARMONY)是独立编译条件,// #ifdef APP-PLUS 包裹的代码在鸿蒙上直接被剔除,得单独加 // #ifdef APP-HARMONY 分支,且参数不支持 onlyAuthorize 和 univerifyStyle。
H5 端:uni.login({ provider: 'weixin' }) 根本不执行,别白试了
H5 在微信内置浏览器中运行,没有微信原生环境,uni.login 和 uni.getUserInfo 全部无效,调用后既不弹窗也不报错,静默失败。唯一合法路径是手拼标准 OAuth2 授权链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=YOUR_APPID&redirect_uri=ENCODED_URL&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
关键约束有三个:
-
redirect_uri必须和公众号后台「网页授权域名」配置完全一致(只填域名,不带协议和路径),且该域名必须已完成企业/个体户 ICP 备案 -
redirect_uri必须encodeURIComponent编码,漏编码会导致微信服务器拒绝跳转 - scope 选
snsapi_base(静默授权,只换 openid)还是snsapi_userinfo(弹确认页,换用户信息),取决于公众号是否已认证;未认证的服务号填后者也会被微信自动降级,后端换用户信息时返回{"errcode":40003,"errmsg":"invalid openid"}这类模糊错误
后端才是真正的枢纽,前端 code 一过期就作废
所有端拿到的 code 都是一次性、5分钟有效期的临时凭证,必须立刻传给后端,由后端调用微信接口 https://api.weixin.qq.com/sns/oauth2/access_token 换取 access_token 和 openid。常见疏忽:
- 前端把
code存 localStorage 后反复用 —— 过期后后端换 token 会返回invalid code - 后端没做
state校验,导致 CSRF 风险(尤其 H5 回调页) - App/H5 的
code不能和小程序混用,微信对不同应用类型隔离校验
最易被忽略的点:H5 回调页 URL 必须是 HTTPS,且不能带 hash(#)片段,否则微信无法正确附带 code 参数;很多开发者本地调试时用 http://localhost,必须配合内网穿透 + 测试号,生产环境则必须上 HTTPS 且域名白名单配准。



















