feat:使用企业微信企业微信JS-SDK的onMenuShareAppMessage()实现点击转发自定义分享内容(TypeScript)

news2024/12/28 18:30:18

背景:企业微信应用使用企业微信JS-SDK的分享接口实现分享样式自定义
原生:
在这里插入图片描述
需要实现成:
在这里插入图片描述

企业微信JS-SDK 是企业微信面向网页开发者提供的 基于企业微信内 的网页开发工具包。
通过使用企业微信JS-SDK,网页开发者 可借助企业微信 高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用企业微信分享、扫一扫等企业微信特有的能力,为企业微信用户提供更优质的网页体验。

传送门:企微JS-SDK开发文档

目录

    • 步骤一:引入JSSDK
    • 步骤二:通过config接口注入权限验证配置
      • 注意点: url的赋值
    • 步骤三:封装分享api
      • 注意点:每次调用api都需要重新注册一遍
    • 步骤四:监听转发按钮

步骤一:引入JSSDK

<!-- 这里以jssdk1.2.0为例子,在html文件里引入jssdk -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

步骤二:通过config接口注入权限验证配置

// 示例:
wx.config({
    beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,企业微信的corpID,必须是本企业的corpID,不允许跨企业使用
    timestamp: '', // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见 附录-JS-SDK使用权限签名算法
    jsApiList: [] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
});

这里的config里的内容一般是请求后端获取,举个例子:

新建一个qwjssdk.ts文件或js文件,这里以Typescript为例,JavaScript类似。

  1. 提前将需要用到的api用一个数组存起来
const defaultApiSet = new Set([
  'onMenuShareAppMessage', // 获取“转发”按钮点击状态及自定义分享内容接口
])
/**
 * [getBrowserEnv 判断当前浏览器的环境,可忽略]
 * @return {[Object]}
 */
function getBrowserEnv(): {isWxWork: boolean, wxWorkVersion: string | null} {
  const ua = navigator.userAgent.toLowerCase()
  const isWxWork = /wxwork/i.test(ua) && /micromessenger/i.test(ua)
  // 获取企业微信版本
  let wxWorkVersion = null
  if (ua.match(/wxwork\/(\S*)\s/)) {
    wxWorkVersion = (ua.match(/wxwork\/(\S*)\s/) as object)[1]
  }
  return {
    isWxWork,
    wxWorkVersion
  }
}
  1. 定义一个方法调用签名接口和注册配置信息

    getParams是请求后端接口,获取签名,返回来的参数可以与配置信息对应上即可,一般返回(appId、timestamp、noncestr、signature)。具体可阅读JS-SDK使用权限签名算法。

    注意点: url的赋值

    为什么 url赋值 要使用encodeURIComponent()
    :因为有个业务场景需要带值为中文的请求参数,所以这里需要先编码再把url传给签名接口,否则不会走分享api。这里因项目而异。没有作者这个业务场景的话可以直接将url赋值为window.location.href.split('#')[0]

// 请求接口获取参数
async getParams() {
    const url = encodeURIComponent(window.location.href.split('#')[0]) // 注意点,因项目而已
    const res = await Api.getJssdkConfig({ launchUrl: url }) // 请求自己定义接口的方法
    if (res.code.value === 0) {
      return new Promise((resolve, reject) => {
        resolve(res.data.value)
      })
    }
  }
async initConfig() {
	const config:any = await this.getParams() 
	if (!config) {
		console.log('签名失败')
		return false
    }
    config.jsApiList = Array.from(defaultApiSet) // 将需要用到的api赋值给confi.JsAPIList
    await this.registeredConfig(config) // 去注册,将注册信息带到注册配置方法里面
}
  1. 注册配置信息
// 注册配置信息
registeredConfig(config) {
    console.log('registeredConfig config:>> ', config);
    window.wx.config({
      // 必须这么写,否则wx.invoke调用形式的jsapi会有问题
      beta: true,
      // 开启调试模式
      debug: false,
      // 必填,企业微信的corpID
      appId: config.appId,
      // 必填,生成签名的时间戳
      timestamp: +config.timestamp,
      // 必填,生成签名的随机串
      nonceStr: config.noncestr,
      // 必填,签名,见 附录-JS-SDK使用权限签名算法
      signature: config.signature,
      // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
      jsApiList: config.jsApiList
    })
    return new Promise((resolve, reject) => {
      // 如果是企业微信端的情况下执行,浏览器的情况下走else。不判断的话可忽略此判断。(需要此判断方法可以评论文章,作者看到回复。)
      if (getBrowserEnv().isWxWork) {
        window.wx.ready(() => {
          console.log('注册成功', config)
          // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
          resolve(null)
        })
        window.wx.error(err => {
          // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
          console.log('注册失败', err, config)
          reject(err)
        })
      } else {
        resolve(null)
      }
    })
  }

步骤三:封装分享api

在公共方法文件里面封装分享方法的调用。
这里就命名一个common.ts文件为例吧。

