企业微信 => 接入第三方vue应用 第三阶段:企业微信使用JSSDK
2022-10-24 15:45:48
258
{{single.collect_count}}

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

使用说明

所有的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: '', // 必填,企业微信的corpIDtimestamp: , // 必填,生成签名的时间戳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

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}