【HarmonyOS】鸿蒙应用实现微信分享-最新版
【HarmonyOS】鸿蒙应用实现微信分享-最新版
一、首先项目依赖鸿蒙版微信开放SDK和下载示例DEMO
1、WeChat_Open_SDK:
去OpenHarmony三方库中心仓,查看微信开放SDK的最新版本,然后去接入,我目前看到最新的是V1.0.14。
// 将下方链接放到浏览器打开,查看sdk版本
https://ohpm.openharmony.cn/#/cn/detail/@tencent%2Fwechat_open_sdk
(1)使用命令:
ohpm i @tencent/wechat_open_sdk
(2)或者配置进行远程仓库依赖下载:
{"name": "demo","version": "1.0.0","description": "Please describe the basic information.","main": "","author": "","license": "","dependencies": {"@tencent/wechat_open_sdk": "1.0.14"}
}
(3)内网依赖Har包:
如果你的项目是内网,不能链接三方库,也可以使用DEMO压缩包中的Har包进行本地依赖集成(但是这个Har包版本很老了,如果需要最新的,让公司商务或者运营去对接要一下最新的):
2、官方示例DEMO下载
这个压缩包里的工程好久没更新了,将下方链接放到浏览器打开就可下载:
https://dldir1.qq.com/WechatWebDev/opensdk/ohos/OpenSDK-1.0.0.zip
二、运行示例项目
微信的示例项目进行配置同步后,设置自动签名就可以直接运行成功,效果如下:
可以看到微信分享相关在,发送消息按钮,跳转到的页面中,共有两种分享形式,文本和图片。图片又分为网络图片uri,相册选图,和image发送三种:
分享页面实现都在SendMessage中,在没有配置APPID的情况下,点击发送XX消息,会跳转到微信,但是会提示第三方应用信息校验失败:
需要在Constants.ets中进行配置:
微信开放平台需要注册你的鸿蒙应用,配置包名等信息。微信最麻烦的就是这个,没有提供一个测试id进行效果查看,只能先去注册你的应用。点击鸿蒙应用手册
三、copy分享相关代码进行接入
1.安装SDK依赖:
sdk版本以三方库的最新版本为准:
"dependencies": {"@tencent/wechat_open_sdk": "1.0.14"}
2.参考SendMessage.ets中的代码,copy【文本分享】相关代码:
import * as wxopensdk from '@tencent/wechat_open_sdk';onClickSendText = async ()=>{// 创建文本分享容器对象,并且赋值文本let textObject = new wxopensdk.WXTextObject;textObject.text = kTextMessage;// 放到消息对象包裹里let mediaMessage = new wxopensdk.WXMediaMessage();mediaMessage.mediaObject = textObject;// 发送包裹,根据返回值判断成功与否let req = new wxopensdk.SendMessageToWXReq();req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession;req.message = mediaMessagelet finished = await this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)console.log("send request finished: ", finished)}
3.参考SendMessage.ets中的代码,copy【图片分享】相关代码:
(1)用网络图片发送Image消息(uri)
import * as wxopensdk from '@tencent/wechat_open_sdk';onClickSendImageByUrl = ()=>{let imageUrl = "https://img.tukuppt.com/photo-big/00/10/77/619619681755c5463.jpg"// 网络图片的url地址,下载到本地应用沙箱this.downloadImageWithUrl(imageUrl, async (imageData) => {let file: fileIo.File | undefined;let filePath = getContext(this).filesDir + `/original-${Date.now()}.jpg`;file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);fileIo.writeSync(file.fd, imageData);fileIo.closeSync(file);// 创建图片分享容器对象,并且赋值图片本地地址let imageObject = new wxopensdk.WXImageObjectimageObject.uri = fileUri.getUriFromPath(filePath);// 放到消息对象包裹里let mediaMessage = new wxopensdk.WXMediaMessage()mediaMessage.mediaObject = imageObject// 放到消息对象包裹里let req = new wxopensdk.SendMessageToWXReq()req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession;req.message = mediaMessagethis.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)})}downloadImageWithUrl(url: string,completion: (imageData: ArrayBuffer) => void) {http.createHttp().request(url,(error: BusinessError, data: http.HttpResponse) => {if (error || data.responseCode != 200) {return}completion((data.result as ArrayBuffer))})}
(2)从相册中选择图片发送Image消息
onClickSendImageByAlbum = async ()=>{let imageObject = new wxopensdk.WXImageObjectimageObject.uri = await this.getPictureUriFromAlbum()let mediaMessage = new wxopensdk.WXMediaMessage()mediaMessage.mediaObject = imageObjectlet req = new wxopensdk.SendMessageToWXReq()req.scene = this.currentScenereq.message = mediaMessagethis.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)}async getPictureUriFromAlbum(): Promise<string> {let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;PhotoSelectOptions.maxSelectNumber = 1;let photoPicker = new photoAccessHelper.PhotoViewPicker();let photoSelectResult: photoAccessHelper.PhotoSelectResult = await photoPicker.select(PhotoSelectOptions);let albumPath = photoSelectResult.photoUris[0];let context = getContext(this) as common.UIAbilityContext;let file: fileIo.File | undefined;file = fileIo.openSync(albumPath, fileIo.OpenMode.READ_ONLY);let timeStamp = Date.now();fileIo.copyFileSync(file.fd, context.filesDir + `/original-${timeStamp}.jpg`);fileIo.closeSync(file);let filePath = context.filesDir + `/original-${timeStamp}.jpg`;return fileUri.getUriFromPath(filePath);}
(3)发送Image消息(data) 【应用资源文件夹内的图片资源】
onClickSendImageByData = async ()=>{// 本地资源管理工具let resourceManager = getContext(this).resourceManager// 获取资源文件夹中的图片,转化为pixelMaplet imageArray = await resourceManager.getMediaContent($r('app.media.test0'));let pixelBuffer = imageArray.buffer as ArrayBuffer;let imageResource = image.createImageSource(pixelBuffer);let opts: image.DecodingOptions = { editable: true }let pixelMap = await imageResource.createPixelMap(opts);// 压缩图片,获取ArrayBufferconst imagePackerApi: image.ImagePacker = image.createImagePacker();let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 30 };imagePackerApi.packing(pixelMap, packOpts).then((data: ArrayBuffer) => {// 老规矩三件套,创建对象,填充,发射let imageObject = new wxopensdk.WXImageObjectlet buf: buffer.Buffer = buffer.from(data);imageObject.imageData = buf.toString('base64', 0, buf.length);let mediaMessage = new wxopensdk.WXMediaMessage()mediaMessage.mediaObject = imageObjectlet req = new wxopensdk.SendMessageToWXReq()req.scene = this.currentScenereq.message = mediaMessagethis.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)})}
注意
微信分享 图片大小有限制,需要小于100kb。所以最好使用Uri的形式进行图片分享。要不然你得处理图片压缩。
3、新增微信分享网页和分享小程序:
(1) 微信分享网页
const webpageObject = new wxopensdk.WXWebpageObject()
webpageObject.webpageUrl = "http://www.qq.com"const mediaMessage = new wxopensdk.WXMediaMessage()
mediaMessage.mediaObject = webpageObject
mediaMessage.title = "测试网页链接"
mediaMessage.description = "测试网页摘要"const thumbData = await getContext(this).resourceManager.getMediaContent($r("app.media.thumb_img"))
const thumbPixel = image.createImageSource(thumbData.buffer).createPixelMapSync()
const thumbBuffer = await image.createImagePacker().packToData(thumbPixel, { format: "image/png", quality: 100 })
mediaMessage.thumbData = new Uint8Array(thumbBuffer)const req = new wxopensdk.SendMessageToWXReq()
req.callbackAbility = kDemoEntryAbility
req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession
req.message = mediaMessagethis.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)
(2) 微信分享小程序
const miniProgramObject = new wxopensdk.WXMiniProgramObject()
miniProgramObject.userName = "gh_ac032d0848a9"
miniProgramObject.path = "pages/Home/Home"
miniProgramObject.miniprogramType = wxopensdk.WXMiniProgramType.RELEASEconst mediaMessage = new wxopensdk.WXMediaMessage()
mediaMessage.mediaObject = miniProgramObject
mediaMessage.title = "测试分享小程序Title"
mediaMessage.description = "分享小程序描述信息"const thumbData = await getContext(this).resourceManager.getMediaContent($r("app.media.thumb_img2"))
const thumbPixel = image.createImageSource(thumbData.buffer).createPixelMapSync()
const thumbBuffer = await image.createImagePacker().packToData(thumbPixel, { format: "image/png", quality: 100 })
mediaMessage.thumbData = new Uint8Array(thumbBuffer)const req = new wxopensdk.SendMessageToWXReq()
req.callbackAbility = kDemoEntryAbility
req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession
req.message = mediaMessagethis.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)
3、新增内容分享到朋友圈:
private currentScene = wxopensdk.SendMessageToWXReq.WXSceneTimeline;
注意
微信分享小程序 不要使用示例的userName,否则会导致分享失败。请使用自己的目标小程序配置信息。
版本更新参考
版本号 | 更新时间 | 更新内容 |
---|---|---|
1.0.14 | 2025-05-06 15:15:44 | 在 WXWebpageObject (微信网页对象)中支持 isSecretMessage (私密消息标识)功能,用于控制消息在微信内的可见范围。 |
1.0.12 | 2025-03-25 15:09:41 | 在 SendMessageToWXReq (向微信发送消息的请求)中支持 WXSceneTimeline (朋友圈场景),实现将内容分享到朋友圈。 |
1.0.11 | 2025-03-25 15:09:41 | 修复因 AppLink 协议(应用链接协议)冲突导致的问题,避免与其他应用或系统功能冲突。 |
1.0.10 | 2025-01-14 19:04:10 | 支持通过 openLink (打开链接)方式启动微信,方便在应用内直接跳转到微信指定页面。 |
1.0.9 | 2024-12-24 14:26:45 | 新增对 WXFileObject (微信文件对象)的支持,可用于在微信中分享文件。 |
1.0.8 | 2024-12-24 14:26:45 | 修复序列化相关问题,确保数据在传输和存储过程中正确转换和恢复。 |
1.0.7 | 2024-12-24 14:26:45 | 支持 LaunchFromWXReq (从微信启动应用请求),处理从微信打开应用的场景。 |
1.0.6 | 2024-12-24 14:26:45 | 支持将 WXWebpageObject (微信网页对象)和 WXMiniProgramObject (微信小程序对象)用于 WXMediaMessage.mediaObject (微信媒体消息的媒体对象),扩展了消息内容类型。 |
1.0.5 | 2024-11-27 10:20:34 | 支持 OpenBusinessView (打开业务视图)功能,用于打开微信内的特定业务页面。 |
1.0.4 | 2024-11-27 10:20:34 | - 支持 isWXAppInstalled (检测微信是否安装)功能- 添加混淆所需的 consumer-rules (消费者规则),确保SDK代码在混淆过程中不被错误处理。 |
1.0.3 | 2024-10-31 15:36:43 | 支持 LaunchMiniProgram (启动小程序)功能,实现从应用直接跳转到指定小程序。 |
1.0.2 | 2024-10-31 15:36:43 | 修复当 startAbility (启动能力/组件)成功时,WXApi.sendReq (微信接口发送请求)不返回结果(Promise 不 resolve)的问题。 |
1.0.1 | 2024-10-09 12:28:24 | 在 BaseReq (基础请求)中新增 callbackAbility (回调能力/回调组件),优化请求回调机制。 |
1.0.0 | 2024-10-09 12:28:24 | 初始化微信开放平台SDK(WeChat OpenSDK),提供基础的微信功能支持。 |