uni-app APP微信登录“invalid code”终极解决方案
📖 前言
最近在开发 uni-app APP 端微信登录时,遇到了一系列报错,从最开始的业务参数配置缺失到40013 invalid appid,再到40029 invalid code,可谓是“九九八十一难”。好在最终全部解决,特此记录整理成文,希望能帮助遇到同样问题的开发者少走弯路。
一、错误现象
调用uni.login进行微信授权登录时,出现以下错误之一:
// 错误1:业务参数配置缺失 {"errMsg":"login:fail 业务参数配置缺失,https://ask.dcloud.net.cn/article/282","errCode":"-7"} // 错误2:invalid appid {"errcode":40013,"errmsg":"invalid appid"} // 错误3:invalid code(最常见的终极问题) {"errcode":40029,"errmsg":"invalid code, rid: xxx"}二、错误原因分析
2.1 错误1:业务参数配置缺失 (errCode: -7)
原因:manifest.json中未配置微信登录的appid或appsecret。
从 HBuilderX 3.4.18+ 开始,appsecret的可视化配置已被移除,需要手动在源码视图中添加。
2.2 错误2:invalid appid (40013)
原因:
后端请求微信接口时使用的
appid与前端的appid不一致使用了错误平台类型的
appid(如用了小程序的appid而非移动应用的appid)
2.3 错误3:invalid code (40029) ⚠️最常见、最隐蔽的错误
原因:
code被重复使用:微信code是一次性的,换取过一次access_token后就失效code已过期:code有效期只有5 分钟code与appid不匹配:生成code的appid与后端换取的appid不同接口用错:App 端错误地使用了小程序的
jscode2session接口⚠️ 签名不一致(最常见):调试基座使用的签名与微信开放平台登记的签名不一致
三、终极罪魁祸首:签名问题 🔥
3.1 为什么“真机调试”报错,“云打包”就正常?
| 运行方式 | 使用的证书 | 微信登录 |
|---|---|---|
| 标准基座(USB真机调试) | HBuilder 调试证书 | ❌ 40029 |
| 自定义基座(正式证书) | 你的正式证书 | ✅ 正常 |
| 云打包/正式包 | 你的正式证书 | ✅ 正常 |
核心原因:微信开放平台在生成code时,会校验当前 App 的包名 + 签名。你在微信开放平台登记的是正式证书的签名,而 HBuilderX 默认调试基座使用的是调试证书,二者不一致,导致微信服务器认为code无效,返回40029。
四、完整解决方案
4.1 配置manifest.json
"app-plus": { "distribute": { "sdkConfigs": { "oauth": { "weixin": { "appid": "你的微信AppID", "appsecret": "你的微信AppSecret(可选,建议配合onlyAuthorize使用)", "UniversalLinks": "https://your-domain.com/app/" } } } } }4.2 使用onlyAuthorize: true(推荐的安全做法)
前端代码:
uni.login({ provider: 'weixin', onlyAuthorize: true, // 关键:仅获取code,不直接返回用户信息 success: (res) => { console.log('获取到code:', res.code); // 将code发送给后端 uni.request({ url: 'https://your-server.com/api/wechat/login', method: 'POST', data: { code: res.code }, success: (result) => { console.log('登录成功:', result.data); } }); }, fail: (err) => { console.error('微信登录失败:', err); } });后端代码(Node.js + Express):
const APPID = '你的微信AppID'; const SECRET = '你的微信AppSecret'; app.post('/api/wechat/login', async (req, res) => { const { code } = req.body; // 1. 用code换取access_token const url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${APPID}&secret=${SECRET}&code=${code}&grant_type=authorization_code`; const response = await axios.get(url); if (response.data.errcode) { return res.status(400).json({ error: response.data.errmsg }); } const { access_token, openid, unionid } = response.data; // 2. 获取用户详细信息(可选,需要scope包含snsapi_userinfo) const userInfoUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}`; const userInfo = await axios.get(userInfoUrl); // 3. 生成自定义登录态token返回给前端 res.json({ success: true, data: userInfo.data }); });4.3 ⭐ 最关键一步:使用自定义基座调试
制作自定义基座:HBuilderX →
发行→自定义基座打包,选择正式证书运行到自定义基座:项目右键 →
运行→运行到自定义基座此后调试时 App 的签名与正式包一致,微信登录正常
五、完整排错清单 ✅
| 序号 | 检查项 | 状态 |
|---|---|---|
| 1 | manifest.json中配置了appid | ☐ |
| 2 | 使用onlyAuthorize: true安全模式 | ☐ |
| 3 | 前端appid与后端appid完全一致 | ☐ |
| 4 | 后端接口使用oauth2/access_token(不是jscode2session) | ☐ |
| 5 | code在 5 分钟内发送到后端 | ☐ |
| 6 | 同一个code只请求一次微信接口 | ☐ |
| 7 | 微信开放平台应用已审核通过 | ☐ |
| 8 | 已使用正式证书制作自定义基座进行调试 | ☐ |
| 9 | 微信开放平台登记的包名/签名与打包证书一致 | ☐ |
六、总结
微信登录的坑,90% 集中在两点:
配置问题:
appid/appsecret未配置或配置错误签名问题:调试环境的签名与微信开放平台登记的签名不一致
最佳实践:
✅ 开发阶段使用
自定义基座(正式证书)进行调试✅ 使用
onlyAuthorize: true将appsecret保存在服务端✅ 由后端统一调用微信接口,避免密钥泄露
希望这篇文章能帮你少走弯路,顺利集成微信登录功能!🎉
📎 相关资源:
uni-app 官方文档 - uni.login
微信开放平台 - 移动应用接入指南
作者:小北快快跑
时间:2026-07-23
关键词:uni-app、微信登录、40029、invalid code、自定义基座
