vue中使用WX-JSSDK的两种方法

公司最近有微信公众号的需求,那么微信登录授权和如何使用WX-JSSDk实现分享等等肯定是最头疼的问题。本人也是第一次开发微信公众号,在网上看了很多篇博客,最终选定了两种方法,并且亲测有效。

一、通过全局,在router.afterEach中定义

1.首先通过yarn add weixin-js-sdk/ npm i weixin-js-sdk
2.将微信jsdk挂载到全局上
在utils目录下新建WechatPlugin.js
WechatPlugin.js

import wx from 'weixin-js-sdk'

const plugin = {
  install(Vue) {
    Vue.prototype.$wechat = wx
    Vue.wechat = wx
  },
  $wechat: wx
}

export default plugin
export const install = plugin.install

main.js中

import WechatPlugin from './utils/WechatPlugin'
// 全局注册微信jsdk
Vue.use(WechatPlugin)

3.router.afterEach中

import wechatUtil from '@/utils/wechatUtil' // 在此文件中定义微信的一些方法
router.afterEach((to, from) => {
 let path = to.fullPath.slice(1) // 去除'/'
    let url
    const jsApiList = [
      'onMenuShareAppMessage',
      'onMenuShareTimeline',
      'chooseWXPay',
      'showOptionMenu',
      "updateAppMessageShareData",
      "hideMenuItems",
      "showMenuItems"
    ]

    if (!sessionStorage.getItem('initLink')) {
      // 解决ios微信下,分享签名不成功的问题,将第一次的进入的url缓存起来。
      sessionStorage.setItem('initLink', document.URL)
    }
    if (!!window.__wxjs_is_wkwebview) {
      // ios
      url = sessionStorage.getItem('initLink')
      wechatUtil.setWeChatConfig(url, jsApiList)
    } else {
      // 安卓
      url = location.origin + process.env.BASE_URL + path
      // setTimeout(() => {
      wechatUtil.setWeChatConfig(url, jsApiList)
      // }, 0)
    }
})
 

3.wechatUtil.js中

import Vue from 'vue'
export default {
  appid: process.env.VUE_APP_WECHAT_APPID, // 可以在根据不同环境配置appid
  setWeChatConfig(url, jsApiList) {
    getSignature(decodeURIComponent(url)) // getSignature需要你自己跟后端约定请求签名时的接口
      .then(data => {
        Vue.wechat.config({
          debug: false,
          signature: data.signature,
          nonceStr: data.nonceStr,
          timestamp: data.timestamp,
          appId: data.appId,
          jsApiList
        })
      })
      .catch(err => {
        console.log(err)
      })
  }
 }

上面方法虽然全局可以使用,但是会遇到一个问题,在单个页面调用微信jsddk中的updateAppMessageShareData方法或者其他方法时,有时成功有时失败,这可能是微信jsdk异步的问题,因此,需要你在单个页面中使用的时候加上setTimeout(()=>{ “这里调取微信的接口” },500)。

下面的第二种方法我觉得是最方便也是最自定义能力最好的,在需要的页面的调取。

二、方法二通过new promise封装成统一的入口,在单个页面中调用

我们还是要在router.afterEach中将进入的url记录下来,我是放在vuex或者pinia上的(这里要特别注意苹果手机和安卓手机的区别,这里我就不多做讲解,原因是苹果浏览器中的url是第一次进来的url)
1.在router.afterEach中

import store from '@/store'
router.afterEach((to, from) => {
 	const url = window.location.href
 	  // ios手机环境 并且是非开发者工具
	  if (isIOS() && !isWechaTool()) {
	    if (!store.state.page.initLink)  store.commit('page/setInitLink', url)
	  } else {
	     store.commit('page/setInitLink', url)
	  }
   
})

2.在store/page.js中

const state = {
  initLink: ''
}
const mutations = {
 setInitLink (state, initLink) {
    state.initLink = initLink
  }
}

export default {
  namespaced: true,
  state,
  mutations
}

3.在utils/wechatUtil.js定义初始化方法

import wx from 'weixin-js-sdk'
import store from '@/store'

