钉钉E应用开发之JAVA DEMO服务端实测代码

客户端:https://blog.csdn.net/m0_37271466/article/details/86084690

开发工具:eclipse IDE 4.8.0

钉钉提供的服务端代码文件如下:我是先建立了一个Web Project,开始以为它需要tomcat服务器(灬ꈍ ꈍ灬),原来不需要

钉钉E应用开发之JAVA DEMO服务端实测代码_第1张图片

 

 

下面列出设计文件的代码

pom.xml 这个是jar包下载的配置文件

---------------------------------------

  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
  4.0.0
 
  group_id_web_test
 
  
  artifact_id_web_test
 
  0.0.1-SNAPSHOT
  
  war
  
  artifact_id_web_test Maven Webapp
  http://maven.apache.org
  
 
 
        org.springframework.boot
        spring-boot-starter-parent
        1.4.2.RELEASE
        
    

    
    
        UTF-8
        1.8

        com.Application
    
  
  
  
 
  
          
          
            org.springframework.boot
            spring-boot-starter
        

        
          
            org.springframework.boot
            spring-boot-starter-test
            test
        

          
            org.springframework.boot
            spring-boot-starter-web
        

  
          
            org.springframework.boot
            spring-boot-devtools
            true
        

  
   
      junit
      junit
      3.8.1
      test
   

   
   
        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        

        
            org.apache.httpcomponents
            httpclient
            4.5.1
        

        
            org.apache.httpcomponents
            httpcore
            4.4.4
        

        
            org.apache.httpcomponents
            httpmime
            4.3.5
        

        
            commons-io
            commons-io
            2.4
        

        
        
    
        
            com.taobao.top
            top-api-sdk-dev
            ding-open-mc-SNAPSHOT
            system
            ${pom.basedir}/lib/top-api-sdk-dev-ding-open-mc-20180719.091043-1.jar
        

        
            com.taobao.top
            lippi-oapi-encrpt
            dingtalk-SNAPSHOT
            system
            ${pom.basedir}/lib/lippi-oapi-encrpt.jar
        

        
            com.alibaba
            fastjson
            1.2.6
        

        
   
    
   
     org.springframework.boot
     spring-boot-starter-tomcat
     provided
 
    
 

  
  
 
  
 
          
  
  
              
                org.springframework.boot
                spring-boot-maven-plugin
                
                
                    true
                

            

          

         
     
      compile
      
      
      
    artifact_id_web_test
    
     
    ${basedir}/target  
       
    ${basedir}\src\main\java  
    
    
 

  
  

钉钉E应用开发之JAVA DEMO服务端实测代码_第2张图片

钉钉E应用开发之JAVA DEMO服务端实测代码_第3张图片

上图是配置pom.xml文件自动下载的jar包,直接修改保存pom.xml文件,就可以自动修正要下载的jar包

 

 


============================================

Application.java

--------------------------------------

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

/**
 * 启动入口
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
    public static void main(String[] args) {
        System.out.println("spring启动,开车。。。。。。");
        SpringApplication.run(Application.class, args);
    }
}
=========================================

ServiceResult.java

-------------------------------------------

package com.util;

import java.io.Serializable;

/**
 *service层返回对象列表封装
 * @param
 */
public class ServiceResult  implements Serializable{

    private boolean success = false;

    private String code;

    private String message;

    private T result;

    private ServiceResult() {
    }

    public static ServiceResult success(T result) {
        ServiceResult item = new ServiceResult();
        item.success = true;
        item.result = result;
        item.code = "0";
        item.message = "success";
        return item;
    }

    public static ServiceResult failure(String errorCode, String errorMessage) {
        ServiceResult item = new ServiceResult();
        item.success = false;
        item.code = errorCode;
        item.message = errorMessage;
        return item;
    }

    public static ServiceResult failure(String errorCode) {
        ServiceResult item = new ServiceResult();
        item.success = false;
        item.code = errorCode;
        item.message = "failure";
        return item;
    }

    public boolean hasResult() {
        return result != null;
    }

    public boolean isSuccess() {
        return success;
    }

    public T getResult() {
        return result;
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

}
===========================================

LogFormatter.java

--------------------------------------------------------------------

package com.util;


public class LogFormatter {

    private static boolean isEmpty(Object str) {
        return (str == null || "".equals(str));
    }


    public static String getKVLogData(LogEvent logEvent, KeyValue... args) {
        return getKVLogData(logEvent, null, null, null, args);
    }

    public static String getKVLogData(LogEvent logEvent, String message, KeyValue... args) {
        return getKVLogData(logEvent, message, null, null, args);
    }

