Maven依赖:
<dependency><groupId>com.dingtalk.open</groupId><artifactId>app-stream-client</artifactId><version>1.3.6</version></dependency>
配置类:
package com.gkl.attendance.config;import com.dingtalk.open.app.api.GenericEventListener;
import com.dingtalk.open.app.api.OpenDingTalkClient;
import com.dingtalk.open.app.api.OpenDingTalkStreamClientBuilder;
import com.dingtalk.open.app.api.security.AuthClientCredential;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
public class DingTalkStreamConfig {@Value("${dingtalk.appKey}")private String appKey;@Value("${dingtalk.appSecret}")private String appSecret;@Bean(destroyMethod = "stop")public OpenDingTalkClient dingTalkStreamClient(GenericEventListener eventListener) throws Exception {try {OpenDingTalkClient client = OpenDingTalkStreamClientBuilder.custom().credential(new AuthClientCredential(appKey, appSecret)).registerAllEventListener(eventListener).build();client.start();log.info("钉钉 Stream 客户端启动成功...");return client;} catch (Exception e) {log.error("钉钉 Stream 客户端启动失败", e);throw e;}}
}
监听器
package com.gkl.attendance.listener;import com.dingtalk.open.app.api.GenericEventListener;
import com.dingtalk.open.app.api.message.GenericOpenDingTalkEvent;
import com.dingtalk.open.app.stream.protocol.event.EventAckStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import shade.com.alibaba.fastjson2.JSONObject;
@Slf4j
@Component
public class DingTalkEventListener implements GenericEventListener {@Overridepublic EventAckStatus onEvent(GenericOpenDingTalkEvent event) {try {String eventId = event.getEventId();String eventType = event.getEventType();Long bornTime = event.getEventBornTime();JSONObject bizData = event.getData();log.info("接收到钉钉事件: eventId={}, type={}, bornTime={}, data={}",eventId, eventType, bornTime, bizData.toJSONString());switch (eventType) {case "attendance_check_record":log.info("处理考勤事件...");break;case "user_add_org":log.info("处理新成员加入事件...");break;default:log.info("未处理的事件类型: {}", eventType);break;}return EventAckStatus.SUCCESS;} catch (Exception e) {log.error("处理钉钉事件失败", e);return EventAckStatus.LATER;}}
}