客户端:https://blog.csdn.net/m0_37271466/article/details/86084690
开发工具:eclipse IDE 4.8.0
钉钉提供的服务端代码文件如下:我是先建立了一个Web Project,开始以为它需要tomcat服务器(灬ꈍ ꈍ灬),原来不需要
下面列出设计文件的代码
pom.xml 这个是jar包下载的配置文件
---------------------------------------
上图是配置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
private boolean success = false;
private String code;
private String message;
private T result;
private ServiceResult() {
}
public static
ServiceResult
item.success = true;
item.result = result;
item.code = "0";
item.message = "success";
return item;
}
public static
ServiceResult
item.success = false;
item.code = errorCode;
item.message = errorMessage;
return item;
}
public static
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
if(list != null) {
for(int i=0;i
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.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的添加在你的开发者后台--。。。。。