    public static String getKVLogData(LogEvent logEvent, String message, String errCode, String errMsg,
                                      KeyValue... args) {
        StringBuilder logData = new StringBuilder();
        logData.append("logEvent:");
        logData.append(logEvent == null ? "" : logEvent.getValue());

        if (!isEmpty(message)) {
            logData.append("\t");
            logData.append("msg:");
            logData.append(message);
        }
        if (!isEmpty(errCode)) {
            logData.append("\t");
            logData.append("errCode:");
            logData.append(errCode);
        }
        if (!isEmpty(errMsg)) {
            logData.append("\t");
            logData.append("errMsg:");
            logData.append(errMsg);
        }
        if (args.length > 0) {
            for (int i = 0; i < args.length; i++) {
                KeyValue keyValue = args[i];
                if (keyValue != null) {
                    logData.append("\t");
                    logData.append(keyValue.getKey());
                    logData.append(":");
                    logData.append(keyValue.getValue());
                }
            }
        }

        return logData.toString();
    }

    public static enum LogEvent {
        START("开始"), END("结束");

        private String value;

        private LogEvent(String value){
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }

    public static class KeyValue {

        private String key;
        private Object value;

        public String getKey() {
            return key;
        }

        public String getValue() {
            return String.valueOf(value);
        }

        private KeyValue(String key, Object value){
            super();
            this.key = key;
            this.value = value;
        }

        public static KeyValue getNew(String key, Object value) {
            return new KeyValue(key, value);
        }
    }
}
=================================

AccessTokenUtil.java

-------------------------------------------

package com.util;

import com.config.Constant;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.taobao.api.ApiException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static com.config.URLConstant.URL_GET_TOKKEN;

/**
 * 获取access_token工具类
 */
public class AccessTokenUtil {
    private static final Logger bizLogger = LoggerFactory.getLogger(AccessTokenUtil.class);

    public static String getToken() throws RuntimeException {
        try {
            DefaultDingTalkClient client = new DefaultDingTalkClient(URL_GET_TOKKEN);
            OapiGettokenRequest request = new OapiGettokenRequest();

            request.setAppkey(Constant.APP_KEY);
            request.setAppsecret(Constant.APP_SECRET);
            request.setHttpMethod("GET");
            OapiGettokenResponse response = client.execute(request);
            String accessToken = response.getAccessToken();
            return accessToken;
        } catch (ApiException e) {
            bizLogger.error("getAccessToken failed", e);
            throw new RuntimeException();
        }

    }

    public static void main(String[] args)throws ApiException{
        String accessToken = AccessTokenUtil.getToken();
        System.out.println(accessToken);
    }
}
=====================================

package com.controller;

import com.config.URLConstant;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiUserGetRequest;
import com.dingtalk.api.request.OapiUserGetuserinfoRequest;
import com.dingtalk.api.response.OapiUserGetResponse;
import com.dingtalk.api.response.OapiUserGetuserinfoResponse;
import com.taobao.api.ApiException;
import com.util.AccessTokenUtil;
import com.util.ServiceResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 企业内部E应用Quick-Start示例代码 实现了最简单的免密登录(免登)功能
 */
@RestController
public class IndexController {
    private static final Logger bizLogger = LoggerFactory.getLogger(IndexController.class);

