uni-app 项目鸿蒙原生适配实录:微信授权登录从"点击无反应"到真机跑通,条件编译、SDK 配置与那些官方文档没说清的坑
uniapp App 在 HarmonyOS NEXT 上接入微信授权登录的完整方案,涵盖微信开放平台注册、原生工程配置、前端代码改造三层。适用于 uni-app(Vue3)+ 独立 DevEco 原生工程的现有工作流。
一、背景与根因
现有 src/pages/Login/index.vue 的微信登录逻辑被包裹在条件编译 // #ifdef APP-PLUS || APP 中。由于 APP-HARMONY 与 APP-PLUS 是并列关系(不是包含),这段代码在鸿蒙端编译时被整体剔除,导致鸿蒙上点击「微信授权登录」无任何反应。
此外,微信登录在鸿蒙端的 API 参数与 App 端不同:
onlyAuthorize:HarmonyOS 不支持univerifyStyle:HarmonyOS 不支持scopes:鸿蒙端无需传
微信登录在 uni-app 鸿蒙端已官方支持(微信登录:HarmonyOS Next,需 HBuilderX ≥ 4.81)。
二、微信开放平台注册(鸿蒙平台)
微信鸿蒙平台不需要 Android 那种「签名指纹」,需要的是 Bundle ID + identifier(appIdentifier) 两项。
必填值
| 微信表单字段 | 值 | 来源 |
|---|---|---|
| Bundle ID(包名) | com.****** |
原生工程 AppScope/app.json5 → app.bundleName |
| identifier(appIdentifier) | ****** |
签名描述文件 .p7b 中的 app-identifier 字段 |
| AppID(移动应用) | wx****** |
与 src/manifest.json 中配置一致,鸿蒙沿用同一 AppID |
appIdentifier 提取方式:解析
C:\Users\<用户>\.ohos\config\default_app-harmony_*.p7b,读取其中的"app-identifier"。正常情况下它与 AppGallery Connect(AGC)中该应用的「APP ID」一致,上架前建议到 AGC → 应用信息 二次核对。
添加步骤
因已有移动应用(含 iOS/Android),走「已有应用追加鸿蒙平台」,AppID 不变:
- 登录微信开放平台 → 管理中心 → 移动应用 → 选中应用 → 详情 → 开发配置 → 编辑。
- 在「平台信息」板块填入鸿蒙应用的 Bundle ID 与 identifier。
- 「基础信息」上架状态:App 已上架 Android/iOS,必须选「已上架至少一个应用市场」并填写 App 备案号(工信部 ICP 备案);切勿选「未上架任何应用市场」,否则微信能力受限。
- 提交审核,通过后鸿蒙微信登录方可使用(微信收取一次审核费用)。
三、原生工程配置(DevEco 工程 E:\code_qnl\app-harmony)
3.1 引入微信 OpenSDK
在 oh-package.json5 的 dependencies 中加入:
"@tencent/wechat_open_sdk": "1.0.15"
3.2 配置 querySchemes 与 actions(uni-app 场景特有)
在 App module 的 entry/src/main/module.json5 中:
{
"module": {
// querySchemes 只配 weixin,切勿配 wxopensdk
"querySchemes": ["weixin"],
"abilities": [{
"skills": [{
// 微信回调需要的 action
"actions": ["action.system.home", "wxentity.action.open"]
}]
}]
}
}
⚠️ 与微信官方原生 Demo 的差异:微信官方文档要求同时配置
weixin和wxopensdk。但本项目登录走 uni-app 鸿蒙运行时,uni-app 官方实测配置wxopensdk会导致登录无回调,因此只配weixin,以 uni-app 规则为准。
四、前端代码改造(src/pages/Login/index.vue)
保持现有 // #ifdef APP-PLUS || APP 分支不变,新增独立的 APP-HARMONY 分支(因参数不同,不能与 APP-PLUS 合并):
// #ifdef APP-HARMONY
isWeixinLogging.value = true;
uni.login({
provider: 'weixin',
// 注意:鸿蒙不支持 onlyAuthorize / univerifyStyle / scopes
success: async (weixinLoginRes) => {
try {
// 鸿蒙端授权码可能位于 code 或 authResult.code,做兼容取值
const code = weixinLoginRes.code || weixinLoginRes?.authResult?.code;
if (!code) throw new Error('获取微信授权code失败');
uni.showLoading({ title: '微信登录中...' });
weixinLoginCode.value = code;
const wxLoginRes = await loginByWeixin({ code, type: 2 });
await afterAppLogin(wxLoginRes);
} catch (error) {
if (error.code === '-7755') {
navigateTo({ url: RouteName.BindMobile, props: { weixinLoginCode: weixinLoginCode.value } });
} else {
uni.showToast({ title: error.message ?? error ?? '微信登录失败', icon: 'none' });
}
} finally {
uni.hideLoading();
isWeixinLogging.value = false;
}
},
fail: (err) => {
uni.hideLoading();
isWeixinLogging.value = false;
const errorMsg = err.errMsg?.includes('cancel') ? '您取消了微信授权,请重新尝试' : '微信授权失败,请稍后再试';
uni.showToast({ title: errorMsg, icon: 'none' });
console.error('鸿蒙微信登录授权失败:', err);
},
});
// #endif
关键差异:去掉 onlyAuthorize 和 scopes;鸿蒙返回结构可能不同,用 code || authResult?.code 兼容取值(首次真机联调建议 console.log(weixinLoginRes) 确认字段)。后续 loginByWeixin、afterAppLogin、-7755 绑定手机号跳转逻辑全部复用,无需改后端。
五、前置条件与验证
- HBuilderX ≥ 4.81(微信登录鸿蒙支持起始版本)。
- 签名/证书:当前使用调试证书(Development),仅供调试期使用。上架华为应用市场需 release 发布证书,届时 appIdentifier 仍以 AGC 中该应用的 APP ID 为准。
- 调试限制:鸿蒙端无自定义基座,需全量编译安装 HAP 到真机验证(模拟器无法测微信)。
- manifest 独立性:
src/manifest.json中weixin的__platform__: ["ios","android"]是 App 端配置,鸿蒙走原生工程module.json5,两者独立、互不影响。
六、常见报错
| 报错 | 原因 | 处理 |
|---|---|---|
login:fail Provider not found |
鸿蒙未接入微信 SDK / 未配置 querySchemes | 完成第三章原生配置 |
| Bundle ID 信息校验不通过 | 微信开放平台审核中/被驳回 | 等审核通过;通过后仍报错则核对 appid+identifier+bundleId 是否匹配 |
| 第三方应用信息校验失败 | AppID 传错 或 identifier 不一致 | 确认传的是移动应用 AppID(非小程序 AppID),核对 identifier |
| 点击微信登录无反应 | 条件编译未覆盖 APP-HARMONY |
按第四章新增鸿蒙分支 |
浙公网安备 33010602011771号