【HarmonyOS NEXT】鸿蒙应用接入微信分享

【HarmonyOS NEXT】鸿蒙应用接入微信分享

一、下载鸿蒙版微信开放SDK和示例DEMO

1.WeChat_Open_SDK:
在这里插入图片描述

点击跳转@tencent/wechat_open_sdk(V1.0.7)

2.官方示例DEMO下载
在这里插入图片描述
点击下载OpenSDK-1.0.0.zip
在这里插入图片描述

二、运行示例项目

微信的示例项目进行配置同步后,设置自动签名就可以直接运行成功,效果如下:
在这里插入图片描述
可以看到微信分享相关在,发送消息按钮,跳转到的页面中,共有两种分享形式,文本和图片。图片又分为网络图片uri,相册选图,和image发送三种
在这里插入图片描述
分享页面实现都在SendMessage中,在没有配置APPID的情况下,点击发送XX消息,会跳转到微信,但是会提示第三方应用信息校验失败:
在这里插入图片描述
需要在Constants.ets中进行配置:
在这里插入图片描述
微信开放平台需要注册你的鸿蒙应用,配置包名等信息。微信最麻烦的就是这个,没有提供一个测试id进行效果查看,只能先去注册你的应用。点击鸿蒙应用手册

三、copy分享相关代码进行接入

1.安装SDK依赖:
sdk版本以三方库的最新版本为准:
在这里插入图片描述

 "dependencies": {
    "@tencent/wechat_open_sdk": "1.0.3"
  }

在这里插入图片描述

分享的目标场景,目前仅支持分享到会话,分享到朋友圈功能还在开发中。
分享的目标场景,目前仅支持分享到会话,分享到朋友圈功能还在开发中。
分享的目标场景,目前仅支持分享到会话,分享到朋友圈功能还在开发中。

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 = mediaMessage

    let 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.WXImageObject
      imageObject.uri = fileUri.getUriFromPath(filePath);
	  // 放到消息对象包裹里
      let mediaMessage = new wxopensdk.WXMediaMessage()
      mediaMessage.mediaObject = imageObject
	  // 放到消息对象包裹里
      let req = new wxopensdk.SendMessageToWXReq()
      req.scene = wxopensdk.SendMessageToWXReq.WXSceneSession;
      req.message = mediaMessage

      this.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.WXImageObject
    imageObject.uri = await this.getPictureUriFromAlbum()

    let mediaMessage = new wxopensdk.WXMediaMessage()
    mediaMessage.mediaObject = imageObject

    let req = new wxopensdk.SendMessageToWXReq()
    req.scene = this.currentScene
    req.message = mediaMessage

    this.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
    // 获取资源文件夹中的图片,转化为pixelMap
    let 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);

    // 压缩图片,获取ArrayBuffer
    const 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.WXImageObject

      let buf: buffer.Buffer = buffer.from(data);
      imageObject.imageData = buf.toString('base64', 0, buf.length);

      let mediaMessage = new wxopensdk.WXMediaMessage()
      mediaMessage.mediaObject = imageObject

      let req = new wxopensdk.SendMessageToWXReq()
      req.scene = this.currentScene
      req.message = mediaMessage

      this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)
    })
  }

注意

微信分享 图片大小有限制,需要小于100kb。所以最好使用Uri的形式进行图片分享。要不然你得处理图片压缩。

3. 目前版本1.0.7,新增微信分享网页和分享小程序:

(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 = mediaMessage

this.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.RELEASE

const 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 = mediaMessage

this.wxApi.sendReq(getContext(this) as common.UIAbilityContext, req)

注意

微信分享小程序 不要使用示例的userName,否则会导致分享失败。请使用自己的目标小程序配置信息。

### 使用微信公众号向指定用户推送消息 为了实现通过微信公众号向特定用户(如女友)发送个性化消息的功能,可以采用多种技术和方法来完成这一目标。以下是具体的技术方案和技术细节。 #### 技术选型与架构设计 后端服务可以选择使用 `Spring Boot` 结合 `RestTemplate` 来构建应用逻辑[^1]: ```java // 创建 RestTemplate 实例用于发起 HTTP 请求 @Bean public RestTemplate restTemplate() { return new RestTemplate(); } ``` 对于前端部分,则主要依赖于微信公众平台提供的接口和服务来进行交互。特别是针对订阅号类型的公众账号,开发者可以通过获取用户的 OpenID 并将其作为参数传递给 API 接口从而实现定向的信息推送功能。 另外一种方式是利用 Python 编程语言配合第三方库如 `requests` 或者框架比如 Flask/Django 进行开发,并借助 GitHub Actions 定时触发脚本执行或腾讯云函数提供更便捷的服务部署选项[^2]。 #### 数据源集成 无论是哪种编程环境的选择,在实际应用场景中往往还需要接入外部的数据源以增强用户体验感。例如,天气预报信息可以直接调用公开可用的API接口获得实时更新;而温馨的情话则可以从专门的情感语料数据库里随机抽取一条记录返回给接收方[^3]。 #### 自动化工具支持 考虑到手动配置和维护整个系统可能较为繁琐复杂,因此市场上也出现了不少专注于简化此类操作流程的产品——即所谓的“微信消息定时推送自动化平台”。这类服务平台通常允许用户无需深入了解底层技术原理就能轻松创建并管理自己的定制化内容推送计划。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值