鸿蒙项目如何调起微信功能

大家好,我是simple。我的理想是利用科技手段来解决生活中遇到的各种问题

事先准备工作

微信平台备案审核鸿蒙项目,需要有wx_app_id,应该都可以通过平台找到,过程:略

下载依赖

首先我们需要下载微信的第三方库用于调起一些微信的相关功能,比如登录、分享好友、分享朋友圈等。

封装回调类

可以创建一个文件,构建一个类

这个类是用于当我们请求了微信功能之后,微信可以在这里进行统一的回调,其中会返回一些对应的数据,如果我们需要监听某个事件,就可以在这里注册。

但由于都需要统一回调,我们可以在发送事件的时候带一个标识state,用于区分当前回调的事件类型,返回值也会带标识state,通过返回值的state进行对应的事件处理。

首先我们需要两个数组,用于存放

ts 复制代码
  // 用于存储微信请求(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()
ts 复制代码
// 导入腾讯微信开放 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)
    })
  }
}

创建微信管理类

创建微信管理类,在这里可以对微信进行调起,注册微信返回时的数据响应事件操作。

ts 复制代码
/**
 * 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);
            });
        });
    }
}

监听事件注册

在应用窗口入口的生命周期中,添加一个事件。

ts 复制代码
// 冷启动模式,当是微信调起了当前应用,监听是否有对应数据
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)
}
相关推荐
路很长OoO4 小时前
鸿蒙手写ECharts_手势惯性(条形统计图)
echarts·harmonyos·canvas
二流小码农4 小时前
鸿蒙开发:UI界面分析利器ArkUI Inspector
android·ios·harmonyos
WLY2905 小时前
HarmonyOS 5.0,使用Promise异步回调方式封装http请求
harmonyos
WLY2905 小时前
【HarmonyOS 5.0】-------分布式架构与全场景开发实战
harmonyos
冰诺iceluo5 小时前
Harmony OS5 一碰传场景开发:NFC标签识别与设备无感配网实战
harmonyos
半路下车5 小时前
【Harmony OS 5】深度解析Deveco Studio:基于ArkTS的HarmonyOS应用开发实践
harmonyos
万少6 小时前
HarmonyOS Next 弹窗系列教程(1)
前端·harmonyos
半路下车6 小时前
Harmony OS5—封装一个日志工具
harmonyos
万少6 小时前
我们又上架了一个鸿蒙项目-止欲
前端·harmonyos