软件教程 2025年08月6日
0 收藏 0 点赞 594 浏览 4577 个字
摘要 :

文章目录 一、前期准备工作 (一)微信平台备案审核 (二)下载依赖 二、封装回调类 三、创建微信管理类 四、监听事件注册 下面为大家详细介绍在鸿蒙项目里如何实现……




  • 一、前期准备工作
    • (一)微信平台备案审核
    • (二)下载依赖
  • 二、封装回调类
  • 三、创建微信管理类
  • 四、监听事件注册

下面为大家详细介绍在鸿蒙项目如何实现调起微信功能需求。在开始之前,有一些准备工作需要完成。

一、前期准备工作

(一)微信平台备案审核

要在鸿蒙项目中使用微信相关功能,首先得在微信平台进行备案审核,获取wx_app_id。获取这个ID的具体过程就不详细赘述了,大家可以通过微信平台找到相应的获取途径。

(二)下载依赖

为了能够在鸿蒙项目中调起微信的登录、分享好友、分享朋友圈等功能,需要下载微信的第三方库。这个库是实现微信功能调用的基础。

二、封装回调类

接下来,创建一个文件并构建一个类,这个类主要用于处理微信请求后的回调。当我们向微信发起功能请求后,微信会在这个类里进行统一的回调,并返回一些数据。为了区分不同的回调事件类型,在发送事件时会带上一个标识state,微信返回值中也会包含这个标识,我们可以根据返回值的state来处理对应的事件。

在这个类里,我们定义了两个数组,用于存放微信请求(Req)事件和响应(Resp)事件的回调函数,代码如下:

  // 用于存储微信请求(Req)事件的回调函数
  // 键和值都是回调函数,这里使用 Map 是为了方便管理和删除回调
  onReqCallbacks: Map<
  (req: wechatOpenSdk.BaseReq) => void, (req: wechatOpenSdk.BaseReq) => void
  > = new Map()
  // 用于存储微信响应(Resp)事件的回调函数
  // 键和值都是回调函数,同样使用 Map 便于管理和删除回调
  onRespCallbacks: Map<
  (resp: wechatOpenSdk.BaseResp) => void, (resp: wechatOpenSdk.BaseResp) => void
  > = new Map()

下面是完整的类定义:

// 导入腾讯微信开放 SDK 的所有导出内容,并将其命名为 wechatOpenSdk 命名空间
import * as wechatOpenSdk from \"@tencent/wechat_open_sdk\"

/**
 * WechatApiEventHandlerImpl 类实现了 wechatOpenSdk.WXApiEventHandler 接口,
 * 用于处理微信开放 SDK 的请求(Req)和响应(Resp)事件,同时管理事件回调函数。
 */
class WechatApiEventHandlerImpl implements wechatOpenSdk.WXApiEventHandler {

  /**
   * 注册微信请求(Req)事件的回调函数
   * @param on - 当接收到微信请求时要执行的回调函数,该函数接收一个 BaseReq 类型的参数
   */
  registerOnWXReqCallback(on: (resp: wechatOpenSdk.BaseReq) => void) {
    // 将回调函数添加到 onReqCallbacks 映射中
    this.onReqCallbacks.set(on, on)
  }

  /**
   * 注销微信请求(Req)事件的回调函数
   * @param on - 要注销的回调函数,该函数接收一个 BaseReq 类型的参数
   */
  unregisterOnWXReqCallback(on: (resp: wechatOpenSdk.BaseReq) => void) {
    // 从 onReqCallbacks 映射中删除指定的回调函数
    this.onReqCallbacks.delete(on)
  }

  /**
   * 注册微信响应(Resp)事件的回调函数
   * @param on - 当接收到微信响应时要执行的回调函数,该函数接收一个 BaseResp 类型的参数
   */
  registerOnWXRespCallback(on: (resp: wechatOpenSdk.BaseResp) => void) {
    // 将回调函数添加到 onRespCallbacks 映射中
    this.onRespCallbacks.set(on, on)
  }

  /**
   * 注销微信响应(Resp)事件的回调函数
   * @param on - 要注销的回调函数,该函数接收一个 BaseResp 类型的参数
   */
  unregisterOnWXRespCallback(on: (resp: wechatOpenSdk.BaseResp) => void) {
    // 从 onRespCallbacks 映射中删除指定的回调函数
    this.onRespCallbacks.delete(on)
  }

  /**
   * 当接收到微信请求(Req)时调用此方法
   * @param req - 接收到的微信请求对象,类型为 BaseReq
   */
  onReq(req: wechatOpenSdk.BaseReq): void {
    // 原注释:Log.i(kTag, \"onReq:%s\", JSON.stringify(req))
    // 遍历 onReqCallbacks 映射中的所有回调函数,并依次执行
    this.onReqCallbacks.forEach((on) => {
      on(req)
    })
  }

