feat:使用企业微信JS-SDK的onMenuShareAppMessage()实现点击转发自定义分享内容(TypeScript)
背景:企业微信应用使用企业微信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类似。
- 提前将需要用到的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 = nullif (ua.match(/wxwork\/(\S*)\s/)) {wxWorkVersion = (ua.match(/wxwork\/(\S*)\s/) as object)[1]}return {isWxWork,wxWorkVersion}
}
-
定义一个方法调用签名接口和注册配置信息
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.JsAPIListawait this.registeredConfig(config) // 去注册,将注册信息带到注册配置方法里面
}
- 注册配置信息
// 注册配置信息
registeredConfig(config) {console.log('registeredConfig config:>> ', config);window.wx.config({// 必须这么写,否则wx.invoke调用形式的jsapi会有问题beta: true,// 开启调试模式debug: false,// 必填,企业微信的corpIDappId: 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() // 根据自身的业务逻辑调整请求位置
执行上面代码就代表着开始监听转发按钮了。
快去尝试叭~
相关文章:
feat:使用企业微信JS-SDK的onMenuShareAppMessage()实现点击转发自定义分享内容(TypeScript)
背景:企业微信应用使用企业微信JS-SDK的分享接口实现分享样式自定义 原生: 需要实现成: 企业微信JS-SDK 是企业微信面向网页开发者提供的 基于企业微信内 的网页开发工具包。 通过使用企业微信JS-SDK,网页开发者 可借助企业微信…...
Java键盘事件处理及监听机制解析
文章目录 概念KeyEventKeyListener代码演示总结 概念 Java事件处理采用了委派事件模型。在这个模型中,当事件发生时,产生事件的对象将事件信息传递给事件的监听者进行处理。在Java中,事件源是产生事件的对象,比如窗口、按钮等&am…...
Git详解——安装、使用、搭建、IDEA集成
Git 看目录,篇幅挺长,越往后面越重要 目录一、git是什么?二、为什么要使用Git?三、版本控制工具四、git下载安装以及环境配置五、git基本命令六、git项目搭建七、远程仓库怎么搞?git,gitlab,github,gitee区别八、ide…...
【JavaSE】Java基础语法(二十一):内部类
文章目录 1. 内部类的基本使用2. 成员内部类3. 局部内部类4. 匿名内部类5. 匿名内部类在开发中的使用(应用) 1. 内部类的基本使用 内部类概念 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类定…...
Ceph应用
//存储类型 块存储 一对一,只能被一个主机挂载使用,数据以块为单位进行存储,典型代表: 硬盘 文件存储 一对多,能被多个主机同时挂载使用,数据以文件的形式存储的(元数据和实际数据是分开存储的),并且有…...
Oxford online English-Chair a Meeting 05/29
Part1-Welcoming attendees and starting the meeting Getting people’s attention If I could have your attention, please. Could I have your attention, please? Good afternoon, everyone. -> Good afternoon, everyone, could I have your attention, please?…...
LeetCode: 二叉树的直径(java)
二叉树的直径 leetcode 543题。原题链接题目描述解题代码二叉树专题 leetcode 543题。原题链接 543题:二叉树的直径 题目描述 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也…...
springboot+vue+java旅行旅游景点酒店预订出行订票系统eaog5
线上旅行信息管理系统要求实现以下功能: a.景点管理,展示景点的基础信息,介绍等信息。 b.酒店管理,展示酒店的基础信息,介绍等信息。 c.评价管理,可以查看景点或酒店的相关评价信息,客户消费完,…...
Linux :: 【基础指令篇 :: 用户管理:(2)】::设置用户密码(及本地Xshell 登录云服务器操作演示) :: passwd
前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C 入门到入土!!!学习合集Linux 从命令到网络再到内核!学习合集 目录索引&am…...
img[:, :, ::-1] 通俗理解
👨💻个人简介: 深度学习图像领域工作者 🎉工作总结链接:https://blog.csdn.net/qq_28949847/article/details/128552785 链接中主要是个人工作的总结,每个链接都是一些常用demo,…...
基于springboot+vue+elementui的健身房会员管理系统的
为了帮助用户更好的了解和理解程序的开发流程与相关内容,本文将通过六个章节进行内容阐述。 第一章:描述了程序的开发背景,程序运用于现实生活的目的与意义,以及程序文档的结构安排信息; 第二章:描述了程序…...
在酒店房间中的数据库索引
如果你经常去酒店,你会看到一块类似下面的标牌,指引你到达房间。这能够帮助你方便快速地找到房间,特别是当酒店拥有许多房间时。 以一个有9层的酒店为例。你的房间号是917。第一步是找到你的房间在哪一层,通常第一个数字表示楼层…...
Zookeeper学习---2、客户端API操作、客户端向服务端写数据流程
1、客户端API操作 1.1 IDEA 环境搭建 前提:保证 hadoop102、hadoop103、hadoop104 服务器上 Zookeeper 集群服务端启动。 1、创建一个工程:Zookeeper 2、添加pom文件 <?xml version"1.0" encoding"UTF-8"?> <project …...
Stack 栈的实现与应用
目录 1. 概念 2. 常用的栈的方法 2.1 方法 2.2 代码 3. 自己实现栈 3.1 构造MyStack 3.2 push() 3.3 ensureCapacity() 3.4 pop() 3.5 peek() 3.6 empty() 3.7 szie() 4. 栈的应用 1. 概念 栈(Stack)是一种数据结构&…...
CSDN中如何获得铁粉(用心篇)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
es 三 安装 es 安装kibana
目录 安装7.3.0 版本 下载地址 一个比一个快 页面测试访问 安装kibana 下载 Config/kibana.yml 配置修改开启中文 页面访问 安装7.3.0 版本 下载地址 一个比一个快 Index of /elasticsearch/ 下载中心 - Elastic 中文社区 下载中心 - Elastic 中文社区 官网下载 开箱…...
牛客HJ43迷宫问题 - 创建智能体通过策略自己找路
文章目录 问题描述思路代码C 问题描述 描述 定义一个二维数组 N*M ,如 5 5 数组下所示: int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁࿰…...
测试报告模板一
XX测试报告 文档作者: 编写日期: 项目经理: 批准日期: 文档修改纪录表 日期 制修人 修改内容描述 1. 测试项目描述 1.1 测试描述 项目名称...
抖音账号矩阵系统源码/技术开发搭建私有化部署开源
抖音SEO矩阵系统是基于抖音平台的搜索引擎优化技术的一种系统,其主要作用是通过一系列的技术手段,提高抖音视频的曝光和排名,使其获得更多的流量和粉丝。在本文中,我们将介绍抖音SEO矩阵系统的开发技术,包括系统设计、…...
OpenSSL加密解密文件
OpenSSL是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库、应用程序、SSL协议库。Openssl实现了SSL协议所需要的大多数算法。 下面介绍使用Openssl进行文件的对称加密操作。 一、Openssl支持的加密算法有: -aes-128-cbc…...
py每日spider案例之某qing创网请求接口参数和响应解密(基于deepseek_v4pro)
核心代码: """ ====================================...
如何用Python快速接入Taotoken并调用多模型API构建智能客服系统
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何用Python快速接入Taotoken并调用多模型API构建智能客服系统 为你的CRM网站或内部系统集成智能对话能力,可以显著提…...
通过Taotoken快速为现有项目增加Claude模型调用能力
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken快速为现有项目增加Claude模型调用能力 假设你正在维护一个使用OpenAI API的项目,现在需要引入Claude模型…...
ChatGPT新闻稿写作终极模板包(含敏感词实时拦截表+信源可信度打分卡+记者视角反问清单):仅开放前500份
更多请点击: https://kaifayun.com 第一章:ChatGPT新闻稿写作终极模板包概览 本模板包专为公关、市场与内容团队设计,整合了新闻稿结构化框架、语义优化提示词库、合规性检查清单及多平台适配输出模块,支持从初稿生成到终稿发布…...
量子机器学习在金融领域的应用:从核心算法到图神经网络实践
1. 量子机器学习在金融领域的应用全景与核心逻辑量子机器学习(QML)这个领域,听起来像是科幻小说里的概念,但过去几年,它已经从理论物理的殿堂,逐步走进了金融工程、风险建模这些非常“接地气”的领域。我接…...
3大止损策略拯救你的交易:backtrader实战指南
3大止损策略拯救你的交易:backtrader实战指南 【免费下载链接】backtrader Python Backtesting library for trading strategies 项目地址: https://gitcode.com/gh_mirrors/ba/backtrader 作为一名量化交易者,你是否经常面临这样的困境ÿ…...
设计岗位替代风险评估程序,分析岗位可替代性,给出创新能力补强提升方向。
一、实际应用场景描述在数字化转型加速背景下,企业和个人普遍关心以下问题:- HR 在做岗位规划时需要评估 自动化风险- 员工希望了解自己的岗位是否容易被 AI / 脚本替代- 创业者需要判断某类服务是否值得人力长期投入- 学生在做职业规划时需要参考岗位演…...
ComfyUI-WanVideoWrapper终极指南:10分钟掌握AI视频生成技术
ComfyUI-WanVideoWrapper终极指南:10分钟掌握AI视频生成技术 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper AI视频生成技术正以前所未有的速度改变内容创作方式,而Comfy…...
基于C#实现的支持五笔和拼音输入的输入法
一、核心架构设计 二、关键代码实现 1. 输入法核心类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72…...
DeepSeek-R1量化部署实战指南(含TensorRT+AWQ+GGUF三引擎对比评测)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek-R1量化部署方案概览 DeepSeek-R1 是一款高性能开源大语言模型,其量化部署旨在平衡推理精度、显存占用与吞吐效率。本章聚焦于面向生产环境的轻量化落地路径,涵盖权重量…...
