HarmonyOS鸿蒙Next中从app中如何操作能启动微信小程序?

HarmonyOS鸿蒙Next中从app中如何操作能启动微信小程序?

app中有调动微信小程序的功能,原代码在安卓和苹果中都能用。但在鸿蒙next上,点了没反应。

6 回复

【背景知识】

【解决方案】

可通过URL Scheme方式拉起微信小程序:

  1. HTTPS请求方式获取access_token,具体HTTP请求方法可参考getAccessToken,如果是服务商获得其中之一权限集授权后,也可通过使用authorizer_access_token代商家进行调用;
  2. HTTPS请求方式获取generateScheme,请求成功后会返回openlinkopenlink即为生成的小程序scheme码;
  3. 通过Want方式拉起小程序,示例代码如下:
const want: Want = {
  uri: 'weixin://dl/business/?t=xxxx' // 通过步骤二获取到的openlink,即小程序scheme码
}
const context = getContext(this) as common.UIAbilityContext;
context.startAbility(want).then(() => {
  // do something
  ...
  console.info(`launchMiniProgram success.`);
}).catch(() => {
  // do something
  ...
  console.info(`launchMiniProgram failed.`);
})

更多关于HarmonyOS鸿蒙Next中从app中如何操作能启动微信小程序?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


刚好我们这个版本吧这个需求叠加上去:

微信这边需要认证你的鸿蒙应用,具体操作参考这边文档:接入指南 / 鸿蒙接入指南

  1. 鸿蒙这边我处理了一个类出来你改改能直接用
export class WxSdkHelper {
  static instance: WxSdkHelper = new WxSdkHelper()
  static isStartNet: boolean = true
  private static readonly WX_BUNDLE_NAME = 'com.tencent.wechat'
  private START_NET_WX_ID: string = 'wxebdb85b307bb170f'
  private Cheng_TU_Wx_Id: string = 'wx7491e38d4317beea' //国内主体绑定微信ID

  private constructor() { //单例使用

  }

  /**
   * 打开指定微信小程序
   * @param appId 平台拉起方 appId
   * @param userName 小程序原始 ID
   * @param type 小程序类型(默认正式版)
   */
  async openWxMiniProgram(userName: string | undefined,
    type: MINI_PROGRAM_TYPE = MINI_PROGRAM_TYPE.RELEASE): Promise<void> {
    if (!userName) {
      LogUtil.e(TAG, 'openWxMiniProgram', '拉起微信小程序失败,小程序ID为空,拉起拦截:', userName)
      return
    }
    const appId: string = this.getProjectId()
    const isInstalled = this.checkWxInstalled(appId)
    if (!isInstalled) {
      LogUtil.w(TAG, '微信未安装,已尝试跳转下载页')
      return
    }

    try {
      const context = this.getContext()
      const wxApi = wxopensdk.WXAPIFactory.createWXAPI(appId)
      const request = new wxopensdk.LaunchMiniProgramReq()

      request.userName = userName
      request.miniprogramType = type

      const success = await wxApi.sendReq(context, request)

      if (success) {
        LogUtil.d(TAG, '拉起微信小程序成功', success)
      } else {
        LogUtil.e(TAG, '拉起微信小程序失败', success)
      }
    } catch (err) {
      LogUtil.e(TAG, '拉起微信小程序时发生异常', err)
    }
  }

  /**
   * @dec 根据不同的环境获取拉起的ID情况
   * @param
   * @returns
   * @date 2025/6/23
   */
  getProjectId(): string {
    WxSdkHelper.isStartNet = BuildConfigInfoHandel.configInfo?.isStartNet ?? true
    return WxSdkHelper.isStartNet ? this.START_NET_WX_ID : this.Cheng_TU_Wx_Id
  }

  /**
   * 检查微信是否安装
   * 未安装则尝试引导用户前往商店安装
   */
  private checkWxInstalled(appId: string): boolean {
    const wxApi = wxopensdk.WXAPIFactory.createWXAPI(appId)
    const installed = wxApi.isWXAppInstalled()

    if (!installed) {
      this.openAppInStore(WxSdkHelper.WX_BUNDLE_NAME)
    }

    return installed
  }

  /**
   * 跳转应用市场,打开指定包名详情页
   */
  private openAppInStore(bundleName: string): void {
    const want: Want = {
      action: 'ohos.want.action.appdetail',
      uri: `store://appgallery.huawei.com/app/detail?id=${bundleName}`,
    }

    const context = this.getContext()

    context.startAbility(want)
      .then(() => {
        LogUtil.d(TAG, '已拉起应用商店')
      })
      .catch((err: BusinessError) => {
        LogUtil.e(TAG, `拉起应用商店失败: Code=${err.code}, message=${err.message}`, err)
      })
  }

  /**
   * 获取上下文,封装容错
   */
  private getContext(): common.UIAbilityContext {
    return AppUtil.getContext() ?? (getContext() as common.UIAbilityContext)
  }
}

enum MINI_PROGRAM_TYPE {
  RELEASE = 0, //正式版
  DEVELOPMENT = 1, //开发版
  TRIAL = 2 //体验版
}
  1. 坑点在src/main/module.json5下面把这个配置好,不然你没反应

这个在微信社区问问 是微信的问题,

openLink 接口或 startAbility 隐式启动方式,并配置 flags 参数以避免系统弹窗干扰:

import { common, Want, WantConstant } from '@kit.AbilityKit';

const want: Want = {
  bundleName: 'com.tencent.wechat',
  abilityName: 'WeChatMiniProgramAbility',
  parameters: { miniProgramId: 'your_miniprogram_id' },
  flags: WantConstant.Flags.FLAG_START_WITHOUT_TIPS // 跳过弹窗
};
this.context.startAbility(want);

(需根据微信官方文档调整 bundleNameabilityName 参数),应该可行

在HarmonyOS Next中,通过Ability的startAbility()方法可启动微信小程序。需构造包含微信小程序参数的Operation对象:

Operation operation = new Intent.OperationBuilder()
    .withBundleName("com.tencent.mm")
    .withAbilityName("com.tencent.mm.plugin.appbrand.ui.AppBrandUI")
    .withAction("android.intent.action.VIEW")
    .withUri("weixin://dl/business/?t=小程序原始ID")
    .build();

startAbility(operation);

需替换"小程序原始ID"为目标小程序ID。微信需已安装且版本支持小程序功能。

在HarmonyOS Next中启动微信小程序,需要使用鸿蒙特有的FA(Feature Ability)机制。目前鸿蒙Next与Android的Intent机制不兼容,建议采用以下方案:

  1. 使用鸿蒙的startAbility方式:
let want = {
    bundleName: "com.tencent.mm",
    abilityName: "com.tencent.mm.plugin.appbrand.ui.AppBrandUI",
    parameters: {
        "extra_key": "小程序原始ID或路径"
    }
};
await globalThis.abilityContext.startAbility(want);
  1. 检查微信是否安装:
try {
    let result = await globalThis.abilityContext.verifyPermission(
        "com.tencent.mm", 
        want
    );
    if(result) {
        // 微信已安装
    }
} catch(error) {
    console.error("微信未安装");
}

注意:微信小程序的具体参数格式需要参考微信官方提供的鸿蒙SDK文档。如果仍无法启动,可能是微信尚未完全适配HarmonyOS Next的FA机制,建议关注微信官方的鸿蒙适配进展。

回到顶部