当前位置: 首页 > news >正文

HarmonyOS 应用拉起系列(二):如何拉起微信小程序

随着鸿蒙生态的不断发展,越来越多开发者希望实现应用间的无缝联动,特别是与微信小程序的交互场景,比如拉起乘车码、城市服务等。这类需求在社区中也屡见不鲜,实际开发过程中更是踩坑不断。

本文将完整分享如何在 HarmonyOS 中实现“拉起微信小程序”的能力,覆盖从申请 AppId、SDK 集成到拉起实现与常见错误排查的全过程。若你尚不清楚 HarmonyOS 中其他拉起方式,可参考本系列第一篇文章。

一、前期准备工作

1. 在微信开放平台申请 AppId 并配置鸿蒙应用信息

要拉起微信小程序,首先需要在微信开放平台申请一个鸿蒙专用的移动应用 ID(AppId),注意:

  • 提交审核前需正确填写应用信息,包括 Bundle Name、签名等;
  • 微信将收取审核费用(海外/国内账号略有不同),审核时间约为 5 个工作日;
  • 没有审核通过的 AppId 无法正常拉起微信能力

2. 集成微信 SDK 到鸿蒙项目中

微信已适配 HarmonyOS 并提供官方 SDK,你可以通过 ohpm 安装:

ohpm i @tencent/wechat_open_sdk

项目地址:@tencent/wechat_open_sdk - OHPM 三方库

注意:SDK 目前未依赖 so 库,因此支持在元服务中使用。但请注意,一般的元服务本身无法直接拉起微信应用

3. 配置 module.json5 中的 querySchemes(容易遗漏)

确保在 entry/src/main/module.json5 中声明以下字段:

"querySchemes": ["weixin","wxopensdk"
]

若未配置该字段,会导致系统无法识别 weixin:// 等 Scheme,从而拉起失败。

4. 获取目标微信小程序的原始 ID(userName)

你需要获取目标小程序的“原始 ID”,方式如下:

1.在微信中打开目标小程序(例如“乘车码”),点击右上角进入详情页;

在这里插入图片描述

2.点击「小程序资料」或「更多信息」;

在这里插入图片描述

3.复制“原始 ID”,即类似 gh_xxxxxxxx 的字符串

在这里插入图片描述

二、实现代码示例:拉起微信小程序

以下是封装后的工具类 WxSdkHelper,用于拉起指定微信小程序:

const TAG = 'WeiXinSdkOpenHelper'export class WxSdkHelper {static instance: WxSdkHelper = new WxSdkHelper()static isStartNet: boolean = trueprivate static readonly WX_BUNDLE_NAME = 'com.tencent.wechat'private constructor() {} // 单例模式/*** 拉起微信小程序* @param appId 在微信开放平台申请的鸿蒙应用 AppId* @param miniProgramId 小程序原始 ID(userName)* @param type 小程序类型(正式、开发、体验)*/async openWxMiniProgram(miniProgramId: string | undefined, appId: string,type: MINI_PROGRAM_TYPE = MINI_PROGRAM_TYPE.RELEASE, context?: common.UIAbilityContext): Promise<void> {if (!miniProgramId) {LogUtil.e(TAG, '拉起失败,小程序 ID 为空')return}if (!this.checkWxInstalled(appId)) {LogUtil.w(TAG, '微信未安装,尝试跳转应用商店')return}try {let contextP = context ?? getContext() as common.UIAbilityContextconst wxApi = wxopensdk.WXAPIFactory.createWXAPI(appId)const request = new wxopensdk.LaunchMiniProgramReq()request.userName = miniProgramIdrequest.miniprogramType = typeconst success = await wxApi.sendReq(contextP, request)success ? LogUtil.d(TAG, '拉起成功') : LogUtil.e(TAG, '拉起失败')} catch (err) {LogUtil.e(TAG, '拉起微信小程序异常', err)}}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, context?: common.UIAbilityContext): void {const want: Want = {action: 'ohos.want.action.appdetail',uri: `store://appgallery.huawei.com/app/detail?id=${bundleName}`,}const contextP = context ?? getContext() as common.UIAbilityContextcontextP.startAbility(want).then(() => LogUtil.d(TAG, '已跳转应用商店')).catch((err: BusinessError) => {LogUtil.e(TAG, `跳转应用商店失败: ${err.code} - ${err.message}`, err)})}
}enum MINI_PROGRAM_TYPE {RELEASE = 0, // 正式版DEVELOPMENT = 1, // 开发版TRIAL = 2 // 体验版
}

