uni-app 项目鸿蒙原生适配实录:微信授权登录从"点击无反应"到真机跑通,条件编译、SDK 配置与那些官方文档没说清的坑

uniapp App 在 HarmonyOS NEXT 上接入微信授权登录的完整方案,涵盖微信开放平台注册、原生工程配置、前端代码改造三层。适用于 uni-app(Vue3)+ 独立 DevEco 原生工程的现有工作流。


一、背景与根因

现有 src/pages/Login/index.vue 的微信登录逻辑被包裹在条件编译 // #ifdef APP-PLUS || APP 中。由于 APP-HARMONYAPP-PLUS 是并列关系(不是包含),这段代码在鸿蒙端编译时被整体剔除,导致鸿蒙上点击「微信授权登录」无任何反应。

此外,微信登录在鸿蒙端的 API 参数与 App 端不同:

  • onlyAuthorizeHarmonyOS 不支持
  • univerifyStyleHarmonyOS 不支持
  • scopes:鸿蒙端无需传

微信登录在 uni-app 鸿蒙端已官方支持(微信登录:HarmonyOS Next,需 HBuilderX ≥ 4.81)。


二、微信开放平台注册(鸿蒙平台)

微信鸿蒙平台不需要 Android 那种「签名指纹」,需要的是 Bundle ID + identifier(appIdentifier) 两项。

必填值

微信表单字段 来源
Bundle ID(包名) com.****** 原生工程 AppScope/app.json5app.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 不变

  1. 登录微信开放平台 → 管理中心 → 移动应用 → 选中应用 → 详情 → 开发配置 → 编辑
  2. 在「平台信息」板块填入鸿蒙应用的 Bundle ID 与 identifier。
  3. 基础信息」上架状态:App 已上架 Android/iOS,必须选「已上架至少一个应用市场」并填写 App 备案号(工信部 ICP 备案);切勿选「未上架任何应用市场」,否则微信能力受限。
  4. 提交审核,通过后鸿蒙微信登录方可使用(微信收取一次审核费用)。

三、原生工程配置(DevEco 工程 E:\code_qnl\app-harmony

3.1 引入微信 OpenSDK

oh-package.json5dependencies 中加入:

"@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 的差异:微信官方文档要求同时配置 weixinwxopensdk。但本项目登录走 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

关键差异:去掉 onlyAuthorizescopes;鸿蒙返回结构可能不同,用 code || authResult?.code 兼容取值(首次真机联调建议 console.log(weixinLoginRes) 确认字段)。后续 loginByWeixinafterAppLogin-7755 绑定手机号跳转逻辑全部复用,无需改后端。


五、前置条件与验证

  1. HBuilderX ≥ 4.81(微信登录鸿蒙支持起始版本)。
  2. 签名/证书:当前使用调试证书(Development),仅供调试期使用。上架华为应用市场需 release 发布证书,届时 appIdentifier 仍以 AGC 中该应用的 APP ID 为准。
  3. 调试限制:鸿蒙端无自定义基座,需全量编译安装 HAP 到真机验证(模拟器无法测微信)。
  4. manifest 独立性src/manifest.jsonweixin__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 按第四章新增鸿蒙分支

posted on 2026-07-21 18:34  码间留白  阅读(14)  评论(0)    收藏  举报

导航