export default {
  // 判断是否是微信
  isWechat() {
    const ua: any = window.navigator.userAgent.toLowerCase()
    const matchStr = ua.match(/micromessenger/i)
    if (matchStr && matchStr.includes('micromessenger')) return true
    return false
  },
  /* 初始化wxjsdk各种接口 */
  init(apiList = [], url) {
 	apiList = apiList ?? [
      'checkJsApi',
      'updateAppMessageShareData',
      // 'onMenuShareAppMessage',
      // 'onMenuShareTimeline',
      'updateTimelineShareData',
    ]
    //需要使用的api列表
    return new Promise((resolve, reject) => {
      getSignature(store.state.page.initLink).then(res => {
        if (res.appId) {
          wx.config({
             debug: route.query.debug === '1' ? true : false, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。
            appId: res.appId,
            timestamp: res.timestamp, 
            nonceStr: res.nonceStr, 
            signature: res.signature,
            jsApiList: apiList
          })
          wx.ready(res => {
            // 微信SDK准备就绪后执行的回调。
            resolve(wx, res)
          })
        } else {
          reject(res)
        }
      })
    })
  },
  // 分享方法
  async share(params: IShare) {
    if (!this.isWechat()) return
    await this.init()
    console.log('======进来了updateAppMessageShareData=====')
    //分享给朋友及分享到QQ
    wx.updateAppMessageShareData(params)
    //分享到朋友圈及分享到QQ空间
    wx.updateTimelineShareData(params)
  },
   // 微信支付
  wxPay() {
    if (!this.isWechat()) return
    return new Promise(async (resolve, reject) => {
      let payParams: any
      try {
        await this.init(['checkJsApi', 'chooseWXPay'])
        payParams = await getWxpay()
      } catch (error) {
        reject(error)
      }
      wx.chooseWXPay({
        timestamp: payParams.timestamp, // 支付签名时间戳,注意微信 jssdk 中的所有使用 timestamp 字段均为小写。但最新版的支付后台生成签名使用的 timeStamp 字段名需大写其中的 S 字符
        nonceStr: payParams.timestamp, // 支付签名随机串,不长于 32 位
        package: payParams.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
        signType: payParams.signType, // 微信支付V3的传入 RSA ,微信支付V2的传入格式与V2统一下单的签名格式保持一致
        paySign: payParams.paySign, // 支付签名
        success(res: any) {
          if (res.errMsg == 'chooseWXPay:ok') {
            resolve(res)
          }
        },
        fail(res: any) {
          //失败后的操作
          reject(res)
        },
      })
    })
  },
}

4.在页面中的使用

import wechatUtil from '@/utils/wechatUtil'
mounted() {
  wechat.share({
    title: '鲲43214321',
    desc: '12432',
    link: 'https://www.baidu.com',
    imgUrl: 'https://xxxx.jpg',
  })
}

总结:最后我个人推荐第二种方法,第一种方法虽然很方便,但是每次路由跳转都调取了微信获取签名初始化的方法,而且自定义的扩展性不是很强,而且还会有微信接口异步的问题,需要用到微信中的debu:true调试。第二种方法使用和定义起来比较简单。

