鸿蒙项目如何调用微信功能?附具体实现方法

前端 潘老师 6天前 13 ℃ (0) 扫码查看

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

一、前期准备工作

(一)微信平台备案审核

要在鸿蒙项目中使用微信相关功能,首先得在微信平台进行备案审核,获取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.panziye.com/front/17461.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】