从零到一教你在HarmonyOS鸿蒙Next中实现微信分享--全流程

从零到一教你在HarmonyOS鸿蒙Next中实现微信分享–全流程

前言

大家好,我是青蓝逐码组织的君莫笑。

随着鸿蒙生态发展越来越好,微信各种功能也能随之接入了,今天教大家如何接入微信分享的所有功能,主要包括微信分享小程序,微信分享h5。此次分享只分享关键代码,最后需要大家自己学习然后合并成一个工具类哦

首先接入微信sdk

在终端输入 ohpm i @tencent/wechat_open_sdk 即可依赖微信的sdk

微信平台中创建鸿蒙应用(如已创建请跳过此处)

使用微信sdk需要应用在微信开发平台创建了鸿蒙应用,创建流程可查看链接,此处不做教学

实现微信分享前的准备工作

在module.json5中加入字段

创建WX实例(越早创建越好)

// WXApi 是第三方app和微信通信的openApi接口,其实例通过WXAPIFactory获取,需要传入应用申请到的AppID
export const WXApi = wxOpenSdk.WXAPIFactory.createWXAPI(APP_ID)

说明

  • appid和微信平台安卓应用的appid相同,创建鸿蒙应用后直接复用即可

现在开始实现微信分享的工具类(搭建底子,最后实现的完整工具类自行合并)

/**
 * 微信分享
 */
export class WxShareViewModel {
  // 此处换成真实appid
  WXApi = wxOpenSdk.WXAPIFactory.createWXAPI('')
  static instance: WxShareViewModel | null = null
  isWXApp: boolean = this.WXApi.isWXAppInstalled()

  private constructor() {

  }

  static getInstance() {
    if (!WxShareViewModel.instance) {
      WxShareViewModel.instance = new WxShareViewModel()
    }
    return WxShareViewModel.instance
  }
}

说明

  • 我推荐使用单例去实现工具类,这样比较简洁并且封装不易被污染

实现分享文本

/**
 * 分享文本
 * @param text 文本内容
 */
textShare(text: string) {
  this.isWXAPPCallback(() => {
    let textObject = new wxOpenSdk.WXTextObject
    textObject.text = text
    let mediaMessage = new wxOpenSdk.WXMediaMessage()
    mediaMessage.mediaObject = textObject
    let req = new wxOpenSdk.SendMessageToWXReq()
    req.scene = wxOpenSdk.SendMessageToWXReq.WXSceneSession
    req.message = mediaMessage
    this.WXApi.sendReq(getContext(this) as common.UIAbilityContext, req)
  })
}

实现分享h5

1. 其中需要关注的是,分享h5以及小程序携带图片,要进行下载图片buffer以及压缩到64kb以下才能进行分享,不然就会报错无反应

2. 现在先实现压缩buffer至64kb以下

3. 实现下载图片

export function loadImageUrl(url: string, successCallBack: (ImgArrayBuffer: ArrayBuffer) => void) {
  http.createHttp()
    .request(url,
      {
        method: http.RequestMethod.GET,
      },
      async (error: BusinessError, data: http.HttpResponse) => {
        if (http.ResponseCode.OK === data.responseCode) {
          let imageBuffer: ArrayBuffer = data.result as ArrayBuffer;
          const imageSource = image.createImageSource(imageBuffer)
          imageSource.createPixelMap()
            .then((pixelMap: image.PixelMap) => {
              compressedImage(pixelMap, 64)
                .then((arrayBuffer) => {
                  successCallBack(arrayBuffer)
                })
            })
        }
      })
}

说明

  • 通过createHttp下载图片,url传入实际的网络地址
  • 第二个successCallBack为成功回调函数,网络请求成功后进行回调函数处理并且传入压缩后的arrayBuffer
  • 因为华为官网例子无法直接传入arrayBuffer进行压缩,而需要pixelMap格式,因此我们需要将arrayBuffer转换为pixelMap格式

4. 实现是否安装微信回调函数

isWXAPPCallback(callback: Function) {
  if (!this.isWXApp) {
    AlertDialog.show({ message: JSON.stringify("请先安装微信") })
  } else {
    callback()
  }
}

5. 核心准备工作已经完成,我们开始实现分享h5

/**
 * 分享h5
 * @param Url 网页地址
 * @param title 标题
 * @param description 描述
 * @param imgUrl 图片网络地址
 */
h5Share(Url: string, title: string, description: string, imgUrl: string) {
  this.isWXAPPCallback(async () => {
    const webpageObject = new wxOpenSdk.WXWebpageObject()
    webpageObject.webpageUrl = Url
    const mediaMessage = new wxOpenSdk.WXMediaMessage()
    mediaMessage.mediaObject = webpageObject
    mediaMessage.title = title
    mediaMessage.description = description
    loadImageUrl(imgUrl, async (buffer) => {
      mediaMessage.thumbData = new Uint8Array(buffer)
      const req = new wxOpenSdk.SendMessageToWXReq()
      req.scene = wxOpenSdk.SendMessageToWXReq.WXSceneSession
      req.message = mediaMessage
      this.WXApi.sendReq(getContext(this) as common.UIAbilityContext, req)
    })
  })
}

说明

  • 通过是否安装微信回调函数包裹,再进行核心代码
  • 最后进行下载图片的buffer函数,传入成功回调后的函数,并将压缩后的buffer传给sdk进行分享

实现微信分享小程序

/**
 * 分享小程序
 * @param userName 小程序的原始 id(gh_xxxx形式的id)
 * @param path 小程序的 path
 * @param miniprogramType 小程序的类型, 默认正式版
 * @param title 标题
 * @param description 描述
 * @param imgUrl 网络图片地址
 */
miniProgramShare(userName: string, path: string, miniprogramType: number, title: string, description: string,
  imgUrl: string) {
  this.isWXAPPCallback(async () => {
    const miniProgramObject = new wxOpenSdk.WXMiniProgramObject()
    miniProgramObject.userName = userName
    miniProgramObject.path = path
    miniProgramObject.miniprogramType = miniprogramType
    const mediaMessage = new wxOpenSdk.WXMediaMessage()
    mediaMessage.mediaObject = miniProgramObject
    mediaMessage.title = title
    mediaMessage.description = description
    loadImageUrl(imgUrl, async (buffer) => {
      mediaMessage.thumbData = new Uint8Array(buffer)
      const req = new wxOpenSdk.SendMessageToWXReq()
      req.scene = wxOpenSdk.SendMessageToWXReq.WXSceneSession
      req.message = mediaMessage
      this.WXApi.sendReq(getContext(this) as common.UIAbilityContext, req)
    })
  })
}

说明

  • 压缩图片函数如分享h5一样
  • 大多数参数都是为接口下发

最后

以上就是本次分享给大家的一些教学了,如果这个文章对你有帮助,恳请三连。

青蓝逐码组织官网的服务器申请和域名在申请中,有结果了会第一时间分享我们的组织,后续我会持续分享一些实际项目遇到的难题解决方案,希望大家多多关注哦!


更多关于从零到一教你在HarmonyOS鸿蒙Next中实现微信分享--全流程的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于从零到一教你在HarmonyOS鸿蒙Next中实现微信分享--全流程的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中实现微信分享,首先需在微信开放平台注册应用并获取AppID。接着,在鸿蒙项目中集成微信SDK,配置config.json文件,添加微信分享权限。然后,在代码中调用微信分享API,如WeChatShare.shareText()WeChatShare.shareImage(),传入分享内容。最后,处理分享结果回调,确保分享成功或失败时有相应提示。

回到顶部