大家好,我是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)
}