企业微信JSSDK之授权登陆

4,720 阅读1分钟

企业微信JSSDK和微信JSSDK一样,都要通过授权、签名等获取相关信息以及调用APIAPI,唯一不同的就是JSSDK有agentConfig, 调用wx.agentConfig之前,必须确保先成功调用wx.config

import { AuthLogin, configVerify, agentConfigVerify } from '../api/wechat'
import { getSearch } from "./CommonFun";
import { APP_ID } from "./OriginName";
import { WXsharing } from './WXapi'
import store from "../store";

//eslint-disable-next-line
/* global location */
/* eslint no-restricted-globals: ["off", "location"] */
// eslint-disable-next-line
const $wx = wx;

const wxwork_status = false ;//本地开发false 其他true
export const WXLogin = (self) => {
  //判断是否为pc端企业微信
  /**
   * 地址:http://ui.qywechat.test.gemii.cc:58080/#/work?code=W-jhtc5vpOVBnpILM-Hm_EJtDrEQaETgz5_k6Bar26I&state=STATE
   * safari:mozilla/5.0 (macintosh; intel mac os x 10_14_4) applewebkit/605.1.15 (khtml, like gecko) version/12.1 safari/605.1.15
   * chrome:mozilla/5.0 (macintosh; intel mac os x 10_14_4) applewebkit/537.36 (khtml, like gecko) chrome/80.0.3987.132 safari/537.36
   * 开发者工具:mozilla/5.0 (iphone; cpu iphone os 11_0 like mac os x) applewebkit/604.1.38 (khtml, like gecko) version/11.0 mobile/15a372 safari/604.1 wechatdevtools/1.02.1912261 micromessenger/7.0.4 language/zh_cn webview/15863409720343797 webdebugger port/37478
   */
  // ua.match(/windowswechat/i) == 'windowswechat'&&
  if (wxwork_status){
    var ua = window.navigator.userAgent.toLowerCase();
    if ('wxwork' == ua.match(/wxwork/i)) {
      VerifyLogin()
    } else {
      alert('请在企业微信中打开')
      var opened = window.open('about:blank', '_self');
      opened.opener = null;
      opened.close();
    }
  }else{
    VerifyLogin()
  } 
}

const VerifyLogin = ()=>{
  
  var search = getSearch();
  var code = search.code;

  if (!code) {
    var _baseEn = encodeURIComponent(window.location.href);
    var date = new Date().getTime();
    // alert("未授权");
    window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${APP_ID}&redirect_uri=${_baseEn}&response_type=code&scope=snsapi_privateinfo&state=${date}#wechat_redirect`;
  } else {
    // alert("已经授权");
    //企业微信登录:未登陆时需要根据cope值获取user_ticket,corpId,userId,等,才有权限调用config
    AuthLogin(code).then(res => {
      if (res.code == 100) {

        let user = res.data.user;
        store.dispatch('UserInfo', user)
        store.dispatch('UserInfo', user)
        store.dispatch('IsWxLogin', true)
        store.dispatch('Loading', true)

        //存储token
        let exp = new Date();
        exp.setTime(exp.getTime() + 1 * 60 * 60 * 1000)
        document.cookie = 'access_token' + "=" + escape(res.data.token) + ";expires=" + exp.toGMTString() + ";path=/";

        WXconfig();
      }else{
        console.log('AuthLogin fail');
      }
    })
  }
}


export const WXconfig = () => {

  let currentUrl = location.href.split('#')[0]
  let url = encodeURIComponent(currentUrl)
 

  configVerify(url).then(res => {
    
    //config信息验证
    $wx.config({
      beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
      debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
      appId: res.data.corpId, // 必填,企业微信的corpID
      timestamp: res.data.timestamp, // 必填,生成签名的时间戳
      nonceStr: res.data.noncestr, // 必填,生成签名的随机串
      signature: res.data.signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法
      jsApiList: [
        'checkJsApi',
        'onMenuShareAppMessage',
        // 'onMenuShareWechat',
        // 'onMenuShareTimeline',
        // 'shareAppMessage',
        // 'shareWechatMessage',
        // 'startRecord',
        // 'stopRecord',
        'chooseImage',
        'uploadImage',
        'previewImage',
        // 'downloadImage',
        'hideOptionMenu',
        // 'showOptionMenu',
        'hideMenuItems',
        'showMenuItems',
        'hideAllNonBaseMenuItem',
        // 'showAllNonBaseMenuItem',
        // 'closeWindow',
        // 'scanQRCode',
        'openEnterpriseChat',
        'selectEnterpriseContact',
        // 'onHistoryBack',
        // 'openDefaultBrowser', 
      ], // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来
      success: function (res) {
        console.log('config_success');
      }
    });



    //隐藏右上角菜单接口
    // $wx.hideOptionMenu();
    //批量显示功能按钮接口
   
    //批量隐藏功能按钮接口
    $wx.hideMenuItems({
      menuList: [
        "menuItem:share:timeline", //分享到微信朋友圈
        "menuItem:share:wechat",//分享到微信好友
        // "menuItem:copyUrl",
        // "menuItem:share:appMessage",
        "menuItem:share:qq",
        "menuItem:share:weiboApp",
        "menuItem:favorite",
        "menuItem:share:facebook",
        "menuItem:share:QZone",
        "menuItem:editTag",
        "menuItem:delete",
        "menuItem:originPage",
        "menuItem:readMode",
        "menuItem:openWithQQBrowser",
        "menuItem:share:email",
        "menuItem:share:brand"
      ] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮
    });



    $wx.ready(function () {
      // alert('ready')
      WXagentConfig();
      WXsharing()

      
    })

    $wx.error(function (res) {
      console.log('error', res);
      // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
    });
    
  }).catch(req => {
    console.log(req);

  })
}

export const WXagentConfig = () => {

  let currentUrl = location.href.split('#')[0]
  let url = encodeURIComponent(currentUrl);

  agentConfigVerify(url).then(res => {
    
    $wx.agentConfig({
      corpid: res.data.corpId, // 必填,企业微信的corpid,必须与当前登录的企业一致
      agentid: res.data.agentid, // 必填,企业微信的应用id (e.g. 1000247)
      timestamp: res.data.timestamp, // 必填,生成签名的时间戳
      nonceStr: res.data.noncestr, // 必填,生成签名的随机串
      signature: res.data.signature,// 必填,签名,见附录1
      jsApiList: [
        'selectExternalContact',//外部联系人选人接口
        'getCurExternalContact',//获取userId
        'openUserProfile',//打开个人信息页接口
        'sendChatMessage' //聊天工具栏分享消息到会话
      ],//打开个人信息页接口], //必填
      success: function (res) {
        // alert('success--2--agentConfig')
        console.log('agentConfig_success');
        // 回调

      },
      fail: function (res) {
        // if (res.data.errMsg.indexOf('function not exist') > -1) {
        //   alert('版本过低请升级')
        // }
      }
    });



    $wx.error(function (res) {
      console.log('error', res);
      // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
    });

  }).catch(req => {
    console.log(req);

  })
}