    /**
     * 欢迎页面,通过url访问,判断后端服务是否启动
     */
    @RequestMapping(value = "/welcome", method = RequestMethod.GET)
    public String welcome() {
        return "welcome";
    }

 


    
    /**
     * https://open-doc.dingtalk.com/microapp/serverapi2/ege851帮助文档地址
     * 获取部门下用户列表
     */
    @RequestMapping(value = "/department_users",method = RequestMethod.POST)
    @ResponseBody
    public ServiceResult getDepartmentUsers() {
        String accessToken = AccessTokenUtil.getToken();
    
        DingTalkClient client = new DefaultDingTalkClient(URLConstant.URL_DEPARTMENT_USER_LIST);
        OapiUserSimplelistRequest request = new OapiUserSimplelistRequest();
        request.setDepartmentId(1L);//部门id ,目前写固定值,根据需要些对应部门id
        request.setOffset(0L);//支持分页查询,与size参数同时设置时才生效,此参数代表偏移量
        request.setSize(10L);//支持分页查询,与offset参数同时设置时才生效,此参数代表分页大小,最大100
        request.setHttpMethod("GET");
        OapiUserSimplelistResponse response = null;
        
        try {
            response = client.execute(request, accessToken);
        } catch (ApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
        System.out.println("getBody?"+response.getBody());
        
        ServiceResult serviceResult = ServiceResult.success(response.getBody());
        return serviceResult;
    }
    
    /**
     * 获取所有部门列表(包括公司名称和下面的所有部门)
     */
    
    @RequestMapping(value = "/department_list",method = RequestMethod.POST)
    @ResponseBody
    public ServiceResult getDepartIds(@RequestParam(value = "authCode") String requestAuthCode) {
        String accessToken = AccessTokenUtil.getToken();//token值
        DingTalkClient client = new DefaultDingTalkClient(URLConstant.URL_DEPARTMENT_LIST);//部门
        OapiDepartmentListRequest request = new OapiDepartmentListRequest();
        request.setId("");//id设置为空字符串,可以返回包括单位名称在内的所有部门信息
        request.setHttpMethod("GET");
        OapiDepartmentListResponse response =  null;
        try {
            response = client.execute(request, accessToken);
        } catch (ApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        List list = response.getDepartment();//以列表对象List的形式返回
        if(list != null) {
            for(int i=0;i                 System.out.println("\n部门id:"+list.get(i).getId());
                System.out.println("部门名称:"+list.get(i).getName());

            }
        }
        ServiceResult serviceResult = ServiceResult.success(list);
        return serviceResult;
    }

 

 

 

 

 

 

 

 

 

 

    /**
     * 钉钉用户登录,显示当前登录用户的userId和名称
     *
     * @param requestAuthCode 免登临时code
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public ServiceResult login(@RequestParam(value = "authCode") String requestAuthCode) {
        //获取accessToken,注意正是代码要有异常流处理
        String accessToken = AccessTokenUtil.getToken();

        //获取用户信息
        DingTalkClient client = new DefaultDingTalkClient(URLConstant.URL_GET_USER_INFO);
        OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
        request.setCode(requestAuthCode);
        request.setHttpMethod("GET");

        OapiUserGetuserinfoResponse response;
        try {
            response = client.execute(request, accessToken);
        } catch (ApiException e) {
            e.printStackTrace();
            return null;
        }
        //3.查询得到当前用户的userId
        // 获得到userId之后应用应该处理应用自身的登录会话管理(session),避免后续的业务交互(前端到应用服务端)每次都要重新获取用户身份,提升用户体验
        String userId = response.getUserid();

        String userName = getUserName(accessToken, userId);
        System.out.println(userName);
        //返回结果
        Map resultMap = new HashMap<>();
        resultMap.put("userId", userId);
        resultMap.put("userName", userName);
        ServiceResult serviceResult = ServiceResult.success(resultMap);
        return serviceResult;
    }

    /**
     * 获取用户姓名
     *
     * @param accessToken
     * @param userId
     * @return
     */
    private String getUserName(String accessToken, String userId) {
        try {
            DingTalkClient client = new DefaultDingTalkClient(URLConstant.URL_USER_GET);
            OapiUserGetRequest request = new OapiUserGetRequest();
            request.setUserid(userId);
            request.setHttpMethod("GET");
            OapiUserGetResponse response = client.execute(request, accessToken);
            return response.getName();
        } catch (ApiException e) {
            e.printStackTrace();
            return null;
        }
    }

}


=============================================

package com.config;

public class URLConstant {
    /**
     * 钉钉网关gettoken地址
     */
    public static final String URL_GET_TOKKEN = "https://oapi.dingtalk.com/gettoken";

    /**
     *获取用户在企业内userId的接口URL
     */
    public static final String URL_GET_USER_INFO = "https://oapi.dingtalk.com/user/getuserinfo";

    /**
     *获取用户姓名的接口url
     */
    public static final String URL_USER_GET = "https://oapi.dingtalk.com/user/get";
}
====================================================

package com.config;

/**
 * 项目中的常量定义类
 */
public class Constant {
    /**
     * 开发者后台->企业自建应用->选择您创建的E应用->查看->AppKey
     */
    public static final String APP_KEY = "你的自建应用APP的key";//对应app的key,这个对应的是javaclient这个应用的key
    /**
     * 开发者后台->企业自建应用->选择您创建的E应用->查看->AppSecret
     */
    public static final String APP_SECRET="你的自建应用APP的SECRET";
}
=======================================================

 

最后注意,在客户端和服务端都启动测试的时候,可能出现获取不到用户信息的

情况,请注意可能是

 

https://oapi.dingtalk.com/user/getuserinfo^_^access_token=你的token码&code=你的code码^_^{"errmsg":"璁块棶ip涓嶅湪鐧藉悕鍗曚箣涓(这里是报错信息,目前显示乱码o(* ̄︶ ̄*)o)?,request ip=你的报错代码显示的ip地址","errcode":60020}
null

呃因为这个你的报错代码显示的ip地址没有在白名单所以获得为null 

白名单ip的添加在你的开发者后台--。。。。。
 

你可能感兴趣的:(钉钉,java,eclipse)