三、常见报错与排查指南

1. 微信登录失败:Bundle ID 校验未通过

在这里插入图片描述

  • 原因:应用配置未审核通过或填写信息有误;
  • 解决:
    • 确保微信开放平台 App 状态为“审核通过”;
    • 检查 appid + identifier + bundleName 是否一致;
    • 登录平台:微信开放平台 > 管理中心 > 移动应用 > 开发配置。

2. 拉起失败:APP_ID 或 Identifier 不一致

在这里插入图片描述

  • 原因:
    • 调用 createWXAPI 时使用了错误的 AppId
    • 微信后台配置的 Identifier 与实际应用不匹配;
  • 检查:
    • 是否将小程序的 AppId 误用为移动应用 AppId
    • IDE 自动生成的调试签名是否与实际上传一致(建议单独申请测试用 AppId)。

结语

拉起微信小程序是 HarmonyOS 应用常见的第三方能力接入场景,但涉及平台之间的权限与校验较多,建议开发者在正式开发前先完成微信开放平台的审核流程,并尽量封装通用组件,减少重复踩坑。

如果你觉得这篇文章对你有帮助,欢迎关注本系列后续内容,我们还将介绍:

  • 拉起支付宝支付
  • ArkWeb拉起支付宝支付
  • 拉起地图导航类应用等

onyOS 应用常见的第三方能力接入场景,但涉及平台之间的权限与校验较多,建议开发者在正式开发前先完成微信开放平台的审核流程,并尽量封装通用组件,减少重复踩坑。

如果你觉得这篇文章对你有帮助,欢迎关注本系列后续内容,我们还将介绍:

  • 拉起支付宝支付
  • ArkWeb拉起支付宝支付
  • 拉起地图导航类应用等
http://www.dtcms.com/a/316135.html

相关文章:

  • 前端1.0
  • 查看 Redis 某个数据库的内存占用
  • python+MySQL组合实现生成销售财务报告
  • 站在前端的角度,看鸿蒙页面布局
  • MTK-Android 系统拷贝预置资源
  • 本地使用uv管理的python项目怎么部署到服务器?
  • Next.js 链接与导航:页面间无缝切换
  • 最新安卓原生对接苹果cms App后端+app(最新优化版)
  • Spring Cloud系列—简介
  • 从循环嵌套到拓扑编排:LangGraph如何重构Agent工作流
  • 网络 —— 笔记本(主机)、主机虚拟机(Windows、Ubuntu)、手机(笔记本热点),三者进行相互ping通
  • 企业AI转型之战:Coze、Dify与FastGPT的巅峰对决
  • css动态样式
  • Linux 内存管理之 Rmap 反向映射(二)
  • 去哪儿StarRocks实践
  • 以Linux为例补充内存管理基础知识
  • 【 IPMI 内核模块】重新加载
  • BeeWorks私有化即时通讯,局域网办公安全可控
  • 光伏电站环境监测系统:绿色能源的“智慧守护者”
  • 是的,或许这就是意识!
  • 政安晨【开源人工智能硬件】【ESP乐鑫篇】 —— 详细分享小智(78/xiaozhi-esp32)AI终端开源硬件的嵌入式开发经验笔记
  • C语言---文件操作
  • 上传文件至华为云OBS
  • 分布式微服务--Nacos 集群部署
  • 【CTF】命令注入绕过技术专题:变量比较与逻辑运算
  • Spring Boot 整合 Thymeleaf
  • 【qt5_study】1.Hello world
  • 中国地级及以上城市人均GDP数据集(1990-2022年)
  • 【运动控制框架】WPF运动控制框架源码,可用于激光切割机,雕刻机,分板机,点胶机,插件机等设备,开箱即用
  • 37.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加Github Action