likes
comments
collection
share

专有钉钉对接集成

作者站长头像
站长
· 阅读数 19

PC端对接专有钉钉, 获取相关接口数据, 整理了一下自己实现的思路

一、开发准备

  1. 仔细阅读官方相关文档, 相关api如何调用, 接口方法调用示例, 错误的解决方法
  2. 下载官方sdk:zwdd-sdk-java-1.2.0.jar

二、jar包导入到本地项目

  1. 项目同级目录创建libs文件夹,把jar包放入其中

专有钉钉对接集成

  1. pom 文件配置,配置Jar包的dependency,包括groupId,artifactId,version三个属性,同时还要包含scope和systemPath属性,指定Jar包来源于本地文件。如下:
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>xxpt</artifactId>
    <version>1.2.0</version>
    <scope>system</scope>
    <!-- ${basedir}/lib/*.jar  basedir为项目根目录 -->
    <systemPath>${basedir}/libs/zwdd-sdk-java-1.2.0.jar</systemPath>
</dependency>

3.由于scope=system,打包时不会把本地jar包打进jar/war包中,所以需要通过插件进行打包

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.1.1.RELEASE</version>
    <configuration>
        <!--打包时允许添加本地jar包-->
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

二、application.yml文件配置

专有钉钉域名.AK.SK相关配置

# 第三方api地址
thirdapi:
    # 专有钉钉对接参数配置
    zydd:
        # 请求协议
        protocal: https
        # 域名
        domainName: xxx.xxxxx.xxx
        # 应用的key
        accessKey: xxxxxx
        # 应用的密钥
        secretKey: xxxxxxxx

三 、单列模式初始化

使用@Configuration来定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法可以被AnnotationConfigApplicationContext或者AnnotationConfigWebApplicationContext 进行扫描。用于构建bean定义以及初始化Spring容器。

package com.xxxx.xxx.core.config;

import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @className ThirdZyddApiConfig
 * @Description //第三方api
 * @author uudream
 * @date 2022-03-31 16:27
 */
@Configuration
public class ThirdZyddApiConfig {

    /** 专有钉钉-请求协议 */
    @Value("${thirdapi.zydd.protocal}")
    private String zyddProtocal;

    /** 专有钉钉-域名 */
    @Value("${thirdapi.zydd.domainName}")
    private String zyddDomainName;

    /** 专有钉钉-应用的key */
    @Value("${thirdapi.zydd.accessKey}")
    private String zyddAccessKey;

    /** 应用的密钥 */
    @Value("${thirdapi.zydd.secretKey}")
    private String zyddSecretKey;

    @Bean(name = "zyddExecutableClient")
    public ExecutableClient zyddExecutableClient(){
        //executableClient要单例,并且使用前要初始化,只需要初始化一次
        ExecutableClient executableClien = ExecutableClient.getInstance();
        executableClien.setDomainName(zyddDomainName);
        executableClien.setAccessKey(zyddAccessKey);
        executableClien.setSecretKey(zyddSecretKey);
        executableClien.setProtocal(zyddProtocal);
        executableClien.init();

        return executableClien;
    }


}

四、Spring工具类SpringContextUtils

通过实现ApplicationContextAware接口,来获取ApplicationContext,再通过applicationContext的方法来获取对应的Bean,以下是SpringContextUtils中常用的方法

package xxx.xxx.common.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

/**
 * @className SpringContextUtils
 * @Description //Spring工具类
 * @author uudream
 * @date 2022-03-31 15:23
 */
@Component
public class SpringContextUtils implements ApplicationContextAware {

    private static ConfigurableApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        applicationContext = (ConfigurableApplicationContext) context;
    }


    /**
     * 根据bean的名称获取bean
     */
    public static Object getBeanByName(String name){
        return applicationContext.getBean(name);
    }

    /**
     * 根据bean的class来查找对象
     */
    public static <T> T getBeanByClass(Class<T> clazz){
        return applicationContext.getBean(clazz);
    }

    /**
     * 取得存储在静态变量中的ApplicationContext.
     */
    public static ApplicationContext getApplicationContext() {
        checkApplicationContext();
        return applicationContext;
    }

    /**
     * 清除applicationContext静态变量.
     */
    public static void cleanApplicationContext() {
        applicationContext = null;
    }

    private static void checkApplicationContext() {
        if (applicationContext == null) {
            throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
        }
    }

    /**
     * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) {
        checkApplicationContext();
        return (T) applicationContext.getBean(name);
    }

    /**
     * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(Class<T> clazz) {
        checkApplicationContext();
        return (T) applicationContext.getBeansOfType(clazz);
    }
}

五、调用api获取数据

package com.xxxx.xxx.api.zydd;

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.xxpt.gateway.shared.api.request.OapiMoziEmployeeGetByMobileRequest;
import com.alibaba.xxpt.gateway.shared.api.request.OapiMoziFusionGetEmployeePropertiesRequest;
import com.alibaba.xxpt.gateway.shared.api.request.OapiMoziOrganizationPageOrganizationEmployeePositionsRequest;
import com.alibaba.xxpt.gateway.shared.api.response.OapiMoziEmployeeGetByMobileResponse;
import com.alibaba.xxpt.gateway.shared.api.response.OapiMoziFusionGetEmployeePropertiesResponse;
import com.alibaba.xxpt.gateway.shared.api.response.OapiMoziOrganizationPageOrganizationEmployeePositionsResponse;
import com.xxxxx.common.core.controller.BaseController;
import com.xxxxx.common.core.domain.AjaxResult;
import com.xxxxx.common.core.domain.entity.SysUser;
import com.xxxxx.common.core.page.PageDomain;
import com.xxxxx.common.core.page.TableDataInfo;
import com.xxxxx.common.core.page.TableSupport;
import com.xxxxx.system.service.ISysUserService;
import com.xxxxx.common.utils.SpringContextUtils;
import com.xxxxx.web.dto.ZyddData;
import com.xxxxx.web.dto.ZyddUserData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import com.alibaba.xxpt.gateway.shared.api.request.OapiAuthScopesV2Request;
import com.alibaba.xxpt.gateway.shared.api.response.OapiAuthScopesV2Response;
import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
import com.alibaba.xxpt.gateway.shared.client.http.IntelligentGetClient;

import java.util.List;

/**
 * @className ZyddClientController
 * @Description //专有钉钉对接
 * @author uudream
 * @date 2022-03-31 18:44
 */