注意点:每次调用api都需要重新注册一遍

每次调用api之前都需要调用前面写的initConfig()重新注册一遍配置信息。否则分享的样式比如title、desc、imgUrl都会不生效。

// 引入qwjssdk文件,路径自己决定
import qwjssdk from '~/utils/qwjssdk'
/**
 * 通过调用jssdk能力自定义分享内容
 * */
export const wxShareAppMessage = async (shareObj: shareObj) => {
  await qwjssdk.initConfig() // 重点!!这里根据业务需求,需要每次更换路由都需要重新注册一遍,否则分享出去的样式不生效。
  if (!window.wx) {
    return
  }
  // 获取“转发”按钮点击状态及自定义分享内容接口
  window.wx.onMenuShareAppMessage({
    title: shareObj.title, // 分享标题
    desc: shareObj.desc, // 分享描述
    link: shareObj.link, // 分享链接
    imgUrl: shareObj.imgUrl, // 分享图标
    success: function () {
      // 这里可以写分享成功之后的逻辑
      console.log('SUCCESS onMenuShareAppMessage :>> ', shareObj);
    },
    error: (err)=>{
      // 这里可以写分享失败之后的逻辑
      console.log('ERR onMenuShareAppMessage :>> ', err);
    }
  });
}

这里只用到了success 和 error 的回调,其他回调可以看下面这段官网的描述:

所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:
success:接口调用成功时执行的回调函数。
fail:接口调用失败时执行的回调函数。
complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。
cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。
trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。
注意
不要尝试在 trigger 中使用 Ajax 异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用 Ajax 的回包会还没有返回。
以上几个函数都带有一个参数,类型为对象,其中除了每个接口本身返回的数据之外,还有一个通用属性err_msg,其值格式如下:
调用成功时:“xxx:ok” ,其中xxx为调用的接口名
用户取消时:“xxx:cancel”,其中xxx为调用的接口名
调用失败时:其值为具体错误信息

步骤四:监听转发按钮

在业务代码里面,引入封装的api,这里就以index.vue举例叭

import { wxShareAppMessage } from '~/utils/common'
/**
 *  调用分享api,实现分享自定义内容
 */
const toShare = () => {
  shareData.value = {
    title: '搜索',
    desc: '搜索',
    link: window.location.href,
    imgUrl: 'xxxxxxxxx.png'
  }
  wxShareAppMessage(shareData.value)
}

toShare()  // 根据自身的业务逻辑调整请求位置

执行上面代码就代表着开始监听转发按钮了。

快去尝试叭~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机的UART升级固件流程

文章目录 单片机的烧录方式ISP In-Systen Programming 系统编程ICP In-Circuit Programming 电路编程IAP In-Application Programming 应用编程BootLoader 引导程序 串口下载的重难点启动流程基于IAP设计的STM32程序启动流程 随着技术的发展&#xff0c;单片机的功能和性能得到…

AWS-S3通用存储操作,操作minio、oss、cos等所有兼容s3协议的云存储(含有大文件分片上传实现)

一、介绍 通用存储操作common包&#xff0c;支持所有兼容amazon-s3协议的云存储&#xff0c;如minio、oss、cos等&#xff0c;以后客户用啥云储存一套代码都能搞定了&#xff0c;真棒~ 二、代码结构 三、代码实现 3.1 pom.xml <?xml version"1.0" encoding&q…

平安银行广州分行立足地域文化,增强差异化权益服务软实力

立足地域文化&#xff0c;拓展差异化权益服务 瓦屋纸窗之下&#xff0c;一盏清茶&#xff0c;三五好友&#xff0c;怡然自若。中国人对茶的喜爱由来已久&#xff0c;茶文化已成为中华传统文化中一张亮丽的名片&#xff0c;而广东茶文化则是中国四大茶文化系列之一。平安银行广州…

链式哈希,一致性哈希,倒排表

在普通的查询中&#xff0c;通过关键码的比较进行查找&#xff0c;而哈希是根据关键码直接定位到数据项 哈希冲突&#xff1a;同一个关键码经过哈希函数后指向同一个记录集 链式哈希 using namespace std; #define M 13 typedef int KeyType; //typedef struct //{ // KeyTyp…

开放式耳机和封闭式耳机的区别有哪些?开放式耳机有哪些推荐?

开放式耳机和封闭式耳机的区别主要在以下几个方面&#xff1a; 设计结构&#xff1a;开放式耳机通常有一个开放的设计&#xff0c;不需要塞入耳即可收听音乐&#xff0c;同时与外部环境进行交互。封闭式耳机则是封闭的设计&#xff0c;耳机驱动单元之间是封闭和隔离的&#xf…

电子科技大学编译原理复习笔记(一):绪论

目录 前言 重点一览 语言的分类 冯诺依曼体系结构 绑定的概念 变量 虚拟机 程序单元 本章小结 前言 本复习笔记基于张老师的课堂PPT&#xff0c;供自己期末复习与学弟学妹参考用。 重点一览 语言的分类 命令式语言&#xff08;强制式语言&#xff09;&#xff1a;冯…