<think>好的,我现在要帮用户解决关于企业微信SDK在前端集成的问题。用户提到他们需要使用方法、示例和文档,所以我得先整理相关的信息。 首先,我需要回忆之前提供的引用内容。引用[2]提到了微信小程序SDK集成,其中提到client_id的生成方式,这可能与企业微信SDK有类似之处。引用[3]则讨论了在企业微信聊天工具栏中集成Vue项目,并提到了调试工具的安装步骤,这部分信息应该对用户有帮助。 接下来,我应该分步骤说明企业微信SDK的前端集成方法。第一步通常是安装SDK,用户可能通过npm或者script标签引入,需要给出两种方式的示例代码。比如,npm安装的话,使用`npm install wecom-jssdk`,然后引入;或者直接通过script标签引入CDN链接。这样用户可以根据项目情况选择合适的方式。 然后,初始化配置是关键步骤。需要配置agentId、corpId等参数,这些信息需要用户从企业微信后台获取。这里要提醒用户替换成自己的实际参数,并说明如何获取这些信息,可能需要引导他们到企业微信的管理后台查找。 接下来是鉴权流程。需要后端接口获取签名信息,这部分前端需要调用后端的API,拿到返回的签名后再进行配置。这里要强调前端不能自己生成签名,必须通过后端接口获取,以确保安全性。 调用API的部分,比如分享功能、扫描二维码等,需要给出具体的代码示例。例如,使用wx.agentConfig进行配置,然后调用wx.invoke方法执行分享。同时,要提醒用户处理成功和失败的回调,以及错误处理的重要性。 调试工具的准备也是重要的一环。引用[3]提到了企业微信的调试工具安装方法,需要指导用户下载devtools_resources.pak文件并放置到指定目录,这样才能启用调试模式。用户可能在这一步遇到问题,所以需要详细说明步骤。 另外,兼容性问题和常见错误处理也是用户可能关心的。比如,iOS和Android的差异,或者签名错误、网络问题等,需要列出常见错误及解决方法,帮助用户快速排查问题。 最后,相关问题的部分需要考虑用户可能进一步的需求,比如如何获取corpId和agentId,如何处理鉴权失败,以及企业微信和小程序SDK的区别。这些问题可以作为扩展,帮助用户更全面地理解集成过程。 整个过程中,需要确保使用正确的中文表达,避免技术术语使用不当,同时保持步骤清晰,示例代码准确。另外,引用来源要正确标注,比如引用[2]和引用[3]的相关内容,确保信息的可靠性。</think>### 企业微信 SDK 前端集成方法与示例 #### 一、SDK 基础集成步骤 1. **安装或引入 SDK** - 通过 npm 安装(适用于 Vue/React 等框架项目): ```bash npm install wecom-jssdk --save ``` - 通过 script 标签引入(适用于传统 HTML 页面): ```html <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> ``` 2. **初始化配置** 在页面中配置企业微信 SDK 参数,需从企业微信后台获取以下信息: ```javascript wx.config({ beta: true, // 启用企业微信新特性 debug: false, // 调试模式(生产环境关闭) appId: '企业应用的corpId', // 替换为企业微信后台的 corpId timestamp: '生成签名的时间戳', // 由后端生成 nonceStr: '生成签名的随机串', // 由后端生成 signature: '签名', // 由后端计算 jsApiList: ['企业微信开放接口列表'], // 如 ['scanQRCode', 'getLocation'] }); ``` **注意**:签名需后端通过 `corpId` 和 `secret` 生成[^2]。 #### 二、鉴权与 API 调用示例 1. **鉴权流程** 调用后端接口获取签名信息(伪代码): ```javascript async function initWeComSDK() { const { signature, timestamp, nonceStr } = await axios.get('/api/get-signature'); wx.config({ // 填入后端返回的签名参数 }); } ``` 2. **调用 API 示例** **场景:分享到会话** ```javascript wx.ready(() => { wx.invoke('shareWechatMessage', { title: '标题', desc: '描述', link: 'https://example.com', imgUrl: 'https://example.com/logo.png', }, function(res) { if (res.err_msg === 'shareWechatMessage:ok') { console.log('分享成功'); } }); }); ``` #### 三、调试工具配置(关键步骤) 1. 下载企业微信调试工具 `devtools_resources.pak`[^3] 2. 将文件放入企业微信安装目录(如 `C:\Program Files\WXWork`) 3. 重启企业微信客户端,按 `Ctrl+Alt+Shift+D` 打开调试模式 #### 四、注意事项与兼容性 1. **环境要求** - 仅在企业微信客户端内生效(外部浏览器不支持) - iOS/Android 部分 API 权限需单独申请 2. **常见错误处理** - **签名无效**:检查后端生成签名的 `corpId` 和 `secret` 是否匹配 - **API 调用失败**:确认 `jsApiList` 中已声明该接口 - **网络问题**:确保页面域名已加入企业微信可信域名列表 --- §§ 相关问题 §§ 1. 如何获取企业微信应用的 `corpId` 和 `agentId`? 2. 企业微信 SDK 鉴权失败常见原因有哪些? 3. 企业微信 SDK 和小程序 SDK 在调用方式上有何区别? --- [^1]: 微信支付类型说明(JSAPI/H5 支付场景) : 企业微信 SDK 自动生成 `client_id` 机制 [^3]: 企业微信调试工具安装指南
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值