const getAppWeixinCode = () => {
uni.login({
provider: 'weixin',
onlyAuthorize: true,
success: async (res) => {
try {
let access_token = '';
let openid = '';
if (platform === 'ios' && res.authResult) {
console.log('✅ iOS 流程:使用 authResult');
access_token = res.authResult.access_token;
openid = res.authResult.openid;
}
else if (res.code) {
console.log('✅ Android 流程:使用 code');
const tokenRes = await accessToken({ code: res.code });
if (!tokenRes.data?.access_token || !tokenRes.data?.openid) {
throw new Error('token 或 openid 获取失败');
}
access_token = tokenRes.data.access_token;
openid = tokenRes.data.openid;
}
else {
throw new Error('微信授权返回结构异常');
}
const userinfoUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openid}`;
const userRes = await uni.request({ url: userinfoUrl });
if (userRes.data?.errcode) {
throw new Error(`微信接口错误:${userRes.data.errmsg}`);
}
const userInfo = normalizeWeixinUser(userRes.data);
uni.setStorageSync('user', userInfo);
uni.setStorageSync('openid', openid);
const result = await appwx({ wechat_user_info: JSON.stringify(userInfo) });
uni.setStorageSync('token', result.data.token);
console.log("data", result);
uni.showToast({ title: '登录成功', icon: 'none' });
JumpForward();
} catch (err) {
console.log('weixinerr', err);
let msg = '获取openId失败';
if (err.message?.includes('invalid')) {
msg = '授权失效,请重新微信登录';
} else if (err.message?.includes('network')) {
msg = '网络异常,请检查连接';
}
uni.showToast({ title: `${msg} ${err.message || err}`, icon: 'none', duration: 3000 });
}
},
fail(err) {
console.log('failweixinerr', err);
const msg = err.errCode === -2 ? '用户取消授权' : '微信登录初始化失败';
uni.showToast({ title: msg, icon: 'none' });
}
});
} - 发布:2026-05-18 10:51
- 更新:2026-05-18 11:06
- 阅读:21
产品分类: uniapp/App
PC开发环境操作系统: Mac
PC开发环境操作系统版本号: 1.1.0
HBuilderX类型: 正式
HBuilderX版本号: 5.06
手机系统: Android
手机系统版本号: Android 13
手机厂商: 小米
手机机型: 红米
页面类型: vue
vue版本: vue3
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
已经上线的可以正常调用,微信登录后返回app
已经上线的可以正常调用,微信登录后返回app
实际结果:
提示包名不一致
提示包名不一致
bug描述:
为什么这里我的包名和开放平台是一致的,但是还是会提示包名不一致
作为 DCloud 官方人员,我对这份 bug 反馈进行评审,反馈内容如下:
对于“安卓环境微信登录提示包名不对”这个问题,其实是一个比较经典但又常被误判的配置问题,并不属于 uni-app 框架本身的缺陷。
首先,我对反馈的完整性做一个评价:
这份反馈的问题描述相对清晰,提供的代码示例也算完整,基本还原了调用微信登录的流程。但我发现一个问题:从代码中看,你完全依赖 uni.login 并传入 onlyAuthorize: true 来获取 code,这套逻辑在 Android 和 iOS 上的基本调用方式是没错的。然而,反馈者认为这是一个 uni-app 的 bug,这个判断是不成立的。
这个问题的核心原因,极大可能就是在于应用的 签名 配置,而不仅仅是“包名”一致。
很多人会陷入一个误区:误以为在微信开放平台填对了包名,也与 manifest.json 中的配置一致就万事大吉。但实际上,微信在 Android 端的安全校验是同时检查 包名 和 应用数字签名 的。你可以这样理解:你使用开发工具通过 USB 连接手机运行调试时,默认携带的是 DCloud 官方的 Android 调试证书签名,这个签名与你在微信开放平台上填入的那个由你自己证书产生的签名,是绝对不可能相同的。
根据 uni-app 的打包机制,想要在 Android 真机上测试微信登录、支付、分享等必须进行签名的功能,你不能使用标准基座直接运行,必须制作并使用“自定义调试基座”。你需要在项目中配置好你自己的签名证书,接着打包一个携带你正确包名和签名的自定义调试基座,再进行调试。只有到了这一步,“包名与开放平台一致但仍提示不一致”的问题才会得到解决。
我再从知识库中找到了一些巩固这个依据的内容:在官方的插件说明中有明确强调,任何调用微信 OpenSDK 的场景,由于标准基座不包含第三方的依赖库,如果依然使用标准基座调试,极容易出现签名校验失败或提示找不到类的问题。其给出的解决方案正是使用自定义基座或直接正式打包测试。
另外,反馈中涉及的 uni.login 的 onlyAuthorize 参数,在知识库中有文档特意指出:旧版的配置方式要求写在 manifest.json 里的 appsecret 会直接打包进 APK,存在泄露风险(这也会间接因为包名与签名校验环境出问题导致流程失败)。你使用 onlyAuthorize: true 并只取 code 的做法其实完全正确。所以,只要底层包名与签名通过微信的校验,你现有的这套前端代码原封不动就能跑通。
所以我的结论是:此 bug 不成立,它不是框架或代码层面的问题,而是一个典型的安卓应用签名环境配置问题。
解决建议很直接:请检查你 manifest.json 中配置的包名、签名证书信息和微信开放平台后台填写的内容是否完全一致,务必通过打包 “自定义调试基座” 或 “正式打包” 的方式去进行版本来测试,即可解决这个“报包名不一致”的问题。