企业微信 => 接入第三方vue应用 第三阶段:企业微信使用JSSDK

2023-11-11

前提:我们开发的是三方应用,不是内部应用!!!!

使用说明

所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),且可信域名必须有ICP备案且在管理端验证域名归属。

  • 验证域名归属的方法在企业微信的管理后台“我的应用”里,进入应用,设置应用可信域名。

步骤一:引入JS文件

  • 在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js
<script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

在这里插入图片描述

为支持微工作台(原企业号)功能,请引用此文件。原企业微信的js文件在微工作台不生效。 jweixin-1.6.0 版本企业微信客户端暂不支持。

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

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA(single-page application)的web app可在每次url变化时进行调用)。

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

官方文档不会告诉你的内容,都是会踩的坑!!!!

  • 签名验证问题需要开发者排查的

  • 可以用http://work.weixin.qq.com/api/jsapisign页面工具进行校验签名算法,如与工具一致那么说明算法没有问题

  • 可以核查参与签名的相关参数情况

  • 常见排查点:
    1.URL:当前调用页面的URL #之前的部分,可用location.href.split('#')[0]获取
    2.jsapi_ticket:具有时效性,需要保证jsapi_ticket是有效的,不能跨企业使用,config使用企业的jsapi_ticket,agentconfig使用应用的jsapi_ticket,两种ticket不能混淆使用
    3.url应该最后有一个/的,location.href打印可以看到的,链接URL在#之前应该还有一个/的,
    4.URL保留原链接,不需要转义
    5.config参数里的nonceStr是小驼峰大写的S,签名算法里则不需要大写!!!!!(这是最大的一个坑!!!!!前端和后端都需要注意大小写)

  • 接下来贴一下代码

一:我采用的混入方法去使用这个官方SDK

  • 1.创建mixin,weChat.js
    在这里插入图片描述
// import './vant-ui';
import { buildJsSdk } from '@/api/wechat';

// config注入的是企业的身份与权限,而agentConfig注入的是应用的身份与权限。尤其是我们做为第三方服务商时,通过config无法准确区分出调用者是哪个第三方应用,而在部分场景下,又必须严谨区分出第三方应用的身份,此时即需要通过agentConfig来注入应用的身份信息。

// 调用agentConfig的注意事项

// agentConfig与config的签名算法完全一样,但是jsapi_ticket的获取方法不一样,请特别注意,查看”获取应用身份的ticket“.
// 调用wx.agentConfig之前,必须确保先成功调用wx.config. 注意:从企业微信3.0.24及以后版本(可通过企业微信UA判断版本号),无须先调用wx.config,可直接wx.agentConfig.
// 当前页面url中的域名必须是在该应用中设置的可信域名。
// agentConfig仅在企业微信2.5.0及以后版本支持,微信客户端不支持(微信开发者工具也不支持)
// 仅部分接口才需要调用agentConfig,需注意每个接口的说明

