HarmonyOS鸿蒙Next中从app中如何操作能启动微信小程序?
HarmonyOS鸿蒙Next中从app中如何操作能启动微信小程序?
app中有调动微信小程序的功能,原代码在安卓和苹果中都能用。但在鸿蒙next上,点了没反应。
【背景知识】
【解决方案】
可通过URL Scheme方式拉起微信小程序:
- HTTPS请求方式获取
access_token
,具体HTTP请求方法可参考getAccessToken,如果是服务商获得其中之一权限集授权后,也可通过使用authorizer_access_token代商家进行调用; - HTTPS请求方式获取generateScheme,请求成功后会返回
openlink
,openlink
即为生成的小程序scheme码; - 通过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
刚好我们这个版本吧这个需求叠加上去:
微信这边需要认证你的鸿蒙应用,具体操作参考这边文档:接入指南 / 鸿蒙接入指南
- 鸿蒙这边我处理了一个类出来你改改能直接用
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 //体验版
}
- 坑点在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);
(需根据微信官方文档调整 bundleName
和 abilityName
参数),应该可行
在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机制不兼容,建议采用以下方案:
- 使用鸿蒙的startAbility方式:
let want = {
bundleName: "com.tencent.mm",
abilityName: "com.tencent.mm.plugin.appbrand.ui.AppBrandUI",
parameters: {
"extra_key": "小程序原始ID或路径"
}
};
await globalThis.abilityContext.startAbility(want);
- 检查微信是否安装:
try {
let result = await globalThis.abilityContext.verifyPermission(
"com.tencent.mm",
want
);
if(result) {
// 微信已安装
}
} catch(error) {
console.error("微信未安装");
}
注意:微信小程序的具体参数格式需要参考微信官方提供的鸿蒙SDK文档。如果仍无法启动,可能是微信尚未完全适配HarmonyOS Next的FA机制,建议关注微信官方的鸿蒙适配进展。