@Controller
@RequestMapping("/zydd")
public class ZyddClientController extends BaseController {


    @Autowired
    private ISysUserService userService;

    private String prefix = "system/zydd";

    public static void main(String[] args) {
        ExecutableClient executableClient =ExecutableClient.getInstance();
        executableClient.setDomainName("xxxxxx");
        executableClient.setProtocal("https");

        executableClient.setAccessKey("xxxxxx");
        executableClient.setSecretKey("xxxxx");

        executableClient.init();

        IntelligentGetClient intelligentGetClient = executableClient.newIntelligentGetClient("/auth/scopesV2");
        OapiAuthScopesV2Request oapiAuthScopesV2Request = new OapiAuthScopesV2Request();
        //租户ID
        oapiAuthScopesV2Request.setTenantId(1L);
        //获取结果
        OapiAuthScopesV2Response apiResult = intelligentGetClient.get(oapiAuthScopesV2Request);
    }

    
    /**
     * 返回分页列表
     * @return
     */
    @GetMapping("/govEmployeePositions")
    public String govEmployeePositions()
    {
        return prefix + "/zyddUserList";
    }

    
    @RequestMapping("/getOrganizationEmployeePositions")
    @ResponseBody
    public TableDataInfo getOrganizationEmployeePositions(ModelMap modelMap){

        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();

        ExecutableClient executableClient = (ExecutableClient) SpringContextUtils.getBean("zyddExecutableClient");
        if (executableClient == null) {
            logger.error("未获取到初始化信息.....");
        }

        //executableClient保证单例
        IntelligentGetClient intelligentGetClient = executableClient.newIntelligentGetClient("/mozi/organization/pageOrganizationEmployeePositions");
        OapiMoziOrganizationPageOrganizationEmployeePositionsRequest oapiMoziOrganizationPageOrganizationEmployeePositionsRequest = new OapiMoziOrganizationPageOrganizationEmployeePositionsRequest();
        //是否请求总数,默认是false
        oapiMoziOrganizationPageOrganizationEmployeePositionsRequest.setReturnTotalSize(true);
        //分页大小,默认是20,最大100
        oapiMoziOrganizationPageOrganizationEmployeePositionsRequest.setPageSize(pageSize);
        //员工状态,A为有效,F为无效,默认是所有
        oapiMoziOrganizationPageOrganizationEmployeePositionsRequest.setEmployeeStatus("A");
        //组织code
        oapiMoziOrganizationPageOrganizationEmployeePositionsRequest.setOrganizationCode("xxxxxxxxxxxxx");
        //请求起始页,默认是1
        oapiMoziOrganizationPageOrganizationEmployeePositionsRequest.setPageNo(pageNum);
        //租户id
        oapiMoziOrganizationPageOrganizationEmployeePositionsRequest.setTenantId(1L);
        //获取结果
        OapiMoziOrganizationPageOrganizationEmployeePositionsResponse apiResult = intelligentGetClient.get(oapiMoziOrganizationPageOrganizationEmployeePositionsRequest);
        TableDataInfo rspData = new TableDataInfo();
        if ("0".equals(apiResult.getContent().getResponseCode())){
           // logger.info("获取返回人员信息:{}",apiResult.getContent().getData());
            //返回的json转成对象
            List<ZyddData> zyddResult = JSON.parseArray(apiResult.getContent().getData(), ZyddData.class);
            rspData.setCode(0);
            rspData.setRows(zyddResult);
            rspData.setPageNum(apiResult.getContent().getCurrentPage().intValue());
            rspData.setPageSize(apiResult.getContent().getPageSize().intValue());
            rspData.setTotal(apiResult.getContent().getTotalSize());
            //modelMap.addAttribute("userId",userId);
            return  rspData;
        }
        return rspData;
    }


    @GetMapping("/getEmployeeProperties")
    public AjaxResult getEmployeeProperties(){
        //executableClient保证单例
        ExecutableClient executableClient = (ExecutableClient) SpringContextUtils.getBean("zyddExecutableClient");
        if (executableClient == null) {
            logger.error("未获取到初始化信息.....");
        }
        IntelligentGetClient intelligentGetClient = executableClient.newIntelligentGetClient("/mozi/fusion/getEmployeeProperties");
        OapiMoziFusionGetEmployeePropertiesRequest oapiMoziFusionGetEmployeePropertiesRequest = new OapiMoziFusionGetEmployeePropertiesRequest();
        //租户id
        oapiMoziFusionGetEmployeePropertiesRequest.setTenantId(1L);
        //获取结果
        OapiMoziFusionGetEmployeePropertiesResponse apiResult = intelligentGetClient.get(oapiMoziFusionGetEmployeePropertiesRequest);
        logger.info("获取返回人员字段属性{}:",apiResult);
        return AjaxResult.success(apiResult);
    }

   


}