const weChatMixin = {
  data() {
    return {
      device: {
        isAndroid:
        navigator.userAgent.indexOf('Android') > -1 ||
        navigator.userAgent.indexOf('Linux') > -1,
        isIOS: !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios终端
      }
    }
  },
  methods: {
    async wxInterfaceCall(url, wxApi, fn) {
      const wx = window.wx;
      const res = await buildJsSdk({ url })

      if (res.code == 200) {
        window.console.log('签名', res.data);
        if (res.code == 200) {
          let datas = res.data.data;
          const { jsapiSignature1 } = res.data.data ? res.data.data : {};

          wx.config({
            debug: true,
            appId: jsapiSignature1.appId,
            timestamp: jsapiSignature1.timestamp.toString(),
            nonceStr: jsapiSignature1.nonceStr,
            signature: jsapiSignature1.signature,
            jsApiList: Array.isArray(wxApi) && wxApi.length > 0 ? wxApi : []
          });

          if (fn && typeof fn === 'function') {
            wx.ready(() => {
              fn(wx);
            });
          }
        }
      }
    },
    async wxAgentConfig(url, wxApi, fn) {
      const wx = window.wx;
      window.console.log('wx147', wx)
      const res = await buildJsSdk({ url })
      if (res.code == 200) {
        window.console.log('签名200以后1', res.data);
        if (res.code == 200) {
          // let datas = res.data.data;
          window.console.log('签名200以后2', res.data);
          const { jsapiSignature1, jsapiSignature2 } = res.data
            ? res.data
            : {};
          window.console.log('jsapiSignature1, jsapiSignature2', {jsapiSignature1, jsapiSignature2})
          wx.config({
            beta: true,
            debug: true,
            appId: jsapiSignature1.appId,
            timestamp: jsapiSignature1.timestamp.toString(),
            nonceStr: jsapiSignature1.nonceStr,
            signature: jsapiSignature1.signature,
            jsApiList: ['agentConfig']
          });
          wx.ready(() => {
            window.console.log('agentConfig1111')
            wx.checkJsApi({
              jsApiList: ['agentConfig'],
              success: res => {
                window.console.log('gagagagagag', res);
                wx.agentConfig({
                  corpid: jsapiSignature2.corpId, // 必填,企业微信的corpid,必须与当前登录的企业一致
                  agentid: jsapiSignature2.agentId, // 必填,企业微信的应用id (e.g. 1000247)
                  timestamp: jsapiSignature2.timestamp.toString(), // 必填,生成签名的时间戳
                  nonceStr: jsapiSignature2.nonceStr, // 必填,生成签名的随机串
                  signature: jsapiSignature2.signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
                  jsApiList:
                    Array.isArray(wxApi) && wxApi.length > 0 ? wxApi : [],
                  success: res => {
                    window.console.log('adaad1111111145');
                    if (fn && typeof fn === 'function') {
                      fn(wx);
                    }
                  }
                });
              }
            });
          });
        }
      }
    }
  }
}

export default weChatMixin

  • 2.在api里面去写上后端给你的签名接口
// jssdk签名
export const buildJsSdk = params => {
  return axios.get('/chat/provider/getSignature', {params});
};

  • 3.在你要调用微信sdk签名的页面去调用就ok了
<template>
  <div class="WechaAddClient">
    <van-cell is-link @click="show = true">展示预留出来的弹框</van-cell>
    <van-popup v-model="show" :style="{ height: '30%',width:'80%' }">
      <van-cell>待添加客户</van-cell>

      <van-row type="flex" justify="space-between">
        <van-col span="12" style="margin-left:15px">
          <span style="font-size:14px">客户微信昵称</span>
        </van-col>
        <van-col span="6">
          <van-button round type="info" size="mini" plain @click="addClient">
            添加
          </van-button>
        </van-col>
      </van-row>

    </van-popup>
  </div>
</template>
<script>
import weChatMixin from '@/mixin/weChat'

export default {
  mixins: [weChatMixin],
  data() {
    return {
      show: false,
      routeQuery: {},
    };
  },
  computed: {
    getSignUrl() {
      return this.$store.getters.getWechatUrl;
    },
  },
  mounted() {
    this.getRoute();
  },
  methods: {
    getRoute() {
      this.routeQuery = this.$route.params;
      window.console.log('加客户1', this.getSignUrl);
    },
    // 加客户
    addClient() {
      window.console.log('加客户2', this.getSignUrl, location.href.split('#')[0]);
      this.wxAgentConfig(this.getSignUrl.split('#')[0], ['navigateToAddCustomer'], wx => {
        wx.invoke('navigateToAddCustomer',
          {
            type: 1,
            userid: this.routeQuery.id
          },
          function(res) {
            // this.copyHandel(this.routeQuery.mobile) 如果我们能拿到手机号
            window.console.log(res, '------------------')
          }
        );
      })
    },

  },
};
</script>

  • 4.在你要调用微信sdk签名后,直接就跳转到了要官方添加客户的功能

二:可能会遇到的坑

1.config和agentConfig的区别

  • 所有的接口都需要config的注入权限,部分接口需要config和agentConfig的注入权限
    agentConfig - 出现的问题
1 errMsg:“agentConfig:invalid corpId more info athttps://open.work.weixin.qq.com/devtool/query?e=40013
  • 解决:第三方公司配置的公司corpId和提供的企业微信corpId保持一致
