uni-app APP微信登录“invalid code”终极解决方案

📅 2026/7/23 21:11:49 👁️ 阅读次数 📝 编程学习
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中未配置微信登录的appidappsecret

从 HBuilderX 3.4.18+ 开始,appsecret的可视化配置已被移除,需要手动在源码视图中添加。

2.2 错误2:invalid appid (40013)

原因

  • 后端请求微信接口时使用的appid与前端的appid不一致

  • 使用了错误平台类型的appid(如用了小程序的appid而非移动应用的appid

2.3 错误3:invalid code (40029) ⚠️最常见、最隐蔽的错误

原因

  1. code被重复使用:微信code是一次性的,换取过一次access_token后就失效

  2. code已过期code有效期只有5 分钟

  3. codeappid不匹配:生成codeappid与后端换取的appid不同

  4. 接口用错:App 端错误地使用了小程序的jscode2session接口

  5. ⚠️ 签名不一致(最常见)调试基座使用的签名与微信开放平台登记的签名不一致

三、终极罪魁祸首:签名问题 🔥

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 ⭐ 最关键一步:使用自定义基座调试

  1. 制作自定义基座:HBuilderX →发行自定义基座打包,选择正式证书

  2. 运行到自定义基座:项目右键 →运行运行到自定义基座

  3. 此后调试时 App 的签名与正式包一致,微信登录正常


五、完整排错清单 ✅

序号检查项状态
1manifest.json中配置了appid
2使用onlyAuthorize: true安全模式
3前端appid与后端appid完全一致
4后端接口使用oauth2/access_token(不是jscode2session
5code在 5 分钟内发送到后端
6同一个code只请求一次微信接口
7微信开放平台应用已审核通过
8已使用正式证书制作自定义基座进行调试
9微信开放平台登记的包名/签名与打包证书一致

六、总结

微信登录的坑,90% 集中在两点:

  1. 配置问题appid/appsecret未配置或配置错误

  2. 签名问题:调试环境的签名与微信开放平台登记的签名不一致

最佳实践

  • ✅ 开发阶段使用自定义基座(正式证书)进行调试

  • ✅ 使用onlyAuthorize: trueappsecret保存在服务端

  • ✅ 由后端统一调用微信接口,避免密钥泄露

希望这篇文章能帮你少走弯路,顺利集成微信登录功能!🎉

📎 相关资源

  • uni-app 官方文档 - uni.login

  • 微信开放平台 - 移动应用接入指南


作者:小北快快跑
时间:2026-07-23
关键词:uni-app、微信登录、40029、invalid code、自定义基座