  /**
   * 当接收到微信响应(Resp)时调用此方法
   * @param resp - 接收到的微信响应对象,类型为 BaseResp
   */
  onResp(resp: wechatOpenSdk.BaseResp): void {
    // 原注释:Log.i(kTag, \"onResp:%s\", JSON.stringify(resp))
    // 遍历 onRespCallbacks 映射中的所有回调函数,并依次执行
    this.onRespCallbacks.forEach((on) => {
      on(resp)
    })
  }
}

这个类实现了wechatOpenSdk.WXApiEventHandler接口,通过它可以注册和注销请求、响应事件的回调函数,并在接收到微信的请求或响应时,执行相应的回调函数。

三、创建微信管理类

创建微信管理类,在这个类中可以实现对微信功能的调起以及注册微信返回数据的响应事件。

/**
 * WechatManager 类用于管理与微信相关的操作,如分享图片和微信登录。
 */
export class WechatManager {
    /**
     * UI 能力上下文,用于提供应用的上下文信息,可选属性。
     */
    context?: common.UIAbilityContext;

    /**
     * 创建微信 API 实例,使用全局变量中存储的微信应用 ID。
     */
    wxApi = wechatOpenSdk.WXAPIFactory.createWXAPI(GlobalVariable.WX_APP_ID);

    /**
     * 分享图片到微信对话的方法。
     * @param filePath - 要分享的图片文件的本地路径。
     */
    shareImage(filePath: string) {
        // 生成图片对象
        let imageObject = new wechatOpenSdk.WXImageObject();
        // 设置图片对象的 URI,通过文件路径获取 URI
        imageObject.uri = fileUri.getUriFromPath(filePath);

        // 生成媒体信息对象
        let mediaMessage = new wechatOpenSdk.WXMediaMessage();
        // 将图片对象放入媒体信息中
        mediaMessage.mediaObject = imageObject;

        // 创建发送微信信息请求对象
        let req = new wechatOpenSdk.SendMessageToWXReq();
        // 设置分享场景为分享到对话
        req.scene = wechatOpenSdk.SendMessageToWXReq.WXSceneSession;
        // 将媒体信息设置到请求对象中
        req.message = mediaMessage;
        // 调用微信 API 发送请求,传入上下文和请求对象
        this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req);
    }

    /**
     * 发起微信登录请求的方法。
     * @returns 返回一个 Promise,成功时解析为 true,失败时拒绝为 false。
     */
    async login(): Promise<boolean> {
        return new Promise(async (resolve, reject) => {
            // 创建发送授权请求对象
            let req = new wechatOpenSdk.SendAuthReq();
            // 设置授权范围为获取用户信息
            req.scope = \"snsapi_userinfo\"; 
            // 生成一个随机的 UUID 作为 state 参数
            const state = util.generateRandomUUID();
            // 将 state 参数设置到请求对象中
            req.state = state;
            // 调用微信 API 发送授权请求,传入上下文和请求对象
            this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req);

            // 注册微信响应回调函数
            wechatEventHandler.registerOnWXRespCallback(async (resp) => {
                // 将响应对象转换为发送授权响应对象
                const res = resp as wechatOpenSdk.SendAuthResp;
                // 检查 state 参数是否匹配且错误码为成功
                if (res.state === state && res.errCode === wechatOpenSdk.ErrCode.ERR_OK) {
                    // 这里代表已经成功调起了微信登录,只需要进行下一步的微信操作
                    resolve(true);
                }
                // 若不满足条件,拒绝 Promise 并返回 false
                reject(false);
            });
        });
    }
}

在这个类中,shareImage方法用于实现分享图片到微信对话的功能,login方法则用于发起微信登录请求。

四、监听事件注册

最后,需要在应用窗口入口的生命周期中添加事件监听。

// 冷启动模式,当是微信调起了当前应用,监听是否有对应数据
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  this.handleWeChatCallIfNeed(want);
}

// 热启动模式,微信返回到当前应用的时候,监听是否需要有对应响应
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  this.handleWeChatCallIfNeed(want);
}

private handleWeChatCallIfNeed(want: Want) {
  wechatManager.wxApi.handleWant(want, wechatEventHandler)
}

在应用冷启动(onCreate)和热启动(onNewWant)时,都会调用handleWeChatCallIfNeed方法,通过这个方法来处理微信调起应用或返回应用时的相关操作。

通过以上步骤,就可以在鸿蒙项目中实现调起微信功能了。在实际开发过程中,大家可以根据项目的具体需求,对这些代码进行进一步的优化和扩展。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6953.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

270
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

108
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

684
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

340
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

371
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

844
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号