2 errMsg:“agentConfig:invalid signature more info at https://open.work.weixin.qq.com/devtool/query?e=40093
  • 解决:获取配置传的url必须是当前页面的地址
3 errMsg:“agentConfig:not match any reliable domain. more info at https://open.work.weixin.qq.com/devtool/query?e=80001
  • 解决:需要第三方配置或后台返回时设置可信域名,并下载对应的.txt文件,然后让后台把.txt文件放到当前页面对应的域名下做根域名校验
4 agentConfig 成功 但是分享的标题,内容,图片还是不生效
  • 解决:使用config进行配置

2.config - 出现的问题

1 {errCode:2,err_info:“invalid signature more info at https://open.work.weixin.qq.com/devtool/query?e=40093,errMsg}
  • 这个问题主要是要注意参数大小写是不是有问题

3.企业微信第三方应用页面,调用wx.config提示preVerifyJSAPI:fail?

  • 1.应用授权
  • 2.入参给了吗
  • 3.参数大小写是不是和文档一样的 要驼峰
  • 4.后端参数大小写是不是一样的 要小写

4.企业微信 JSAPI fail_permission denied 错误是啥意思啊?
在这里插入图片描述

自建一个应用。

1、可信域名,必须与当前域名完全一致。

2、客户联系,可调用应用那必须添加这个应用

3、agentconfig jssdk 须用这个应用去获取。

4、侧边蓝添加时,也得选择这个应用。



比如我授权登录用A应用。用的是a.qq.com为可信域名。

但需要获取用户USERIDB应用,域名是B。qq.com。

没处理好,一直是fail_permission denied。

按照上面1-4确认没错了,就拿到userid了。

在这里插入图片描述

jssdk官网链接:https://open.work.weixin.qq.com/api/doc/90001/90144/90547

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

企业微信 => 接入第三方vue应用 第三阶段:企业微信使用JSSDK 的相关文章

随机推荐

  • Python selenium webdriver 基本使用

    系列文章目录 selenium webdriver 的常用示例 文章目录 系列文章目录 selenium webdriver 的常用示例 前言 一 Pip安装 创建Bowser对象 1 Pip install selenium 2 创建Bo
  • Java开发环境搭建,保姆级JDK下载,安装,环境变量配置,一系列的完整流程的操作截图以及详细文字说明,JDK,JRE环境变量怎么配?这一篇就够了。

    Java的基础开发环境搭建 前言 提前了解一下以下知识在操作过程中会更加流畅哦 文件目录 https baike baidu com item E6 96 87 E4 BB B6 E7 9B AE E5 BD 95 7204308 fr a
  • MCS51 系列单片机的最小系统

    让单片机工作的前提是为它添加必要的外围电路以构成单片机最小系统 初学者可能对 单片机最小系统感觉很神秘 其实单片机最小系统很简单 就是能使单片机工作的最少的器件构成的系统 最小系统虽然简单 但是却是大多数控制系统所必不可少的关键部分 对于
  • AGG简介

    AGG是一个开源 高效的跨平台2D图形库 AGG的功能与GDI 的功能非常类似 但提供了比GDI 更灵活的编程接口 其产生的图形的质量也非常高 自称超过GDI 使用前AGG的准备工作 下载AGG库 它的家在http www antigrai
  • 5. 使用PyTorch预先训练的模型执行目标检测

    5 使用PyTorch预先训练的网络执行目标检测 PyTorch是什么 使用PyTorch训练第一个神经网络 使用PyTorch训练第一个卷积神经网络 使用预训练网络进行PyTorch图像分类 使用预训练网络进行PyTorch目标检测 今天
  • 记录STM32各类串口中断实验

    STM32F407VG使用cubemx LL库 波特率115200 一位停止位 无校验 单片机初始化串口一 PA8高速推挽输出 使用逻辑分析仪100M采样捕获各类串口中断触发时的波形 首先是喜闻乐见的RXNE 理论是只要串口成功接收一byt
  • Cache 和 Buffer 有什么区别

    Cache 和 Buffer 有什么区别 转载 talkwithtrend https mp weixin qq com s YsEOBVS7fXgrGXnXH1I0MQ Cache和Buffer简单的说 Cache是加速 读 而buffe
  • android自定义可缩放,移动图像裁剪框

    在实际项目中 经常要制作一个简易的图像裁剪功能 即获取一张图片 并用一个遮罩层选择目标范围并截取保存的功能 如下图所示 在此分享下该自定义视图的制作过程 需求说明 整一个视图包含一个透明的遮罩层 一个透明带白色边框的矩形 要实现的功能是 点
  • oracle 问题 :Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束

    使用mysql时使用的sql语句常有 结尾的语句 但oracle中不能出现 结尾 因为oracle解析器很严谨 不支持 结尾语句解析
  • C基础day6(2023.7.6)

    一 Xmind整理 二 课上练习 练习1 循环嵌套 三个循环结构可以任意嵌套 include
  • Python爬虫分析唯品会商品数据 +数据可视化

    目录 前言 数据来源分析 1 明确需求 2 抓包分析 通过浏览器自带工具 开发者工具 代码实现步骤 发送请求 gt 获取数据 gt 解析数据 gt 保存数据 发送请求 解析数据 保存数据 数据可视化 先读取数据 泳衣商品性别占比 商品品牌分
  • Springmvc+mybatis+Dubbo+ZooKeeper+Redis+KafKa

    开发工具 1 Eclipse IDE 采用Maven项目管理 模块化 2 代码生成 通过界面方式简单配置 自动生成相应代码 目前包括三种生成方式 增删改查 单表 一对多 树结构 生成后的代码如果不需要注意美观程度 生成后即可用 技术选型 只
  • Androidstudio快捷操作之多选

    如图 想要批量复制属性名 不需要一个一个的复制 只需按住alt 鼠标左键从上往下拉 将光标定位在每个属性名的前面 再按ctrl w就可以选中所有光标后面的单词了
  • QT里使用sqlite的问题,好多坑

    1 我使用sqlite 开发机上好好的 测试机上却不行 后来发现是缺少驱动 Driver not loaded Driver not loaded 代码检查了又检查 发现应该是缺少dll文件 系统不提示 是自己使用 QMessageBox
  • c语言基础五子棋,十分的易懂理解,详细解释,容易上手

    前言 提示 经过b站和视频学习后编程 提示 以下是本篇文章正文内容 下面案例可供参考 文章目录 前言 五子棋 头文件 展示棋盘 display 下棋 PlayMove 主体函数 game 完整代码 五子棋 本篇博客主要写了关于c语言的五子棋
  • MySQL主从搭建-Centos实战

    目录 一 规划说明 二 主节点安装MySQL 1 下载MySQL和安装 2 启动Mysql 设置root密码 允许远程登录 三 副节点安装MySQL 参考主节点 四 主节点配置 1 配置my cnf 修改默认存储目录为指定目录 data 下
  • 解决SQL查询总是超时已过期

    解决SQL查询总是超时已过期 在WIN8里提示 OLE DB 或 ODBC 错误 查询超时已过期 HYT00 1 由于数据库设计问题造成SQL数据库新增数据时超时 症状 Microsoft OLE DB Provider for SQL S
  • web前端页面适配方法

    流式布局 就是百分比布局 非固定像素 内容向两侧填充 理解成流动的布局 称为流式布局 视觉窗口 viewport 是移动端特有 这是一个虚拟的区域 承载网页的 承载关系 浏览器 gt viewport gt 网页 适配要求 1 网页宽度必须
  • c++基础十一(跳转语句)

    跳转语句 1 break 2 continue 3 goto 1 break 作用 跳出循环结构和选择结构 1 switch语句中 用于终止case并跳出switch语句 2 在循环结构中 用于跳出当前循环 3 在嵌套循环语句中 跳出最近的
  • 企业微信 => 接入第三方vue应用 第三阶段:企业微信使用JSSDK

    目录 使用说明 官方文档不会告诉你的内容 都是会踩的坑 一 我采用的混入方法去使用这个官方SDK 二 可能会遇到的坑 前提 我们开发的是三方应用 不是内部应用 使用说明 所有的JS接口只能在企业微信应用的可信域名下调用 包括子域名 且可信域