Activity的预览窗口StartingWindow添加

Activity的预览窗口StartingWindow添加 1、Activity组件启动2、ActivityStarter.java#startActivityInner() > 主要查看Task.java#startActivityLocked3、ActivityRecord.java#addStartingWindow到WindowManagerService.java#addWindow3.1 ActivityRecord.java#addStartingW…

一文搞定验证码(下部分)

文章目录 1.背景2.验证3.valid接口具体实现类SimpleImageCaptchaValidator 1.背景 上一篇文章讲了验证码生成的逻辑. 验证码-上篇. 大概来说就是: 服务端保存一些默认的验证码图片. 然后需要生成时创建一个包含随机字符的验证码字符图片根据随机字符和一些参数&#xff08;如…

新入职一个00后卷王,每天加班到2点,太让人崩溃了····

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

chatgpt赋能python:PythonScheme:为什么你应该考虑在你的下一个项目中使用它

Python Scheme&#xff1a;为什么你应该考虑在你的下一个项目中使用它 介绍 Python是一种常用的编程语言&#xff0c;被广泛应用于各种应用程序&#xff0c;包括Web开发、数据分析和人工智能。今天&#xff0c;我们要讨论的是Python编程语言的一种方言&#xff0c;名为“Pyth…

HR不会告诉你!Java程序员月薪8K和20K的区别!

昨天有同学问好程序员&#xff0c;为啥都是干Java程序员&#xff0c;别人可以拿20k&#xff0c;我才拿8k呢&#xff1f;为啥人家能提前转正我就得晚俩月&#xff1f;小源一听大事不妙&#xff0c;赶紧连夜整理了以下清单供大家check&#xff01; 对于刚入职场还有跳槽成功的同学…

【2023 · CANN训练营第一季】昇腾AI入门课(TensorFlow)微认证考试

1、下面哪个AI框架开发模型可以不用适配&#xff0c;直接在昇腾AI处理器上进行训练&#xff1f; A. PyTorch B. Caffe C. Mindspore D. Tensorflow C 2、使用Estimator进行脚本训练开发的一般步骤为&#xff08;A&#xff09; A. 数据预处理 --> 模型构建 --> 运行配置 -…

苏诗:医疗器械企业增长秘籍之CRM系统的 4 大能力建设

近些年&#xff0c;在国家医疗产业政策支持的推动下&#xff0c;医疗器械产业已进入蓬勃发展的“黄金时期”&#xff0c;医疗器械产品丰富度增加&#xff0c;配套服务体系逐渐完善&#xff0c;国产品牌效应进一步凸显。 医疗健康行业是纷享的战略行业之一&#xff0c;自2017年…

chatgpt如何自动生成角色prompt模板

chatgpt如何自动生成角色prompt模板 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、角色prompt模板 下面是套图的chatgpt模板&#xff0c;你可以手动的进行填写。将角色的描述填…

如何把数据从 TDengine 2.x 迁移到 3.x ?

一.迁移背景&#xff1a; 随着时序数据库&#xff08;Time Series Database&#xff09; TDengine 3.0 的发布至今&#xff0c;我们除了在持续地优化产品质量的本身&#xff0c;也一直在努力地提升用户体验。但由于 3.0 底层有大量的重构优化&#xff0c;导致开源版的 2.0 用户…

集权攻击-无权限条件下AD域凭据获取与利用分析

前言 对AD域攻击的前期&#xff0c;在没有任何域内据点或域用户凭据时&#xff0c;攻击者往往会使用用户名枚举、密码爆破、密码喷洒、Roasting等手段进行域用户凭据的窃取&#xff0c;本篇文章将针对AD域攻击时无权限环境下对域用户的信息收集及凭据窃取进行分析。 用户名枚举…

四、CNNs网络架构-深度可分离卷积

《A review of convolutional neural network architectures and their optimizations》论文指出一些高性能的卷积神经网络方法不可避免地带来巨大的计算成本&#xff0c;往往需要高性能GPU或高度优化的分布式CPU架构的支持。尽管CNNs应用向移动终端扩展&#xff0c;但大多数移…

如何在Spring Boot服务端实现公网远程调试并进行HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Go语言 -- Web开发基础学习 net/http包

前言 Go 是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变得容易。 Go语言最擅长的领域就是Web开发&#xff0c;此贴是本人入门完go语法基础后学习Web开发的学习笔记。 第一个Go Web 新建go文件hello_world.go 写入&#xff1a; package mainimport (&…

企业级信息系统开发——初探Spring AOP

文章目录 一、提出游吟诗人唱赞歌任务&#xff08;一&#xff09;采用传统方式实现&#xff08;二&#xff09;采用传统方式实现的缺点 二、采用配置方式使用AOP&#xff08;一&#xff09;创建本讲所需子包&#xff08;二&#xff09;创建杀龙任务类&#xff08;三&#xff09…